Feature Tip: Add private address tag to any address under My Name Tag !
NFT
Overview
TokenID
8810
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LandProxy
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-13 */ /** *Submitted for verification at BscScan.com on 2022-10-11 */ // File: contracts/IERC1538.sol pragma solidity ^0.8.14; /// @title ERC1538 Transparent Contract Standard /// @dev Required interface /// Note: the ERC-165 identifier for this interface is 0x61455567 interface IERC1538 { /// @dev This emits when one or a set of functions are updated in a transparent contract. /// The message string should give a short description of the change and why /// the change was made. event CommitMessage(string message); /// @dev This emits for each function that is updated in a transparent contract. /// functionId is the bytes4 of the keccak256 of the function signature. /// oldDelegate is the delegate contract address of the old delegate contract if /// the function is being replaced or removed. /// oldDelegate is the zero value address(0) if a function is being added for the /// first time. /// newDelegate is the delegate contract address of the new delegate contract if /// the function is being added for the first time or if the function is being /// replaced. /// newDelegate is the zero value address(0) if the function is being removed. event FunctionUpdate(bytes4 indexed functionId, address indexed oldDelegate, address indexed newDelegate, string functionSignature); /// @notice Updates functions in a transparent contract. /// @dev If the value of _delegate is zero then the functions specified /// in _functionSignatures are removed. /// If the value of _delegate is a delegate contract address then the functions /// specified in _functionSignatures will be delegated to that address. /// @param _delegate The address of a delegate contract to delegate to or zero /// to remove functions. /// @param _functionSignatures A list of function signatures listed one after the other /// @param _commitMessage A short description of the change and why it is made /// This message is passed to the CommitMessage event. function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) external; } // File: contracts/ProxyBaseStorage.sol pragma solidity ^0.8.14; contract ProxyBaseStorage { //////////////////////////////////////////// VARS ///////////////////////////////////////////// // maps functions to the delegate contracts that execute the functions. // funcId => delegate contract mapping(bytes4 => address) public delegates; // array of function signatures supported by the contract. bytes[] public funcSignatures; // maps each function signature to its position in the funcSignatures array. // signature => index+1 mapping(bytes => uint256) internal funcSignatureToIndex; // proxy address of itself, can be used for cross-delegate calls but also safety checking. address proxy; /////////////////////////////////////////////////////////////////////////////////////////////// } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction 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/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: contracts/ERC721A.sol pragma solidity ^0.8.14; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) internal _addressData; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; mapping(uint256 => uint256) public _nftLockup; mapping(address => bool) public isTransferAllowed; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } modifier onlyTransferAllowed(address from) { require(isTransferAllowed[from],"ERC721: transfer not allowed"); _; } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) onlyTransferAllowed(to) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) onlyTransferAllowed(operator) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal returns(uint256, uint256) { return _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal returns(uint256, uint256) { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { // emit MintWithTokenURI(address(this), updatedIndex, to, ""); emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); return(startTokenId,_currentIndex-1); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { // emit MintWithTokenURI(address(this), updatedIndex, to, ""); emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } //erc721A transfer functions function transferFrom( address from, address to, uint256 tokenId ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual { require(_nftLockup[tokenId] <= block.timestamp || _nftLockup[tokenId] == 0 , "XanaLand: NFT lockup not expired yet"); _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) onlyTransferAllowed(msg.sender) internal { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transferAdmin( address from, address to, uint256 tokenId ) internal { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} event MintWithTokenURI(address indexed collection, uint256 indexed tokenId, address minter, string tokenURI); } // File: contracts/ERC721AQueryable.sol pragma solidity ^0.8.4; error InvalidQueryRange(); /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _currentIndex) { return ownership; } ownership = _ownerships[tokenId]; if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory) { unchecked { if (start > stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _currentIndex + 1; // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, _currentIndex)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx <= tokenIdsLength; ++i) { ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/Storage.sol pragma solidity ^0.8.14; abstract contract Storage { string public baseURI; // settings struct whitelist{ uint256 startTime; uint256 endTime; uint256 supply; uint256 sold; bytes32 root; } mapping(uint256 => whitelist) public whitelistRoot; mapping(uint256 => mapping(string => bool)) public isWhitelistFor; uint256 public maxMint = 0; uint256 public status = 0; struct rate { uint256 cost; uint256 total; uint256 sold; bool valid; } mapping (uint256 => mapping (string => rate)) public rates; uint256 public discount; uint256 public perTransactionLimit; mapping(uint256 => mapping(address => uint256)) public _userBought; event _mintCommon(address userAddress, string rarity, uint size,uint256 start, uint256 end, uint amount, uint price, bool isDiscount); event _mintLand(address userAddress, string rarity, uint size, uint256 start, uint256 end, uint amount, uint price, bool isDiscount); //modifiers modifier checkSupply(uint256 _mintAmount, uint256 _size, string memory rarity) { uint256 s = rates[_size][rarity].sold; //Check Validity of land as per size require(rates[_size][rarity].valid, "XanaLand: Plot size not valid" ); //To check if contract has started sale on not require(status != 0, "XanaLand: Sale not started yet." ); require(_mintAmount > 0, "XanaLand: Amount is Zero" ); require(_mintAmount <= maxMint, "XanaLand: Amount exceeded in params" ); require(s + _mintAmount <= rates[_size][rarity].total, "XanaLand: Max Limit Reached for Common" ); require(_mintAmount <= perTransactionLimit, "XanaLand: Per transaction limit exceed" ); delete s; _; } } // File: contracts/LandProxy.sol pragma solidity ^0.8.14; contract LandProxy is ProxyBaseStorage, IERC1538, ERC721AQueryable, Ownable, ReentrancyGuard, Storage { using Strings for uint256; constructor( string memory _name, string memory _symbol, address implementation )ERC721A(_name, _symbol) { proxy = address(this); maxMint = 10000; //Adding ERC1538 updateContract function bytes memory signature = "updateContract(address,string,string)"; constructorRegisterFunction(signature, proxy); bytes memory setBaseURISig = "setBaseURI(string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "mintLand(string,uint256,uint256,bytes32[],bool,uint256)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "isWhitelisted(address,bytes32[],uint256,uint256,string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setRate(uint256,uint256,uint256,string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setSaleStatus(uint256)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "calculateDiscount(uint256,string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "mintDiscountCommon(uint256,bytes32[])"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "freeMint(uint256,bytes32[])"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setWhitelistRoot(bytes32,uint256,uint256,uint256,uint256,string[])"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "removeWhiteList(uint256,string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setMaxMintAmount(uint256)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setDiscount(uint256)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setPerTransactionLimit(uint256)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setLockUp(uint256[],uint256[])"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "withdraw()"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "mintAdmin(address,uint256,uint256,string)"; constructorRegisterFunction(setBaseURISig, implementation); setBaseURISig = "setTransferAllowed(address,bool)"; constructorRegisterFunction(setBaseURISig, implementation); } function constructorRegisterFunction(bytes memory signature, address proxy) internal { bytes4 funcId = bytes4(keccak256(signature)); delegates[funcId] = proxy; funcSignatures.push(signature); funcSignatureToIndex[signature] = funcSignatures.length; emit FunctionUpdate(funcId, address(0), proxy, string(signature)); emit CommitMessage("Added ERC1538 updateContract function at contract creation"); } /////////////////////////////////////////////////////////////////////////////////////////////// fallback() external payable { if (msg.sig == bytes4(0) && msg.value != uint(0)) { // skipping ethers/BNB received to delegate return; } address delegate = delegates[msg.sig]; require(delegate != address(0), "Function does not exist."); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize()) let result := delegatecall(gas(), delegate, ptr, calldatasize(), 0, 0) let size := returndatasize() returndatacopy(ptr, 0, size) switch result case 0 {revert(ptr, size)} default {return (ptr, size)} } } /////////////////////////////////////////////////////////////////////////////////////////////// /// @notice Updates functions in a transparent contract. /// @dev If the value of _delegate is zero then the functions specified /// in _functionSignatures are removed. /// If the value of _delegate is a delegate contract address then the functions /// specified in _functionSignatures will be delegated to that address. /// @param _delegate The address of a delegate contract to delegate to or zero /// @param _functionSignatures A list of function signatures listed one after the other /// @param _commitMessage A short description of the change and why it is made /// This message is passed to the CommitMessage event. function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) override onlyOwner external { // pos is first used to check the size of the delegate contract. // After that pos is the current memory location of _functionSignatures. // It is used to move through the characters of _functionSignatures uint256 pos; if(_delegate != address(0)) { assembly { pos := extcodesize(_delegate) } require(pos > 0, "_delegate address is not a contract and is not address(0)"); } // creates a bytes version of _functionSignatures bytes memory signatures = bytes(_functionSignatures); // stores the position in memory where _functionSignatures ends. uint256 signaturesEnd; // stores the starting position of a function signature in _functionSignatures uint256 start; assembly { pos := add(signatures,32) start := pos signaturesEnd := add(pos,mload(signatures)) } // the function id of the current function signature bytes4 funcId; // the delegate address that is being replaced or address(0) if removing functions address oldDelegate; // the length of the current function signature in _functionSignatures uint256 num; // the current character in _functionSignatures uint256 char; // the position of the current function signature in the funcSignatures array uint256 index; // the last position in the funcSignatures array uint256 lastIndex; // parse the _functionSignatures string and handle each function for (; pos < signaturesEnd; pos++) { assembly {char := byte(0,mload(pos))} // 0x29 == ) if (char == 0x29) { pos++; num = (pos - start); start = pos; assembly { mstore(signatures,num) } funcId = bytes4(keccak256(signatures)); oldDelegate = delegates[funcId]; if(_delegate == address(0)) { index = funcSignatureToIndex[signatures]; require(index != 0, "Function does not exist."); index--; lastIndex = funcSignatures.length - 1; if (index != lastIndex) { funcSignatures[index] = funcSignatures[lastIndex]; funcSignatureToIndex[funcSignatures[lastIndex]] = index + 1; } funcSignatures.pop(); delete funcSignatureToIndex[signatures]; delete delegates[funcId]; emit FunctionUpdate(funcId, oldDelegate, address(0), string(signatures)); } else if (funcSignatureToIndex[signatures] == 0) { require(oldDelegate == address(0), "FuncId clash."); delegates[funcId] = _delegate; funcSignatures.push(signatures); funcSignatureToIndex[signatures] = funcSignatures.length; emit FunctionUpdate(funcId, address(0), _delegate, string(signatures)); } else if (delegates[funcId] != _delegate) { delegates[funcId] = _delegate; emit FunctionUpdate(funcId, oldDelegate, _delegate, string(signatures)); } assembly {signatures := add(signatures,num)} } } emit CommitMessage(_commitMessage); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } receive() external payable {} /////////////////////////////////////////////////////////////////////////////////////////////// } ///////////////////////////////////////////////////////////////////////////////////////////////////
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"CommitMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"functionId","type":"bytes4"},{"indexed":true,"internalType":"address","name":"oldDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"newDelegate","type":"address"},{"indexed":false,"internalType":"string","name":"functionSignature","type":"string"}],"name":"FunctionUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"MintWithTokenURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"string","name":"rarity","type":"string"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDiscount","type":"bool"}],"name":"_mintCommon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"string","name":"rarity","type":"string"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDiscount","type":"bool"}],"name":"_mintLand","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_nftLockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_userBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"funcSignatures","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"isWhitelistFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"rates","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","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":"address","name":"_delegate","type":"address"},{"internalType":"string","name":"_functionSignatures","type":"string"},{"internalType":"string","name":"_commitMessage","type":"string"}],"name":"updateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistRoot","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600060135560006014553480156200001b57600080fd5b50604051620034c8380380620034c88339810160408190526200003e91620007c3565b8251839083906200005790600690602085019062000643565b5080516200006d90600790602084019062000643565b5050600160045550620000803362000464565b6001600f55600380546001600160a01b031916301790556127106013556040805160608101909152602580825260009190620033f36020830139600354909150620000d69082906001600160a01b0316620004b6565b6040805180820190915260128152717365744261736555524928737472696e672960701b60208201526200010b8184620004b6565b6040518060600160405280603781526020016200345a603791399050620001338184620004b6565b604051806060016040528060378152602001620034916037913990506200015b8184620004b6565b604051806060016040528060278152602001620033a7602791399050620001838184620004b6565b5060408051808201909152601681527f73657453616c655374617475732875696e7432353629000000000000000000006020820152620001c48184620004b6565b60405180606001604052806021815260200162003386602191399050620001ec8184620004b6565b604051806060016040528060258152602001620033ce602591399050620002148184620004b6565b5060408051808201909152601b81527f667265654d696e742875696e743235362c627974657333325b5d2900000000006020820152620002558184620004b6565b604051806080016040528060428152602001620034186042913990506200027d8184620004b6565b5060408051808201909152601f81527f72656d6f766557686974654c6973742875696e743235362c737472696e6729006020820152620002be8184620004b6565b5060408051808201909152601981527f7365744d61784d696e74416d6f756e742875696e7432353629000000000000006020820152620002ff8184620004b6565b5060408051808201909152601481527f736574446973636f756e742875696e74323536290000000000000000000000006020820152620003408184620004b6565b5060408051808201909152601f81527f7365745065725472616e73616374696f6e4c696d69742875696e7432353629006020820152620003818184620004b6565b5060408051808201909152601e81527f7365744c6f636b55702875696e743235365b5d2c75696e743235365b5d2900006020820152620003c28184620004b6565b5060408051808201909152600a8152697769746864726177282960b01b6020820152620003f08184620004b6565b6040518060600160405280602981526020016200335d602991399050620004188184620004b6565b506040805180820190915260208082527f7365745472616e73666572416c6c6f77656428616464726573732c626f6f6c2990820152620004598184620004b6565b5050505050620008df565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b815160208084019182206001600160e01b031981166000908152918290526040822080546001600160a01b0319166001600160a01b0386161790556001805480820182559252845190926200052e927fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6019162000643565b506001546040516002906200054590869062000850565b908152602001604051809103902081905550816001600160a01b031660006001600160a01b0316826001600160e01b0319167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f535386604051620005a891906200086e565b60405180910390a47faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de60405162000636906020808252603a908201527f4164646564204552433135333820757064617465436f6e74726163742066756e60408201527f6374696f6e20617420636f6e7472616374206372656174696f6e000000000000606082015260800190565b60405180910390a1505050565b8280546200065190620008a3565b90600052602060002090601f016020900481019282620006755760008555620006c0565b82601f106200069057805160ff1916838001178555620006c0565b82800160010185558215620006c0579182015b82811115620006c0578251825591602001919060010190620006a3565b50620006ce929150620006d2565b5090565b5b80821115620006ce5760008155600101620006d3565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200071c57818101518382015260200162000702565b838111156200072c576000848401525b50505050565b600082601f8301126200074457600080fd5b81516001600160401b0380821115620007615762000761620006e9565b604051601f8301601f19908116603f011681019082821181831017156200078c576200078c620006e9565b81604052838152866020858801011115620007a657600080fd5b620007b9846020830160208901620006ff565b9695505050505050565b600080600060608486031215620007d957600080fd5b83516001600160401b0380821115620007f157600080fd5b620007ff8783880162000732565b945060208601519150808211156200081657600080fd5b50620008258682870162000732565b604086015190935090506001600160a01b03811681146200084557600080fd5b809150509250925092565b6000825162000864818460208701620006ff565b9190910192915050565b60208152600082518060208401526200088f816040850160208701620006ff565b601f01601f19169190910160400192915050565b600181811c90821680620008b857607f821691505b602082108103620008d957634e487b7160e01b600052602260045260246000fd5b50919050565b612a6e80620008ef6000396000f3fe6080604052600436106102085760003560e01c80636b6f4a9d1161011857806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146107bb578063c23dc68f146107db578063c87b56dd14610808578063e985e9c514610828578063f2fde38b146108485761020f565b806395d89b411461073057806399a2557a14610745578063a0a2daf014610765578063a22cb4651461079b5761020f565b80637501f741116100e75780637501f7411461061c5780638462151c146106325780638822048e1461065f5780638acdad751461068f5780638da5cb5b146107125761020f565b80636b6f4a9d146105bc5780636c0360eb146105d257806370a08231146105e7578063715018a6146106075761020f565b806326a6860a1161019b5780635bbb21771161016a5780635bbb21771461050c5780636145556714610539578063621fb96c14610559578063631e4b85146105865780636352211e1461059c5761020f565b806326a6860a1461040e5780633277f29b1461042e57806342842e0e146104a057806350572df2146104c05761020f565b8063095ea7b3116101d7578063095ea7b31461039b57806318160ddd146103bb578063200d2ed2146103d857806323b872dd146103ee5761020f565b806301ffc9a7146102c657806306fdde03146102fb578063081812fc1461031d5780630935ef10146103555761020f565b3661020f57005b6000356001600160e01b03191615801561022857503415155b1561022f57005b600080356001600160e01b0319168152602081905260409020546001600160a01b03168061029f5760405162461bcd60e51b8152602060048201526018602482015277233ab731ba34b7b7103237b2b9903737ba1032bc34b9ba1760411b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156102c0578184f35b8184fd5b005b3480156102d257600080fd5b506102e66102e136600461217d565b610868565b60405190151581526020015b60405180910390f35b34801561030757600080fd5b506103106108ba565b6040516102f291906121f2565b34801561032957600080fd5b5061033d610338366004612205565b61094c565b6040516001600160a01b0390911681526020016102f2565b34801561036157600080fd5b5061038d61037036600461223a565b601860209081526000928352604080842090915290825290205481565b6040519081526020016102f2565b3480156103a757600080fd5b506102c46103b6366004612266565b610990565b3480156103c757600080fd5b50600554600454036000190161038d565b3480156103e457600080fd5b5061038d60145481565b3480156103fa57600080fd5b506102c4610409366004612290565b610a58565b34801561041a57600080fd5b50610310610429366004612205565b610aad565b34801561043a57600080fd5b50610478610449366004612205565b601160205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102f2565b3480156104ac57600080fd5b506102c46104bb366004612290565b610b59565b3480156104cc57600080fd5b506102e66104db366004612369565b6012602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561051857600080fd5b5061052c6105273660046123c3565b610bb9565b6040516102f29190612468565b34801561054557600080fd5b506102c461055436600461251a565b610c7f565b34801561056557600080fd5b5061038d610574366004612205565b600c6020526000908152604090205481565b34801561059257600080fd5b5061038d60175481565b3480156105a857600080fd5b5061033d6105b7366004612205565b61127a565b3480156105c857600080fd5b5061038d60165481565b3480156105de57600080fd5b5061031061128c565b3480156105f357600080fd5b5061038d61060236600461259a565b611299565b34801561061357600080fd5b506102c46112e7565b34801561062857600080fd5b5061038d60135481565b34801561063e57600080fd5b5061065261064d36600461259a565b6112fb565b6040516102f291906125b5565b34801561066b57600080fd5b506102e661067a36600461259a565b600d6020526000908152604090205460ff1681565b34801561069b57600080fd5b506106f06106aa366004612369565b6015602090815260009283526040909220815180830184018051928152908401929093019190912091528054600182015460028301546003909301549192909160ff1684565b60408051948552602085019390935291830152151560608201526080016102f2565b34801561071e57600080fd5b50600e546001600160a01b031661033d565b34801561073c57600080fd5b50610310611440565b34801561075157600080fd5b506106526107603660046125ed565b61144f565b34801561077157600080fd5b5061033d61078036600461217d565b6000602081905290815260409020546001600160a01b031681565b3480156107a757600080fd5b506102c46107b6366004612620565b61161c565b3480156107c757600080fd5b506102c46107d636600461265c565b6116ec565b3480156107e757600080fd5b506107fb6107f6366004612205565b61177c565b6040516102f291906126d7565b34801561081457600080fd5b50610310610823366004612205565b611836565b34801561083457600080fd5b506102e661084336600461270c565b611901565b34801561085457600080fd5b506102c461086336600461259a565b61192f565b60006001600160e01b031982166380ac58cd60e01b148061089957506001600160e01b03198216635b5e139f60e01b145b806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600680546108c990612736565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612736565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b6000610957826119a8565b610974576040516333d1c03960e21b815260040160405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b6001600160a01b0382166000908152600d6020526040902054829060ff166109ca5760405162461bcd60e51b815260040161029690612770565b60006109d58361127a565b9050806001600160a01b0316846001600160a01b031603610a095760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a295750610a278133611901565b155b15610a47576040516367d9dca160e11b815260040160405180910390fd5b610a528484836119e1565b50505050565b6000818152600c602052604090205442101580610a8157506000818152600c6020526040902054155b610a9d5760405162461bcd60e51b8152600401610296906127a7565b610aa8838383611a3d565b505050565b60018181548110610abd57600080fd5b906000526020600020016000915090508054610ad890612736565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490612736565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b505050505081565b6000818152600c602052604090205442101580610b8257506000818152600c6020526040902054155b610b9e5760405162461bcd60e51b8152600401610296906127a7565b610aa8838383604051806020016040528060008152506116ec565b80516060906000816001600160401b03811115610bd857610bd86122cc565b604051908082528060200260200182016040528015610c2357816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610bf65790505b50905060005b828114610c7757610c52858281518110610c4557610c456127eb565b602002602001015161177c565b828281518110610c6457610c646127eb565b6020908102919091010152600101610c29565b509392505050565b610c87611c5a565b60006001600160a01b03861615610d0e5750843b80610d0e5760405162461bcd60e51b815260206004820152603960248201527f5f64656c65676174652061646472657373206973206e6f74206120636f6e747260448201527f61637420616e64206973206e6f742061646472657373283029000000000000006064820152608401610296565b600085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451602080870198509596508601909401938693509150819050808080805b878a101561123057895160001a92508260290361121e5789610d8281612817565b9a50610d909050878b612830565b808a526020808b018290206001600160e01b031981166000908152918290526040909120548c99509097506001600160a01b0390811696509094508f16610fbc57600289604051610de19190612847565b908152602001604051809103902054915081600003610e3d5760405162461bcd60e51b8152602060048201526018602482015277233ab731ba34b7b7103237b2b9903737ba1032bc34b9ba1760411b6044820152606401610296565b81610e4781612863565b60018054919450610e59925090612830565b9050808214610efc5760018181548110610e7557610e756127eb565b9060005260206000200160018381548110610e9257610e926127eb565b90600052602060002001908054610ea890612736565b610eb3929190612019565b50610ebf82600161287a565b600260018381548110610ed457610ed46127eb565b90600052602060002001604051610eeb919061292a565b908152604051908190036020019020555b6001805480610f0d57610f0d612936565b600190038181906000526020600020016000610f2991906120a4565b9055600289604051610f3b9190612847565b90815260408051602092819003830181206000908190556001600160e01b03198a168082529381905291822080546001600160a01b031916905590916001600160a01b038816917f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f535390610faf908e906121f2565b60405180910390a4611219565b600289604051610fcc9190612847565b908152602001604051809103902054600003611125576001600160a01b038516156110295760405162461bcd60e51b815260206004820152600d60248201526c233ab731a4b21031b630b9b41760991b6044820152606401610296565b8e600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001899080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906110af9291906120de565b506001546040516002906110c4908c90612847565b9081526020016040518091039020819055508e6001600160a01b031660006001600160a01b0316876001600160e01b0319167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c604051610faf91906121f2565b8e6001600160a01b0316600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031614611219578e600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508e6001600160a01b0316856001600160a01b0316876001600160e01b0319167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c60405161121091906121f2565b60405180910390a45b978301975b8961122881612817565b9a5050610d61565b7faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de8c8c60405161126192919061294c565b60405180910390a1505050505050505050505050505050565b600061128582611cb4565b5192915050565b60108054610ad890612736565b60006001600160a01b0382166112c2576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600960205260409020546001600160401b031690565b6112ef611c5a565b6112f96000611ddb565b565b6060600080600061130b85611299565b90506000816001600160401b03811115611327576113276122cc565b604051908082528060200260200182016040528015611350578160200160208202803683370190505b509050611376604080516060810182526000808252602082018190529181019190915290565b60015b83861161143457600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052925061142c5781516001600160a01b0316156113ed57815194505b876001600160a01b0316856001600160a01b03160361142c578083878060010198508151811061141f5761141f6127eb565b6020026020010181815250505b600101611379565b50909695505050505050565b6060600780546108c990612736565b60608183111561147257604051631960ccad60e11b815260040160405180910390fd5b600454600090600101611483600190565b85101561148f57600194505b8084111561149b578093505b60006114a687611299565b9050848610156114c557858503818110156114bf578091505b506114c9565b5060005b6000816001600160401b038111156114e3576114e36122cc565b60405190808252806020026020018201604052801561150c578160200160208202803683370190505b5090508160000361152257935061161592505050565b600061152d8861177c565b90506000816040015161153e575080515b885b8881141580156115505750848714155b1561160957600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905293506116015782516001600160a01b0316156115c257825191505b8a6001600160a01b0316826001600160a01b03160361160157808488806001019950815181106115f4576115f46127eb565b6020026020010181815250505b600101611540565b50505092835250909150505b9392505050565b6001600160a01b0382166000908152600d6020526040902054829060ff166116565760405162461bcd60e51b815260040161029690612770565b336001600160a01b0384160361167f5760405163b06307db60e01b815260040160405180910390fd5b336000818152600b602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000828152600c60205260409020544210158061171557506000828152600c6020526040902054155b6117315760405162461bcd60e51b8152600401610296906127a7565b61173c848484611a3d565b6001600160a01b0383163b1515801561175e575061175c84848484611e2d565b155b15610a52576040516368d2bf6b60e11b815260040160405180910390fd5b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806117c257506004548310155b156117cd5792915050565b50600082815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061182d5792915050565b61161583611cb4565b6060611841826119a8565b6118a55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610296565b6000601080546118b490612736565b9050116118d057604051806020016040528060008152506108b4565b60106118db83611f19565b6040516020016118ec92919061297b565b60405160208183030381529060405292915050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b611937611c5a565b6001600160a01b03811661199c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610296565b6119a581611ddb565b50565b6000816001111580156119bc575060045482105b80156108b4575050600090815260086020526040902054600160e01b900460ff161590565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336000818152600d602052604090205460ff16611a6c5760405162461bcd60e51b815260040161029690612770565b6000611a7783611cb4565b9050846001600160a01b031681600001516001600160a01b031614611aae5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0387161480611acc5750611acc8633611901565b80611ae7575033611adc8561094c565b6001600160a01b0316145b905080611b0757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611b2e57604051633a954ecd60e21b815260040160405180910390fd5b611b3a600085886119e1565b6001600160a01b038681166000908152600960209081526040808320805467ffffffffffffffff198082166001600160401b03928316600019018316179092558a86168086528386208054938416938316600190810184169490941790558a8652600890945282852080546001600160e01b031916909417600160a01b42909216919091021783558801808452922080549193909116611c0e576004548214611c0e57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038b16171781555b50505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b031633146112f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610296565b60408051606081018252600080825260208201819052918101919091528180600111158015611ce4575060045481105b15611dc257600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611dc05780516001600160a01b031615611d57579392505050565b5060001901600081815260086020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611dbb579392505050565b611d57565b505b604051636f96cda160e11b815260040160405180910390fd5b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e629033908990889088906004016129a0565b6020604051808303816000875af1925050508015611e9d575060408051601f3d908101601f19168201909252611e9a918101906129dd565b60015b611efb573d808015611ecb576040519150601f19603f3d011682016040523d82523d6000602084013e611ed0565b606091505b508051600003611ef3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081600003611f405750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f6a5780611f5481612817565b9150611f639050600a83612a10565b9150611f44565b6000816001600160401b03811115611f8457611f846122cc565b6040519080825280601f01601f191660200182016040528015611fae576020820181803683370190505b5090505b8415611f1157611fc3600183612830565b9150611fd0600a86612a24565b611fdb90603061287a565b60f81b818381518110611ff057611ff06127eb565b60200101906001600160f81b031916908160001a905350612012600a86612a10565b9450611fb2565b82805461202590612736565b90600052602060002090601f0160209004810192826120475760008555612094565b82601f106120585780548555612094565b8280016001018555821561209457600052602060002091601f016020900482015b82811115612094578254825591600101919060010190612079565b506120a0929150612152565b5090565b5080546120b090612736565b6000825580601f106120c0575050565b601f0160209004906000526020600020908101906119a59190612152565b8280546120ea90612736565b90600052602060002090601f01602090048101928261210c5760008555612094565b82601f1061212557805160ff1916838001178555612094565b82800160010185558215612094579182015b82811115612094578251825591602001919060010190612137565b5b808211156120a05760008155600101612153565b6001600160e01b0319811681146119a557600080fd5b60006020828403121561218f57600080fd5b813561161581612167565b60005b838110156121b557818101518382015260200161219d565b83811115610a525750506000910152565b600081518084526121de81602086016020860161219a565b601f01601f19169290920160200192915050565b60208152600061161560208301846121c6565b60006020828403121561221757600080fd5b5035919050565b80356001600160a01b038116811461223557600080fd5b919050565b6000806040838503121561224d57600080fd5b8235915061225d6020840161221e565b90509250929050565b6000806040838503121561227957600080fd5b6122828361221e565b946020939093013593505050565b6000806000606084860312156122a557600080fd5b6122ae8461221e565b92506122bc6020850161221e565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561230a5761230a6122cc565b604052919050565b60006001600160401b0383111561232b5761232b6122cc565b61233e601f8401601f19166020016122e2565b905082815283838301111561235257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561237c57600080fd5b8235915060208301356001600160401b0381111561239957600080fd5b8301601f810185136123aa57600080fd5b6123b985823560208401612312565b9150509250929050565b600060208083850312156123d657600080fd5b82356001600160401b03808211156123ed57600080fd5b818501915085601f83011261240157600080fd5b813581811115612413576124136122cc565b8060051b91506124248483016122e2565b818152918301840191848101908884111561243e57600080fd5b938501935b8385101561245c57843582529385019390850190612443565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611434576124bf83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612484565b60008083601f8401126124e457600080fd5b5081356001600160401b038111156124fb57600080fd5b60208301915083602082850101111561251357600080fd5b9250929050565b60008060008060006060868803121561253257600080fd5b61253b8661221e565b945060208601356001600160401b038082111561255757600080fd5b61256389838a016124d2565b9096509450604088013591508082111561257c57600080fd5b50612589888289016124d2565b969995985093965092949392505050565b6000602082840312156125ac57600080fd5b6116158261221e565b6020808252825182820181905260009190848201906040850190845b81811015611434578351835292840192918401916001016125d1565b60008060006060848603121561260257600080fd5b61260b8461221e565b95602085013595506040909401359392505050565b6000806040838503121561263357600080fd5b61263c8361221e565b91506020830135801515811461265157600080fd5b809150509250929050565b6000806000806080858703121561267257600080fd5b61267b8561221e565b93506126896020860161221e565b92506040850135915060608501356001600160401b038111156126ab57600080fd5b8501601f810187136126bc57600080fd5b6126cb87823560208401612312565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016108b4565b6000806040838503121561271f57600080fd5b6127288361221e565b915061225d6020840161221e565b600181811c9082168061274a57607f821691505b60208210810361276a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b60208082526024908201527f58616e614c616e643a204e4654206c6f636b7570206e6f742065787069726564604082015263081e595d60e21b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161282957612829612801565b5060010190565b60008282101561284257612842612801565b500390565b6000825161285981846020870161219a565b9190910192915050565b60008161287257612872612801565b506000190190565b6000821982111561288d5761288d612801565b500190565b8054600090600181811c90808316806128ac57607f831692505b602080841082036128cd57634e487b7160e01b600052602260045260246000fd5b8180156128e157600181146128f25761291e565b60ff1986168952848901965061291e565b876000528160002060005b868110156129165781548b8201529085019083016128fd565b505084890196505b50505050505092915050565b60006116158284612892565b634e487b7160e01b600052603160045260246000fd5b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006129878285612892565b835161299781836020880161219a565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129d3908301846121c6565b9695505050505050565b6000602082840312156129ef57600080fd5b815161161581612167565b634e487b7160e01b600052601260045260246000fd5b600082612a1f57612a1f6129fa565b500490565b600082612a3357612a336129fa565b50069056fea2646970667358221220619eac014cde3aab16a86324ad8c894f4fd84ffb38d64d83e0558a8ebc4fe92464736f6c634300080e00336d696e7441646d696e28616464726573732c75696e743235362c75696e743235362c737472696e672963616c63756c617465446973636f756e742875696e743235362c737472696e6729736574526174652875696e743235362c75696e743235362c75696e743235362c737472696e67296d696e74446973636f756e74436f6d6d6f6e2875696e743235362c627974657333325b5d29757064617465436f6e747261637428616464726573732c737472696e672c737472696e672973657457686974656c697374526f6f7428627974657333322c75696e743235362c75696e743235362c75696e743235362c75696e743235362c737472696e675b5d296d696e744c616e6428737472696e672c75696e743235362c75696e743235362c627974657333325b5d2c626f6f6c2c75696e7432353629697357686974656c697374656428616464726573732c627974657333325b5d2c75696e743235362c75696e743235362c737472696e6729000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000047436b1e0cbfe745a4fffe9e666255388c8701ed000000000000000000000000000000000000000000000000000000000000000a58414e413a204c414e44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003584c440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102085760003560e01c80636b6f4a9d1161011857806395d89b41116100a0578063b88d4fde1161006f578063b88d4fde146107bb578063c23dc68f146107db578063c87b56dd14610808578063e985e9c514610828578063f2fde38b146108485761020f565b806395d89b411461073057806399a2557a14610745578063a0a2daf014610765578063a22cb4651461079b5761020f565b80637501f741116100e75780637501f7411461061c5780638462151c146106325780638822048e1461065f5780638acdad751461068f5780638da5cb5b146107125761020f565b80636b6f4a9d146105bc5780636c0360eb146105d257806370a08231146105e7578063715018a6146106075761020f565b806326a6860a1161019b5780635bbb21771161016a5780635bbb21771461050c5780636145556714610539578063621fb96c14610559578063631e4b85146105865780636352211e1461059c5761020f565b806326a6860a1461040e5780633277f29b1461042e57806342842e0e146104a057806350572df2146104c05761020f565b8063095ea7b3116101d7578063095ea7b31461039b57806318160ddd146103bb578063200d2ed2146103d857806323b872dd146103ee5761020f565b806301ffc9a7146102c657806306fdde03146102fb578063081812fc1461031d5780630935ef10146103555761020f565b3661020f57005b6000356001600160e01b03191615801561022857503415155b1561022f57005b600080356001600160e01b0319168152602081905260409020546001600160a01b03168061029f5760405162461bcd60e51b8152602060048201526018602482015277233ab731ba34b7b7103237b2b9903737ba1032bc34b9ba1760411b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156102c0578184f35b8184fd5b005b3480156102d257600080fd5b506102e66102e136600461217d565b610868565b60405190151581526020015b60405180910390f35b34801561030757600080fd5b506103106108ba565b6040516102f291906121f2565b34801561032957600080fd5b5061033d610338366004612205565b61094c565b6040516001600160a01b0390911681526020016102f2565b34801561036157600080fd5b5061038d61037036600461223a565b601860209081526000928352604080842090915290825290205481565b6040519081526020016102f2565b3480156103a757600080fd5b506102c46103b6366004612266565b610990565b3480156103c757600080fd5b50600554600454036000190161038d565b3480156103e457600080fd5b5061038d60145481565b3480156103fa57600080fd5b506102c4610409366004612290565b610a58565b34801561041a57600080fd5b50610310610429366004612205565b610aad565b34801561043a57600080fd5b50610478610449366004612205565b601160205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102f2565b3480156104ac57600080fd5b506102c46104bb366004612290565b610b59565b3480156104cc57600080fd5b506102e66104db366004612369565b6012602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff1681565b34801561051857600080fd5b5061052c6105273660046123c3565b610bb9565b6040516102f29190612468565b34801561054557600080fd5b506102c461055436600461251a565b610c7f565b34801561056557600080fd5b5061038d610574366004612205565b600c6020526000908152604090205481565b34801561059257600080fd5b5061038d60175481565b3480156105a857600080fd5b5061033d6105b7366004612205565b61127a565b3480156105c857600080fd5b5061038d60165481565b3480156105de57600080fd5b5061031061128c565b3480156105f357600080fd5b5061038d61060236600461259a565b611299565b34801561061357600080fd5b506102c46112e7565b34801561062857600080fd5b5061038d60135481565b34801561063e57600080fd5b5061065261064d36600461259a565b6112fb565b6040516102f291906125b5565b34801561066b57600080fd5b506102e661067a36600461259a565b600d6020526000908152604090205460ff1681565b34801561069b57600080fd5b506106f06106aa366004612369565b6015602090815260009283526040909220815180830184018051928152908401929093019190912091528054600182015460028301546003909301549192909160ff1684565b60408051948552602085019390935291830152151560608201526080016102f2565b34801561071e57600080fd5b50600e546001600160a01b031661033d565b34801561073c57600080fd5b50610310611440565b34801561075157600080fd5b506106526107603660046125ed565b61144f565b34801561077157600080fd5b5061033d61078036600461217d565b6000602081905290815260409020546001600160a01b031681565b3480156107a757600080fd5b506102c46107b6366004612620565b61161c565b3480156107c757600080fd5b506102c46107d636600461265c565b6116ec565b3480156107e757600080fd5b506107fb6107f6366004612205565b61177c565b6040516102f291906126d7565b34801561081457600080fd5b50610310610823366004612205565b611836565b34801561083457600080fd5b506102e661084336600461270c565b611901565b34801561085457600080fd5b506102c461086336600461259a565b61192f565b60006001600160e01b031982166380ac58cd60e01b148061089957506001600160e01b03198216635b5e139f60e01b145b806108b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600680546108c990612736565b80601f01602080910402602001604051908101604052809291908181526020018280546108f590612736565b80156109425780601f1061091757610100808354040283529160200191610942565b820191906000526020600020905b81548152906001019060200180831161092557829003601f168201915b5050505050905090565b6000610957826119a8565b610974576040516333d1c03960e21b815260040160405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b6001600160a01b0382166000908152600d6020526040902054829060ff166109ca5760405162461bcd60e51b815260040161029690612770565b60006109d58361127a565b9050806001600160a01b0316846001600160a01b031603610a095760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a295750610a278133611901565b155b15610a47576040516367d9dca160e11b815260040160405180910390fd5b610a528484836119e1565b50505050565b6000818152600c602052604090205442101580610a8157506000818152600c6020526040902054155b610a9d5760405162461bcd60e51b8152600401610296906127a7565b610aa8838383611a3d565b505050565b60018181548110610abd57600080fd5b906000526020600020016000915090508054610ad890612736565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0490612736565b8015610b515780601f10610b2657610100808354040283529160200191610b51565b820191906000526020600020905b815481529060010190602001808311610b3457829003601f168201915b505050505081565b6000818152600c602052604090205442101580610b8257506000818152600c6020526040902054155b610b9e5760405162461bcd60e51b8152600401610296906127a7565b610aa8838383604051806020016040528060008152506116ec565b80516060906000816001600160401b03811115610bd857610bd86122cc565b604051908082528060200260200182016040528015610c2357816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610bf65790505b50905060005b828114610c7757610c52858281518110610c4557610c456127eb565b602002602001015161177c565b828281518110610c6457610c646127eb565b6020908102919091010152600101610c29565b509392505050565b610c87611c5a565b60006001600160a01b03861615610d0e5750843b80610d0e5760405162461bcd60e51b815260206004820152603960248201527f5f64656c65676174652061646472657373206973206e6f74206120636f6e747260448201527f61637420616e64206973206e6f742061646472657373283029000000000000006064820152608401610296565b600085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451602080870198509596508601909401938693509150819050808080805b878a101561123057895160001a92508260290361121e5789610d8281612817565b9a50610d909050878b612830565b808a526020808b018290206001600160e01b031981166000908152918290526040909120548c99509097506001600160a01b0390811696509094508f16610fbc57600289604051610de19190612847565b908152602001604051809103902054915081600003610e3d5760405162461bcd60e51b8152602060048201526018602482015277233ab731ba34b7b7103237b2b9903737ba1032bc34b9ba1760411b6044820152606401610296565b81610e4781612863565b60018054919450610e59925090612830565b9050808214610efc5760018181548110610e7557610e756127eb565b9060005260206000200160018381548110610e9257610e926127eb565b90600052602060002001908054610ea890612736565b610eb3929190612019565b50610ebf82600161287a565b600260018381548110610ed457610ed46127eb565b90600052602060002001604051610eeb919061292a565b908152604051908190036020019020555b6001805480610f0d57610f0d612936565b600190038181906000526020600020016000610f2991906120a4565b9055600289604051610f3b9190612847565b90815260408051602092819003830181206000908190556001600160e01b03198a168082529381905291822080546001600160a01b031916905590916001600160a01b038816917f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f535390610faf908e906121f2565b60405180910390a4611219565b600289604051610fcc9190612847565b908152602001604051809103902054600003611125576001600160a01b038516156110295760405162461bcd60e51b815260206004820152600d60248201526c233ab731a4b21031b630b9b41760991b6044820152606401610296565b8e600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001899080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906110af9291906120de565b506001546040516002906110c4908c90612847565b9081526020016040518091039020819055508e6001600160a01b031660006001600160a01b0316876001600160e01b0319167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c604051610faf91906121f2565b8e6001600160a01b0316600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031614611219578e600080886001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508e6001600160a01b0316856001600160a01b0316876001600160e01b0319167f3234040ce3bd4564874e44810f198910133a1b24c4e84aac87edbf6b458f53538c60405161121091906121f2565b60405180910390a45b978301975b8961122881612817565b9a5050610d61565b7faa1c0a0a78cec2470f9652e5d29540752e7a64d70f926933cebf13afaeda45de8c8c60405161126192919061294c565b60405180910390a1505050505050505050505050505050565b600061128582611cb4565b5192915050565b60108054610ad890612736565b60006001600160a01b0382166112c2576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600960205260409020546001600160401b031690565b6112ef611c5a565b6112f96000611ddb565b565b6060600080600061130b85611299565b90506000816001600160401b03811115611327576113276122cc565b604051908082528060200260200182016040528015611350578160200160208202803683370190505b509050611376604080516060810182526000808252602082018190529181019190915290565b60015b83861161143457600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052925061142c5781516001600160a01b0316156113ed57815194505b876001600160a01b0316856001600160a01b03160361142c578083878060010198508151811061141f5761141f6127eb565b6020026020010181815250505b600101611379565b50909695505050505050565b6060600780546108c990612736565b60608183111561147257604051631960ccad60e11b815260040160405180910390fd5b600454600090600101611483600190565b85101561148f57600194505b8084111561149b578093505b60006114a687611299565b9050848610156114c557858503818110156114bf578091505b506114c9565b5060005b6000816001600160401b038111156114e3576114e36122cc565b60405190808252806020026020018201604052801561150c578160200160208202803683370190505b5090508160000361152257935061161592505050565b600061152d8861177c565b90506000816040015161153e575080515b885b8881141580156115505750848714155b1561160957600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905293506116015782516001600160a01b0316156115c257825191505b8a6001600160a01b0316826001600160a01b03160361160157808488806001019950815181106115f4576115f46127eb565b6020026020010181815250505b600101611540565b50505092835250909150505b9392505050565b6001600160a01b0382166000908152600d6020526040902054829060ff166116565760405162461bcd60e51b815260040161029690612770565b336001600160a01b0384160361167f5760405163b06307db60e01b815260040160405180910390fd5b336000818152600b602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000828152600c60205260409020544210158061171557506000828152600c6020526040902054155b6117315760405162461bcd60e51b8152600401610296906127a7565b61173c848484611a3d565b6001600160a01b0383163b1515801561175e575061175c84848484611e2d565b155b15610a52576040516368d2bf6b60e11b815260040160405180910390fd5b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806117c257506004548310155b156117cd5792915050565b50600082815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061182d5792915050565b61161583611cb4565b6060611841826119a8565b6118a55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610296565b6000601080546118b490612736565b9050116118d057604051806020016040528060008152506108b4565b60106118db83611f19565b6040516020016118ec92919061297b565b60405160208183030381529060405292915050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b611937611c5a565b6001600160a01b03811661199c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610296565b6119a581611ddb565b50565b6000816001111580156119bc575060045482105b80156108b4575050600090815260086020526040902054600160e01b900460ff161590565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336000818152600d602052604090205460ff16611a6c5760405162461bcd60e51b815260040161029690612770565b6000611a7783611cb4565b9050846001600160a01b031681600001516001600160a01b031614611aae5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0387161480611acc5750611acc8633611901565b80611ae7575033611adc8561094c565b6001600160a01b0316145b905080611b0757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611b2e57604051633a954ecd60e21b815260040160405180910390fd5b611b3a600085886119e1565b6001600160a01b038681166000908152600960209081526040808320805467ffffffffffffffff198082166001600160401b03928316600019018316179092558a86168086528386208054938416938316600190810184169490941790558a8652600890945282852080546001600160e01b031916909417600160a01b42909216919091021783558801808452922080549193909116611c0e576004548214611c0e57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038b16171781555b50505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b031633146112f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610296565b60408051606081018252600080825260208201819052918101919091528180600111158015611ce4575060045481105b15611dc257600081815260086020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611dc05780516001600160a01b031615611d57579392505050565b5060001901600081815260086020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611dbb579392505050565b611d57565b505b604051636f96cda160e11b815260040160405180910390fd5b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e629033908990889088906004016129a0565b6020604051808303816000875af1925050508015611e9d575060408051601f3d908101601f19168201909252611e9a918101906129dd565b60015b611efb573d808015611ecb576040519150601f19603f3d011682016040523d82523d6000602084013e611ed0565b606091505b508051600003611ef3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081600003611f405750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f6a5780611f5481612817565b9150611f639050600a83612a10565b9150611f44565b6000816001600160401b03811115611f8457611f846122cc565b6040519080825280601f01601f191660200182016040528015611fae576020820181803683370190505b5090505b8415611f1157611fc3600183612830565b9150611fd0600a86612a24565b611fdb90603061287a565b60f81b818381518110611ff057611ff06127eb565b60200101906001600160f81b031916908160001a905350612012600a86612a10565b9450611fb2565b82805461202590612736565b90600052602060002090601f0160209004810192826120475760008555612094565b82601f106120585780548555612094565b8280016001018555821561209457600052602060002091601f016020900482015b82811115612094578254825591600101919060010190612079565b506120a0929150612152565b5090565b5080546120b090612736565b6000825580601f106120c0575050565b601f0160209004906000526020600020908101906119a59190612152565b8280546120ea90612736565b90600052602060002090601f01602090048101928261210c5760008555612094565b82601f1061212557805160ff1916838001178555612094565b82800160010185558215612094579182015b82811115612094578251825591602001919060010190612137565b5b808211156120a05760008155600101612153565b6001600160e01b0319811681146119a557600080fd5b60006020828403121561218f57600080fd5b813561161581612167565b60005b838110156121b557818101518382015260200161219d565b83811115610a525750506000910152565b600081518084526121de81602086016020860161219a565b601f01601f19169290920160200192915050565b60208152600061161560208301846121c6565b60006020828403121561221757600080fd5b5035919050565b80356001600160a01b038116811461223557600080fd5b919050565b6000806040838503121561224d57600080fd5b8235915061225d6020840161221e565b90509250929050565b6000806040838503121561227957600080fd5b6122828361221e565b946020939093013593505050565b6000806000606084860312156122a557600080fd5b6122ae8461221e565b92506122bc6020850161221e565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561230a5761230a6122cc565b604052919050565b60006001600160401b0383111561232b5761232b6122cc565b61233e601f8401601f19166020016122e2565b905082815283838301111561235257600080fd5b828260208301376000602084830101529392505050565b6000806040838503121561237c57600080fd5b8235915060208301356001600160401b0381111561239957600080fd5b8301601f810185136123aa57600080fd5b6123b985823560208401612312565b9150509250929050565b600060208083850312156123d657600080fd5b82356001600160401b03808211156123ed57600080fd5b818501915085601f83011261240157600080fd5b813581811115612413576124136122cc565b8060051b91506124248483016122e2565b818152918301840191848101908884111561243e57600080fd5b938501935b8385101561245c57843582529385019390850190612443565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611434576124bf83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612484565b60008083601f8401126124e457600080fd5b5081356001600160401b038111156124fb57600080fd5b60208301915083602082850101111561251357600080fd5b9250929050565b60008060008060006060868803121561253257600080fd5b61253b8661221e565b945060208601356001600160401b038082111561255757600080fd5b61256389838a016124d2565b9096509450604088013591508082111561257c57600080fd5b50612589888289016124d2565b969995985093965092949392505050565b6000602082840312156125ac57600080fd5b6116158261221e565b6020808252825182820181905260009190848201906040850190845b81811015611434578351835292840192918401916001016125d1565b60008060006060848603121561260257600080fd5b61260b8461221e565b95602085013595506040909401359392505050565b6000806040838503121561263357600080fd5b61263c8361221e565b91506020830135801515811461265157600080fd5b809150509250929050565b6000806000806080858703121561267257600080fd5b61267b8561221e565b93506126896020860161221e565b92506040850135915060608501356001600160401b038111156126ab57600080fd5b8501601f810187136126bc57600080fd5b6126cb87823560208401612312565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016108b4565b6000806040838503121561271f57600080fd5b6127288361221e565b915061225d6020840161221e565b600181811c9082168061274a57607f821691505b60208210810361276a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601c908201527f4552433732313a207472616e73666572206e6f7420616c6c6f77656400000000604082015260600190565b60208082526024908201527f58616e614c616e643a204e4654206c6f636b7570206e6f742065787069726564604082015263081e595d60e21b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161282957612829612801565b5060010190565b60008282101561284257612842612801565b500390565b6000825161285981846020870161219a565b9190910192915050565b60008161287257612872612801565b506000190190565b6000821982111561288d5761288d612801565b500190565b8054600090600181811c90808316806128ac57607f831692505b602080841082036128cd57634e487b7160e01b600052602260045260246000fd5b8180156128e157600181146128f25761291e565b60ff1986168952848901965061291e565b876000528160002060005b868110156129165781548b8201529085019083016128fd565b505084890196505b50505050505092915050565b60006116158284612892565b634e487b7160e01b600052603160045260246000fd5b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006129878285612892565b835161299781836020880161219a565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129d3908301846121c6565b9695505050505050565b6000602082840312156129ef57600080fd5b815161161581612167565b634e487b7160e01b600052601260045260246000fd5b600082612a1f57612a1f6129fa565b500490565b600082612a3357612a336129fa565b50069056fea2646970667358221220619eac014cde3aab16a86324ad8c894f4fd84ffb38d64d83e0558a8ebc4fe92464736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000047436b1e0cbfe745a4fffe9e666255388c8701ed000000000000000000000000000000000000000000000000000000000000000a58414e413a204c414e44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003584c440000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): XANA: LAND
Arg [1] : _symbol (string): XLD
Arg [2] : implementation (address): 0x47436B1E0CbFe745A4FFfE9E666255388c8701ed
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000047436b1e0cbfe745a4fffe9e666255388c8701ed
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 58414e413a204c414e4400000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 584c440000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70486:9191:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73955:1;73937:7;-1:-1:-1;;;;;;73937:7:0;:20;:44;;;;-1:-1:-1;73961:9:0;:20;;73937:44;73933:127;;;70486:9191;73933:127;74070:16;74099:7;;-1:-1:-1;;;;;;74099:7:0;74089:18;;;;;;;;;;-1:-1:-1;;;;;74089:18:0;;74118:59;;;;-1:-1:-1;;;74118:59:0;;216:2:1;74118:59:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:54;338:18;;74118:59:0;;;;;;;;;74229:4;74223:11;74269:14;74266:1;74261:3;74248:36;74366:1;74363;74347:14;74342:3;74332:8;74325:5;74312:56;74394:16;74447:4;74444:1;74439:3;74424:28;74473:6;74493:26;;;;74555:4;74550:3;74542:18;74493:26;74513:4;74508:3;74501:17;74466:95;;40743:305;;;;;;;;;;-1:-1:-1;40743:305:0;;;;;:::i;:::-;;:::i;:::-;;;918:14:1;;911:22;893:41;;881:2;866:18;40743:305:0;;;;;;;;43862:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45389:204::-;;;;;;;;;;-1:-1:-1;45389:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2045:32:1;;;2027:51;;2015:2;2000:18;45389:204:0;1881:203:1;69237:66:0;;;;;;;;;;-1:-1:-1;69237:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2672:25:1;;;2660:2;2645:18;69237:66:0;2526:177:1;44928:395:0;;;;;;;;;;-1:-1:-1;44928:395:0;;;;;:::i;:::-;;:::i;39992:303::-;;;;;;;;;;-1:-1:-1;40246:12:0;;40230:13;;:28;-1:-1:-1;;40230:46:0;39992:303;;68944:25;;;;;;;;;;;;;;;;50732:291;;;;;;;;;;-1:-1:-1;50732:291:0;;;;;:::i;:::-;;:::i;2681:29::-;;;;;;;;;;-1:-1:-1;2681:29:0;;;;;:::i;:::-;;:::i;68784:50::-;;;;;;;;;;-1:-1:-1;68784:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3782:25:1;;;3838:2;3823:18;;3816:34;;;;3866:18;;;3859:34;;;;3924:2;3909:18;;3902:34;3967:3;3952:19;;3945:35;3769:3;3754:19;68784:50:0;3523:463:1;51031:305:0;;;;;;;;;;-1:-1:-1;51031:305:0;;;;;:::i;:::-;;:::i;68843:65::-;;;;;;;;;;-1:-1:-1;68843:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63794:459;;;;;;;;;;-1:-1:-1;63794:459:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;75367:3799::-;;;;;;;;;;-1:-1:-1;75367:3799:0;;;;;:::i;:::-;;:::i;39253:45::-;;;;;;;;;;-1:-1:-1;39253:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;69194:34;;;;;;;;;;;;;;;;43670:125;;;;;;;;;;-1:-1:-1;43670:125:0;;;;;:::i;:::-;;:::i;69162:23::-;;;;;;;;;;;;;;;;68583:21;;;;;;;;;;;;;:::i;41118:206::-;;;;;;;;;;-1:-1:-1;41118:206:0;;;;;:::i;:::-;;:::i;8649:103::-;;;;;;;;;;;;;:::i;68914:26::-;;;;;;;;;;;;;;;;67593:882;;;;;;;;;;-1:-1:-1;67593:882:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39307:49::-;;;;;;;;;;-1:-1:-1;39307:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;69095:58;;;;;;;;;;-1:-1:-1;69095:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9508:25:1;;;9564:2;9549:18;;9542:34;;;;9592:18;;;9585:34;9662:14;9655:22;9650:2;9635:18;;9628:50;9495:3;9480:19;69095:58:0;9283:401:1;8001:87:0;;;;;;;;;;-1:-1:-1;8074:6:0;;-1:-1:-1;;;;;8074:6:0;8001:87;;44031:104;;;;;;;;;;;;;:::i;64643:2501::-;;;;;;;;;;-1:-1:-1;64643:2501:0;;;;;:::i;:::-;;:::i;2565:43::-;;;;;;;;;;-1:-1:-1;2565:43:0;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;2565:43:0;;;45665:317;;;;;;;;;;-1:-1:-1;45665:317:0;;;;;:::i;:::-;;:::i;51344:490::-;;;;;;;;;;-1:-1:-1;51344:490:0;;;;;:::i;:::-;;:::i;63226:409::-;;;;;;;;;;-1:-1:-1;63226:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;79241:289::-;;;;;;;;;;-1:-1:-1;79241:289:0;;;;;:::i;:::-;;:::i;46053:164::-;;;;;;;;;;-1:-1:-1;46053:164:0;;;;;:::i;:::-;;:::i;8907:201::-;;;;;;;;;;-1:-1:-1;8907:201:0;;;;;:::i;:::-;;:::i;40743:305::-;40845:4;-1:-1:-1;;;;;;40882:40:0;;-1:-1:-1;;;40882:40:0;;:105;;-1:-1:-1;;;;;;;40939:48:0;;-1:-1:-1;;;40939:48:0;40882:105;:158;;;-1:-1:-1;;;;;;;;;;36183:40:0;;;41004:36;40862:178;40743:305;-1:-1:-1;;40743:305:0:o;43862:100::-;43916:13;43949:5;43942:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43862:100;:::o;45389:204::-;45457:7;45482:16;45490:7;45482;:16::i;:::-;45477:64;;45507:34;;-1:-1:-1;;;45507:34:0;;;;;;;;;;;45477:64;-1:-1:-1;45561:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45561:24:0;;45389:204::o;44928:395::-;-1:-1:-1;;;;;39594:23:0;;;;;;:17;:23;;;;;;44994:2;;39594:23;;39586:63;;;;-1:-1:-1;;;39586:63:0;;;;;;;:::i;:::-;45025:13:::1;45041:24;45057:7;45041:15;:24::i;:::-;45025:40;;45086:5;-1:-1:-1::0;;;;;45080:11:0::1;:2;-1:-1:-1::0;;;;;45080:11:0::1;::::0;45076:48:::1;;45100:24;;-1:-1:-1::0;;;45100:24:0::1;;;;;;;;;;;45076:48;6634:10:::0;-1:-1:-1;;;;;45141:21:0;::::1;;::::0;::::1;::::0;:63:::1;;-1:-1:-1::0;45167:37:0::1;45184:5:::0;6634:10;46053:164;:::i;45167:37::-:1;45166:38;45141:63;45137:138;;;45228:35;;-1:-1:-1::0;;;45228:35:0::1;;;;;;;;;;;45137:138;45287:28;45296:2;45300:7;45309:5;45287:8;:28::i;:::-;45014:309;44928:395:::0;;;:::o;50732:291::-;50868:19;;;;:10;:19;;;;;;50891:15;-1:-1:-1;50868:38:0;;:66;;-1:-1:-1;50910:19:0;;;;:10;:19;;;;;;:24;50868:66;50860:116;;;;-1:-1:-1;;;50860:116:0;;;;;;;:::i;:::-;50987:28;50997:4;51003:2;51007:7;50987:9;:28::i;:::-;50732:291;;;:::o;2681:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51031:305::-;51170:19;;;;:10;:19;;;;;;51193:15;-1:-1:-1;51170:38:0;;:66;;-1:-1:-1;51212:19:0;;;;:10;:19;;;;;;:24;51170:66;51162:116;;;;-1:-1:-1;;;51162:116:0;;;;;;;:::i;:::-;51289:39;51306:4;51312:2;51316:7;51289:39;;;;;;;;;;;;:16;:39::i;63794:459::-;63960:15;;63874:23;;63935:22;63960:15;-1:-1:-1;;;;;64027:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;64027:36:0;;-1:-1:-1;;64027:36:0;;;;;;;;;;;;63990:73;;64083:9;64078:125;64099:14;64094:1;:19;64078:125;;64155:32;64175:8;64184:1;64175:11;;;;;;;;:::i;:::-;;;;;;;64155:19;:32::i;:::-;64139:10;64150:1;64139:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;64115:3;;64078:125;;;-1:-1:-1;64224:10:0;63794:459;-1:-1:-1;;;63794:459:0:o;75367:3799::-;7887:13;:11;:13::i;:::-;75751:11:::1;-1:-1:-1::0;;;;;75776:23:0;::::1;::::0;75773:218:::1;;-1:-1:-1::0;75851:22:0;::::1;75910:7:::0;75902:77:::1;;;::::0;-1:-1:-1;;;75902:77:0;;13058:2:1;75902:77:0::1;::::0;::::1;13040:21:1::0;13097:2;13077:18;;;13070:30;13136:34;13116:18;;;13109:62;13207:27;13187:18;;;13180:55;13252:19;;75902:77:0::1;12856:421:1::0;75902:77:0::1;76062:23;76094:19;;76062:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;76457:17:0;;76389:2:::1;76374:18:::0;;::::1;::::0;-1:-1:-1;76062:52:0;;-1:-1:-1;76449:26:0;;;;;;76374:18;;-1:-1:-1;76062:52:0;-1:-1:-1;76062:52:0;;-1:-1:-1;76062:52:0;;;;77157:1957:::1;77170:13;77164:3;:19;77157:1957;;;77238:3;77232:10;77230:1;77225:18;77217:26;;77288:4;77296;77288:12:::0;77284:1819:::1;;77321:5:::0;::::1;::::0;::::1;:::i;:::-;::::0;-1:-1:-1;77352:11:0::1;::::0;-1:-1:-1;77358:5:0;77321;77352:11:::1;:::i;:::-;77445:22:::0;;;77520:21:::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;;77575:17:0;::::1;:9;:17:::0;;;;;;;;;;;;77391:3;;-1:-1:-1;77520:21:0;;-1:-1:-1;;;;;;77575:17:0;;::::1;::::0;-1:-1:-1;77345:19:0;;-1:-1:-1;77614:23:0;::::1;77611:1415;;77670:20;77691:10;77670:32;;;;;;:::i;:::-;;;;;;;;;;;;;;77662:40;;77733:5;77742:1;77733:10:::0;77725:47:::1;;;::::0;-1:-1:-1;;;77725:47:0;;216:2:1;77725:47:0::1;::::0;::::1;198:21:1::0;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:54;338:18;;77725:47:0::1;14:348:1::0;77725:47:0::1;77795:7:::0;::::1;::::0;::::1;:::i;:::-;77861:1;77837:21:::0;;77795:7;;-1:-1:-1;77837:25:0::1;::::0;-1:-1:-1;77861:1:0;77837:25:::1;:::i;:::-;77825:37;;77898:9;77889:5;:18;77885:210;;77960:14;77975:9;77960:25;;;;;;;;:::i;:::-;;;;;;;;77936:14;77951:5;77936:21;;;;;;;;:::i;:::-;;;;;;;;:49;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;78062:9:0::1;:5:::0;78070:1:::1;78062:9;:::i;:::-;78012:20;78033:14;78048:9;78033:25;;;;;;;;:::i;:::-;;;;;;;;78012:47;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:59;77885:210:::1;78117:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;78167;78188:10;78167:32;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;78160:39:::1;::::0;;;;-1:-1:-1;;;;;;78229:17:0;::::1;::::0;;;;;;;;;;78222:24;;-1:-1:-1;;;;;;78222:24:0::1;::::0;;78160:39;;-1:-1:-1;;;;;78274:67:0;::::1;::::0;::::1;::::0;::::1;::::0;78329:10;;78274:67:::1;:::i;:::-;;;;;;;;77611:1415;;;78388:20;78409:10;78388:32;;;;;;:::i;:::-;;;;;;;;;;;;;;78424:1;78388:37:::0;78384:642:::1;;-1:-1:-1::0;;;;;78458:25:0;::::1;::::0;78450:51:::1;;;::::0;-1:-1:-1;;;78450:51:0;;15756:2:1;78450:51:0::1;::::0;::::1;15738:21:1::0;15795:2;15775:18;;;15768:30;-1:-1:-1;;;15814:18:1;;;15807:43;15867:18;;78450:51:0::1;15554:337:1::0;78450:51:0::1;78544:9;78524;:17:::0;78534:6:::1;-1:-1:-1::0;;;;;78524:17:0::1;;-1:-1:-1::0;;;;;78524:17:0::1;;;;;;;;;;;;;;:29;;;;;-1:-1:-1::0;;;;;78524:29:0::1;;;;;-1:-1:-1::0;;;;;78524:29:0::1;;;;;;78576:14;78596:10;78576:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;78665:14:0::1;:21:::0;78630:32:::1;::::0;:20:::1;::::0;:32:::1;::::0;78651:10;;78630:32:::1;:::i;:::-;;;;;;;;;;;;;:56;;;;78749:9;-1:-1:-1::0;;;;;78714:65:0::1;78745:1;-1:-1:-1::0;;;;;78714:65:0::1;78729:6;-1:-1:-1::0;;;;;78714:65:0::1;;;78767:10;78714:65;;;;;;:::i;78384:642::-;78847:9;-1:-1:-1::0;;;;;78826:30:0::1;:9;:17:::0;78836:6:::1;-1:-1:-1::0;;;;;78826:17:0::1;;-1:-1:-1::0;;;;;78826:17:0::1;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;78826:17:0::1;-1:-1:-1::0;;;;;78826:30:0::1;;78822:204;;78901:9;78881;:17:::0;78891:6:::1;-1:-1:-1::0;;;;;78881:17:0::1;;-1:-1:-1::0;;;;;78881:17:0::1;;;;;;;;;;;;;;:29;;;;;-1:-1:-1::0;;;;;78881:29:0::1;;;;;-1:-1:-1::0;;;;;78881:29:0::1;;;;;;78974:9;-1:-1:-1::0;;;;;78938:66:0::1;78961:11;-1:-1:-1::0;;;;;78938:66:0::1;78953:6;-1:-1:-1::0;;;;;78938:66:0::1;;;78992:10;78938:66;;;;;;:::i;:::-;;;;;;;;78822:204;79068:19:::0;;::::1;::::0;77284:1819:::1;77185:5:::0;::::1;::::0;::::1;:::i;:::-;;;;77157:1957;;;79129:29;79143:14;;79129:29;;;;;;;:::i;:::-;;;;;;;;75507:3659;;;;;;;;;;75367:3799:::0;;;;;:::o;43670:125::-;43734:7;43761:21;43774:7;43761:12;:21::i;:::-;:26;;43670:125;-1:-1:-1;;43670:125:0:o;68583:21::-;;;;;;;:::i;41118:206::-;41182:7;-1:-1:-1;;;;;41206:19:0;;41202:60;;41234:28;;-1:-1:-1;;;41234:28:0;;;;;;;;;;;41202:60;-1:-1:-1;;;;;;41288:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;41288:27:0;;41118:206::o;8649:103::-;7887:13;:11;:13::i;:::-;8714:30:::1;8741:1;8714:18;:30::i;:::-;8649:103::o:0;67593:882::-;67654:16;67708:19;67742:25;67782:22;67807:16;67817:5;67807:9;:16::i;:::-;67782:41;;67838:25;67880:14;-1:-1:-1;;;;;67866:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67866:29:0;;67838:57;;67910:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;67910:31:0;39849:1;67956:471;68005:14;67990:11;:29;67956:471;;68057:14;;;;:11;:14;;;;;;;;;68045:26;;;;;;;;;-1:-1:-1;;;;;68045:26:0;;;;-1:-1:-1;;;68045:26:0;;-1:-1:-1;;;;;68045:26:0;;;;;;;;-1:-1:-1;;;68045:26:0;;;;;;;;;;;;;;-1:-1:-1;68135:8:0;68090:73;68185:14;;-1:-1:-1;;;;;68185:28:0;;68181:111;;68258:14;;;-1:-1:-1;68181:111:0;68335:5;-1:-1:-1;;;;;68314:26:0;:17;-1:-1:-1;;;;;68314:26:0;;68310:102;;68391:1;68365:8;68374:13;;;;;;68365:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;68310:102;68021:3;;67956:471;;;-1:-1:-1;68448:8:0;;67593:882;-1:-1:-1;;;;;;67593:882:0:o;44031:104::-;44087:13;44120:7;44113:14;;;;;:::i;64643:2501::-;64769:16;64835:4;64827:5;:12;64823:44;;;64848:19;;-1:-1:-1;;;64848:19:0;;;;;;;;;;;64823:44;64936:13;;64882:19;;64952:1;64936:17;65039:15;39849:1;;39766:92;65039:15;65031:5;:23;65027:87;;;39849:1;65075:23;;65027:87;65194:9;65187:4;:16;65183:73;;;65231:9;65224:16;;65183:73;65270:25;65298:16;65308:5;65298:9;:16::i;:::-;65270:44;;65492:4;65484:5;:12;65480:278;;;65539:12;;;65574:31;;;65570:111;;;65650:11;65630:31;;65570:111;65498:198;65480:278;;;-1:-1:-1;65741:1:0;65480:278;65772:25;65814:17;-1:-1:-1;;;;;65800:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65800:32:0;;65772:60;;65851:17;65872:1;65851:22;65847:78;;65901:8;-1:-1:-1;65894:15:0;;-1:-1:-1;;;65894:15:0;65847:78;66069:31;66103:26;66123:5;66103:19;:26::i;:::-;66069:60;;66144:25;66389:9;:16;;;66384:92;;-1:-1:-1;66446:14:0;;66384:92;66507:5;66490:477;66519:4;66514:1;:9;;:45;;;;;66542:17;66527:11;:32;;66514:45;66490:477;;;66597:14;;;;:11;:14;;;;;;;;;66585:26;;;;;;;;;-1:-1:-1;;;;;66585:26:0;;;;-1:-1:-1;;;66585:26:0;;-1:-1:-1;;;;;66585:26:0;;;;;;;;-1:-1:-1;;;66585:26:0;;;;;;;;;;;;;;-1:-1:-1;66675:8:0;66630:73;66725:14;;-1:-1:-1;;;;;66725:28:0;;66721:111;;66798:14;;;-1:-1:-1;66721:111:0;66875:5;-1:-1:-1;;;;;66854:26:0;:17;-1:-1:-1;;;;;66854:26:0;;66850:102;;66931:1;66905:8;66914:13;;;;;;66905:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;66850:102;66561:3;;66490:477;;;-1:-1:-1;;;67052:29:0;;;-1:-1:-1;67059:8:0;;-1:-1:-1;;64643:2501:0;;;;;;:::o;45665:317::-;-1:-1:-1;;;;;39594:23:0;;;;;;:17;:23;;;;;;45745:8;;39594:23;;39586:63;;;;-1:-1:-1;;;39586:63:0;;;;;;;:::i;:::-;6634:10;-1:-1:-1;;;;;45794:24:0;::::1;::::0;45790:54:::1;;45827:17;;-1:-1:-1::0;;;45827:17:0::1;;;;;;;;;;;45790:54;6634:10:::0;45857:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;-1:-1:-1;;;;;45857:42:0;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;45857:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45926:48;;893:41:1;;;45857:42:0;;6634:10;45926:48:::1;::::0;866:18:1;45926:48:0::1;;;;;;;45665:317:::0;;;:::o;51344:490::-;51513:19;;;;:10;:19;;;;;;51536:15;-1:-1:-1;51513:38:0;;:66;;-1:-1:-1;51555:19:0;;;;:10;:19;;;;;;:24;51513:66;51505:116;;;;-1:-1:-1;;;51505:116:0;;;;;;;:::i;:::-;51632:28;51642:4;51648:2;51652:7;51632:9;:28::i;:::-;-1:-1:-1;;;;;51675:13:0;;25689:19;:23;;51675:76;;;;;51695:56;51726:4;51732:2;51736:7;51745:5;51695:30;:56::i;:::-;51694:57;51675:76;51671:156;;;51775:40;;-1:-1:-1;;;51775:40:0;;;;;;;;;;;63226:409;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39849:1:0;63373:25;;;:53;;;63413:13;;63402:7;:24;;63373:53;63369:102;;;63450:9;63226:409;-1:-1:-1;;63226:409:0:o;63369:102::-;-1:-1:-1;63493:20:0;;;;:11;:20;;;;;;;;;63481:32;;;;;;;;;-1:-1:-1;;;;;63481:32:0;;;;-1:-1:-1;;;63481:32:0;;-1:-1:-1;;;;;63481:32:0;;;;;;;;-1:-1:-1;;;63481:32:0;;;;;;;;;;;;;;;;63524:65;;63568:9;63226:409;-1:-1:-1;;63226:409:0:o;63524:65::-;63606:21;63619:7;63606:12;:21::i;79241:289::-;79314:13;79348:16;79356:7;79348;:16::i;:::-;79340:76;;;;-1:-1:-1;;;79340:76:0;;16493:2:1;79340:76:0;;;16475:21:1;16532:2;16512:18;;;16505:30;16571:34;16551:18;;;16544:62;-1:-1:-1;;;16622:18:1;;;16615:45;16677:19;;79340:76:0;16291:411:1;79340:76:0;79460:1;79442:7;79436:21;;;;;:::i;:::-;;;:25;:86;;;;;;;;;;;;;;;;;79488:7;79497:18;:7;:16;:18::i;:::-;79471:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79429:93;79241:289;-1:-1:-1;;79241:289:0:o;46053:164::-;-1:-1:-1;;;;;46174:25:0;;;46150:4;46174:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46053:164::o;8907:201::-;7887:13;:11;:13::i;:::-;-1:-1:-1;;;;;8996:22:0;::::1;8988:73;;;::::0;-1:-1:-1;;;8988:73:0;;17289:2:1;8988:73:0::1;::::0;::::1;17271:21:1::0;17328:2;17308:18;;;17301:30;17367:34;17347:18;;;17340:62;-1:-1:-1;;;17418:18:1;;;17411:36;17464:19;;8988:73:0::1;17087:402:1::0;8988:73:0::1;9072:28;9091:8;9072:18;:28::i;:::-;8907:201:::0;:::o;46474:174::-;46531:4;46574:7;39849:1;46555:26;;:53;;;;;46595:13;;46585:7;:23;46555:53;:85;;;;-1:-1:-1;;46613:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;46613:27:0;;;;46612:28;;46474:174::o;59245:196::-;59360:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;59360:29:0;-1:-1:-1;;;;;59360:29:0;;;;;;;;;59405:28;;59360:24;;59405:28;;;;;;;59245:196;;;:::o;52088:2163::-;52204:10;39594:23;;;;:17;:23;;;;;;;;39586:63;;;;-1:-1:-1;;;39586:63:0;;;;;;;:::i;:::-;52236:35:::1;52274:21;52287:7;52274:12;:21::i;:::-;52236:59;;52334:4;-1:-1:-1::0;;;;;52312:26:0::1;:13;:18;;;-1:-1:-1::0;;;;;52312:26:0::1;;52308:67;;52347:28;;-1:-1:-1::0;;;52347:28:0::1;;;;;;;;;;;52308:67;52388:22;6634:10:::0;-1:-1:-1;;;;;52414:20:0;::::1;;::::0;:73:::1;;-1:-1:-1::0;52451:36:0::1;52468:4:::0;6634:10;46053:164;:::i;52451:36::-:1;52414:126;;;-1:-1:-1::0;6634:10:0;52504:20:::1;52516:7:::0;52504:11:::1;:20::i;:::-;-1:-1:-1::0;;;;;52504:36:0::1;;52414:126;52388:153;;52559:17;52554:66;;52585:35;;-1:-1:-1::0;;;52585:35:0::1;;;;;;;;;;;52554:66;-1:-1:-1::0;;;;;52635:16:0;::::1;52631:52;;52660:23;;-1:-1:-1::0;;;52660:23:0::1;;;;;;;;;;;52631:52;52804:35;52821:1;52825:7;52834:4;52804:8;:35::i;:::-;-1:-1:-1::0;;;;;53135:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;;;:31;;-1:-1:-1;;53135:31:0;;::::1;-1:-1:-1::0;;;;;53135:31:0;;::::1;-1:-1:-1::0;;53135:31:0;;::::1;;::::0;;;53181:16;;::::1;::::0;;;;;;:29;;;;::::1;::::0;;::::1;-1:-1:-1::0;53181:29:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;53261:20;;;:11:::1;:20:::0;;;;;;53296:18;;-1:-1:-1;;;;;;53329:49:0;;;;-1:-1:-1;;;53362:15:0::1;53329:49:::0;;::::1;::::0;;;::::1;;::::0;;53652:11;::::1;53712:24:::0;;;;;53755:13;;53261:20;;53712:24;;53755:13:::1;53751:384;;53965:13;;53950:11;:28;53946:174;;54003:20:::0;;54072:28:::1;::::0;::::1;::::0;-1:-1:-1;;;;;54046:54:0::1;-1:-1:-1::0;;;54046:54:0::1;-1:-1:-1::0;;;;;;54046:54:0;;;-1:-1:-1;;;;;54003:20:0;::::1;54046:54:::0;::::1;::::0;;53946:174:::1;53110:1036;;;54182:7;54178:2;-1:-1:-1::0;;;;;54163:27:0::1;54172:4;-1:-1:-1::0;;;;;54163:27:0::1;;;;;;;;;;;52225:2026;;52088:2163:::0;;;;:::o;8166:132::-;8074:6;;-1:-1:-1;;;;;8074:6:0;6634:10;8230:23;8222:68;;;;-1:-1:-1;;;8222:68:0;;17696:2:1;8222:68:0;;;17678:21:1;;;17715:18;;;17708:30;17774:34;17754:18;;;17747:62;17826:18;;8222:68:0;17494:356:1;42499:1109:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42610:7:0;;39849:1;42659:23;;:47;;;;;42693:13;;42686:4;:20;42659:47;42655:886;;;42727:31;42761:17;;;:11;:17;;;;;;;;;42727:51;;;;;;;;;-1:-1:-1;;;;;42727:51:0;;;;-1:-1:-1;;;42727:51:0;;-1:-1:-1;;;;;42727:51:0;;;;;;;;-1:-1:-1;;;42727:51:0;;;;;;;;;;;;;;42797:729;;42847:14;;-1:-1:-1;;;;;42847:28:0;;42843:101;;42911:9;42499:1109;-1:-1:-1;;;42499:1109:0:o;42843:101::-;-1:-1:-1;;;43286:6:0;43331:17;;;;:11;:17;;;;;;;;;43319:29;;;;;;;;;-1:-1:-1;;;;;43319:29:0;;;;;-1:-1:-1;;;43319:29:0;;-1:-1:-1;;;;;43319:29:0;;;;;;;;-1:-1:-1;;;43319:29:0;;;;;;;;;;;;;43379:28;43375:109;;43447:9;42499:1109;-1:-1:-1;;;42499:1109:0:o;43375:109::-;43246:261;;;42708:833;42655:886;43569:31;;-1:-1:-1;;;43569:31:0;;;;;;;;;;;9268:191;9361:6;;;-1:-1:-1;;;;;9378:17:0;;;-1:-1:-1;;;;;;9378:17:0;;;;;;;9411:40;;9361:6;;;9378:17;9361:6;;9411:40;;9342:16;;9411:40;9331:128;9268:191;:::o;59933:668::-;60118:72;;-1:-1:-1;;;60118:72:0;;60097:4;;-1:-1:-1;;;;;60118:36:0;;;;;:72;;6634:10;;60169:4;;60175:7;;60184:5;;60118:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60118:72:0;;;;;;;;-1:-1:-1;;60118:72:0;;;;;;;;;;;;:::i;:::-;;;60114:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60352:6;:13;60369:1;60352:18;60348:235;;60398:40;;-1:-1:-1;;;60398:40:0;;;;;;;;;;;60348:235;60541:6;60535:13;60526:6;60522:2;60518:15;60511:38;60114:480;-1:-1:-1;;;;;;60237:55:0;-1:-1:-1;;;60237:55:0;;-1:-1:-1;60114:480:0;59933:668;;;;;;:::o;33144:723::-;33200:13;33421:5;33430:1;33421:10;33417:53;;-1:-1:-1;;33448:10:0;;;;;;;;;;;;-1:-1:-1;;;33448:10:0;;;;;33144:723::o;33417:53::-;33495:5;33480:12;33536:78;33543:9;;33536:78;;33569:8;;;;:::i;:::-;;-1:-1:-1;33592:10:0;;-1:-1:-1;33600:2:0;33592:10;;:::i;:::-;;;33536:78;;;33624:19;33656:6;-1:-1:-1;;;;;33646:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33646:17:0;;33624:39;;33674:154;33681:10;;33674:154;;33708:11;33718:1;33708:11;;:::i;:::-;;-1:-1:-1;33777:10:0;33785:2;33777:5;:10;:::i;:::-;33764:24;;:2;:24;:::i;:::-;33751:39;;33734:6;33741;33734:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;33734:56:0;;;;;;;;-1:-1:-1;33805:11:0;33814:2;33805:11;;:::i;:::-;;;33674:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;367:131:1;-1:-1:-1;;;;;;441:32:1;;431:43;;421:71;;488:1;485;478:12;503:245;561:6;614:2;602:9;593:7;589:23;585:32;582:52;;;630:1;627;620:12;582:52;669:9;656:23;688:30;712:5;688:30;:::i;945:258::-;1017:1;1027:113;1041:6;1038:1;1035:13;1027:113;;;1117:11;;;1111:18;1098:11;;;1091:39;1063:2;1056:10;1027:113;;;1158:6;1155:1;1152:13;1149:48;;;-1:-1:-1;;1193:1:1;1175:16;;1168:27;945:258::o;1208:::-;1250:3;1288:5;1282:12;1315:6;1310:3;1303:19;1331:63;1387:6;1380:4;1375:3;1371:14;1364:4;1357:5;1353:16;1331:63;:::i;:::-;1448:2;1427:15;-1:-1:-1;;1423:29:1;1414:39;;;;1455:4;1410:50;;1208:258;-1:-1:-1;;1208:258:1:o;1471:220::-;1620:2;1609:9;1602:21;1583:4;1640:45;1681:2;1670:9;1666:18;1658:6;1640:45;:::i;1696:180::-;1755:6;1808:2;1796:9;1787:7;1783:23;1779:32;1776:52;;;1824:1;1821;1814:12;1776:52;-1:-1:-1;1847:23:1;;1696:180;-1:-1:-1;1696:180:1:o;2089:173::-;2157:20;;-1:-1:-1;;;;;2206:31:1;;2196:42;;2186:70;;2252:1;2249;2242:12;2186:70;2089:173;;;:::o;2267:254::-;2335:6;2343;2396:2;2384:9;2375:7;2371:23;2367:32;2364:52;;;2412:1;2409;2402:12;2364:52;2448:9;2435:23;2425:33;;2477:38;2511:2;2500:9;2496:18;2477:38;:::i;:::-;2467:48;;2267:254;;;;;:::o;2708:::-;2776:6;2784;2837:2;2825:9;2816:7;2812:23;2808:32;2805:52;;;2853:1;2850;2843:12;2805:52;2876:29;2895:9;2876:29;:::i;:::-;2866:39;2952:2;2937:18;;;;2924:32;;-1:-1:-1;;;2708:254:1:o;2967:328::-;3044:6;3052;3060;3113:2;3101:9;3092:7;3088:23;3084:32;3081:52;;;3129:1;3126;3119:12;3081:52;3152:29;3171:9;3152:29;:::i;:::-;3142:39;;3200:38;3234:2;3223:9;3219:18;3200:38;:::i;:::-;3190:48;;3285:2;3274:9;3270:18;3257:32;3247:42;;2967:328;;;;;:::o;3991:127::-;4052:10;4047:3;4043:20;4040:1;4033:31;4083:4;4080:1;4073:15;4107:4;4104:1;4097:15;4123:275;4194:2;4188:9;4259:2;4240:13;;-1:-1:-1;;4236:27:1;4224:40;;-1:-1:-1;;;;;4279:34:1;;4315:22;;;4276:62;4273:88;;;4341:18;;:::i;:::-;4377:2;4370:22;4123:275;;-1:-1:-1;4123:275:1:o;4403:407::-;4468:5;-1:-1:-1;;;;;4494:6:1;4491:30;4488:56;;;4524:18;;:::i;:::-;4562:57;4607:2;4586:15;;-1:-1:-1;;4582:29:1;4613:4;4578:40;4562:57;:::i;:::-;4553:66;;4642:6;4635:5;4628:21;4682:3;4673:6;4668:3;4664:16;4661:25;4658:45;;;4699:1;4696;4689:12;4658:45;4748:6;4743:3;4736:4;4729:5;4725:16;4712:43;4802:1;4795:4;4786:6;4779:5;4775:18;4771:29;4764:40;4403:407;;;;;:::o;4815:519::-;4893:6;4901;4954:2;4942:9;4933:7;4929:23;4925:32;4922:52;;;4970:1;4967;4960:12;4922:52;5006:9;4993:23;4983:33;;5067:2;5056:9;5052:18;5039:32;-1:-1:-1;;;;;5086:6:1;5083:30;5080:50;;;5126:1;5123;5116:12;5080:50;5149:22;;5202:4;5194:13;;5190:27;-1:-1:-1;5180:55:1;;5231:1;5228;5221:12;5180:55;5254:74;5320:7;5315:2;5302:16;5297:2;5293;5289:11;5254:74;:::i;:::-;5244:84;;;4815:519;;;;;:::o;5339:946::-;5423:6;5454:2;5497;5485:9;5476:7;5472:23;5468:32;5465:52;;;5513:1;5510;5503:12;5465:52;5553:9;5540:23;-1:-1:-1;;;;;5623:2:1;5615:6;5612:14;5609:34;;;5639:1;5636;5629:12;5609:34;5677:6;5666:9;5662:22;5652:32;;5722:7;5715:4;5711:2;5707:13;5703:27;5693:55;;5744:1;5741;5734:12;5693:55;5780:2;5767:16;5802:2;5798;5795:10;5792:36;;;5808:18;;:::i;:::-;5854:2;5851:1;5847:10;5837:20;;5877:28;5901:2;5897;5893:11;5877:28;:::i;:::-;5939:15;;;6009:11;;;6005:20;;;5970:12;;;;6037:19;;;6034:39;;;6069:1;6066;6059:12;6034:39;6093:11;;;;6113:142;6129:6;6124:3;6121:15;6113:142;;;6195:17;;6183:30;;6146:12;;;;6233;;;;6113:142;;;6274:5;5339:946;-1:-1:-1;;;;;;;;5339:946:1:o;6573:724::-;6808:2;6860:21;;;6930:13;;6833:18;;;6952:22;;;6779:4;;6808:2;7031:15;;;;7005:2;6990:18;;;6779:4;7074:197;7088:6;7085:1;7082:13;7074:197;;;7137:52;7185:3;7176:6;7170:13;6374:12;;-1:-1:-1;;;;;6370:38:1;6358:51;;6462:4;6451:16;;;6445:23;-1:-1:-1;;;;;6441:48:1;6425:14;;;6418:72;6553:4;6542:16;;;6536:23;6529:31;6522:39;6506:14;;6499:63;6290:278;7137:52;7246:15;;;;7218:4;7209:14;;;;;7110:1;7103:9;7074:197;;7302:348;7354:8;7364:6;7418:3;7411:4;7403:6;7399:17;7395:27;7385:55;;7436:1;7433;7426:12;7385:55;-1:-1:-1;7459:20:1;;-1:-1:-1;;;;;7491:30:1;;7488:50;;;7534:1;7531;7524:12;7488:50;7571:4;7563:6;7559:17;7547:29;;7623:3;7616:4;7607:6;7599;7595:19;7591:30;7588:39;7585:59;;;7640:1;7637;7630:12;7585:59;7302:348;;;;;:::o;7655:795::-;7756:6;7764;7772;7780;7788;7841:2;7829:9;7820:7;7816:23;7812:32;7809:52;;;7857:1;7854;7847:12;7809:52;7880:29;7899:9;7880:29;:::i;:::-;7870:39;;7960:2;7949:9;7945:18;7932:32;-1:-1:-1;;;;;8024:2:1;8016:6;8013:14;8010:34;;;8040:1;8037;8030:12;8010:34;8079:59;8130:7;8121:6;8110:9;8106:22;8079:59;:::i;:::-;8157:8;;-1:-1:-1;8053:85:1;-1:-1:-1;8245:2:1;8230:18;;8217:32;;-1:-1:-1;8261:16:1;;;8258:36;;;8290:1;8287;8280:12;8258:36;;8329:61;8382:7;8371:8;8360:9;8356:24;8329:61;:::i;:::-;7655:795;;;;-1:-1:-1;7655:795:1;;-1:-1:-1;8409:8:1;;8303:87;7655:795;-1:-1:-1;;;7655:795:1:o;8455:186::-;8514:6;8567:2;8555:9;8546:7;8542:23;8538:32;8535:52;;;8583:1;8580;8573:12;8535:52;8606:29;8625:9;8606:29;:::i;8646:632::-;8817:2;8869:21;;;8939:13;;8842:18;;;8961:22;;;8788:4;;8817:2;9040:15;;;;9014:2;8999:18;;;8788:4;9083:169;9097:6;9094:1;9091:13;9083:169;;;9158:13;;9146:26;;9227:15;;;;9192:12;;;;9119:1;9112:9;9083:169;;9689:322;9766:6;9774;9782;9835:2;9823:9;9814:7;9810:23;9806:32;9803:52;;;9851:1;9848;9841:12;9803:52;9874:29;9893:9;9874:29;:::i;:::-;9864:39;9950:2;9935:18;;9922:32;;-1:-1:-1;10001:2:1;9986:18;;;9973:32;;9689:322;-1:-1:-1;;;9689:322:1:o;10016:347::-;10081:6;10089;10142:2;10130:9;10121:7;10117:23;10113:32;10110:52;;;10158:1;10155;10148:12;10110:52;10181:29;10200:9;10181:29;:::i;:::-;10171:39;;10260:2;10249:9;10245:18;10232:32;10307:5;10300:13;10293:21;10286:5;10283:32;10273:60;;10329:1;10326;10319:12;10273:60;10352:5;10342:15;;;10016:347;;;;;:::o;10368:667::-;10463:6;10471;10479;10487;10540:3;10528:9;10519:7;10515:23;10511:33;10508:53;;;10557:1;10554;10547:12;10508:53;10580:29;10599:9;10580:29;:::i;:::-;10570:39;;10628:38;10662:2;10651:9;10647:18;10628:38;:::i;:::-;10618:48;;10713:2;10702:9;10698:18;10685:32;10675:42;;10768:2;10757:9;10753:18;10740:32;-1:-1:-1;;;;;10787:6:1;10784:30;10781:50;;;10827:1;10824;10817:12;10781:50;10850:22;;10903:4;10895:13;;10891:27;-1:-1:-1;10881:55:1;;10932:1;10929;10922:12;10881:55;10955:74;11021:7;11016:2;11003:16;10998:2;10994;10990:11;10955:74;:::i;:::-;10945:84;;;10368:667;;;;;;;:::o;11040:267::-;6374:12;;-1:-1:-1;;;;;6370:38:1;6358:51;;6462:4;6451:16;;;6445:23;-1:-1:-1;;;;;6441:48:1;6425:14;;;6418:72;6553:4;6542:16;;;6536:23;6529:31;6522:39;6506:14;;;6499:63;11238:2;11223:18;;11250:51;6290:278;11312:260;11380:6;11388;11441:2;11429:9;11420:7;11416:23;11412:32;11409:52;;;11457:1;11454;11447:12;11409:52;11480:29;11499:9;11480:29;:::i;:::-;11470:39;;11528:38;11562:2;11551:9;11547:18;11528:38;:::i;11577:380::-;11656:1;11652:12;;;;11699;;;11720:61;;11774:4;11766:6;11762:17;11752:27;;11720:61;11827:2;11819:6;11816:14;11796:18;11793:38;11790:161;;11873:10;11868:3;11864:20;11861:1;11854:31;11908:4;11905:1;11898:15;11936:4;11933:1;11926:15;11790:161;;11577:380;;;:::o;11962:352::-;12164:2;12146:21;;;12203:2;12183:18;;;12176:30;12242;12237:2;12222:18;;12215:58;12305:2;12290:18;;11962:352::o;12319:400::-;12521:2;12503:21;;;12560:2;12540:18;;;12533:30;12599:34;12594:2;12579:18;;12572:62;-1:-1:-1;;;12665:2:1;12650:18;;12643:34;12709:3;12694:19;;12319:400::o;12724:127::-;12785:10;12780:3;12776:20;12773:1;12766:31;12816:4;12813:1;12806:15;12840:4;12837:1;12830:15;13282:127;13343:10;13338:3;13334:20;13331:1;13324:31;13374:4;13371:1;13364:15;13398:4;13395:1;13388:15;13414:135;13453:3;13474:17;;;13471:43;;13494:18;;:::i;:::-;-1:-1:-1;13541:1:1;13530:13;;13414:135::o;13554:125::-;13594:4;13622:1;13619;13616:8;13613:34;;;13627:18;;:::i;:::-;-1:-1:-1;13664:9:1;;13554:125::o;13684:274::-;13813:3;13851:6;13845:13;13867:53;13913:6;13908:3;13901:4;13893:6;13889:17;13867:53;:::i;:::-;13936:16;;;;;13684:274;-1:-1:-1;;13684:274:1:o;13963:136::-;14002:3;14030:5;14020:39;;14039:18;;:::i;:::-;-1:-1:-1;;;14075:18:1;;13963:136::o;14104:128::-;14144:3;14175:1;14171:6;14168:1;14165:13;14162:39;;;14181:18;;:::i;:::-;-1:-1:-1;14217:9:1;;14104:128::o;14237:981::-;14321:12;;14286:3;;14376:1;14396:18;;;;14449;;;;14476:61;;14530:4;14522:6;14518:17;14508:27;;14476:61;14556:2;14604;14596:6;14593:14;14573:18;14570:38;14567:161;;14650:10;14645:3;14641:20;14638:1;14631:31;14685:4;14682:1;14675:15;14713:4;14710:1;14703:15;14567:161;14744:18;14771:104;;;;14889:1;14884:328;;;;14737:475;;14771:104;-1:-1:-1;;14804:24:1;;14792:37;;14849:16;;;;-1:-1:-1;14771:104:1;;14884:328;14915:5;14912:1;14905:16;14962:2;14959:1;14949:16;14987:1;15001:165;15015:6;15012:1;15009:13;15001:165;;;15093:14;;15080:11;;;15073:35;15136:16;;;;15030:10;;15001:165;;;15005:3;;15195:6;15190:3;15186:16;15179:23;;14737:475;;;;;;;14237:981;;;;:::o;15223:194::-;15349:3;15374:37;15407:3;15399:6;15374:37;:::i;15422:127::-;15483:10;15478:3;15474:20;15471:1;15464:31;15514:4;15511:1;15504:15;15538:4;15535:1;15528:15;15896:390;16055:2;16044:9;16037:21;16094:6;16089:2;16078:9;16074:18;16067:34;16151:6;16143;16138:2;16127:9;16123:18;16110:48;16207:1;16178:22;;;16202:2;16174:31;;;16167:42;;;;16270:2;16249:15;;;-1:-1:-1;;16245:29:1;16230:45;16226:54;;15896:390;-1:-1:-1;15896:390:1:o;16707:375::-;16883:3;16911:37;16944:3;16936:6;16911:37;:::i;:::-;16977:6;16971:13;16993:52;17038:6;17034:2;17027:4;17019:6;17015:17;16993:52;:::i;:::-;17061:15;;16707:375;-1:-1:-1;;;;16707:375:1:o;17855:489::-;-1:-1:-1;;;;;18124:15:1;;;18106:34;;18176:15;;18171:2;18156:18;;18149:43;18223:2;18208:18;;18201:34;;;18271:3;18266:2;18251:18;;18244:31;;;18049:4;;18292:46;;18318:19;;18310:6;18292:46;:::i;:::-;18284:54;17855:489;-1:-1:-1;;;;;;17855:489:1:o;18349:249::-;18418:6;18471:2;18459:9;18450:7;18446:23;18442:32;18439:52;;;18487:1;18484;18477:12;18439:52;18519:9;18513:16;18538:30;18562:5;18538:30;:::i;18603:127::-;18664:10;18659:3;18655:20;18652:1;18645:31;18695:4;18692:1;18685:15;18719:4;18716:1;18709:15;18735:120;18775:1;18801;18791:35;;18806:18;;:::i;:::-;-1:-1:-1;18840:9:1;;18735:120::o;18860:112::-;18892:1;18918;18908:35;;18923:18;;:::i;:::-;-1:-1:-1;18957:9:1;;18860:112::o
Swarm Source
ipfs://619eac014cde3aab16a86324ad8c894f4fd84ffb38d64d83e0558a8ebc4fe924
Loading...
Loading
Loading...
Loading
[ 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.