More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 4858882 | 10 hrs ago | IN | 0 APE | 0.05236095 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Gimmedaloot
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-21 */ // SPDX-License-Identifier: MIT // 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); } // 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; } } // OpenZeppelin Contracts (last updated v4.9.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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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); } // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } } // OpenZeppelin Contracts (last updated v4.9.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; } } } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // 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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // OpenZeppelin Contracts (last updated v4.9.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } pragma solidity ^0.8.0; contract Gimmedaloot is Ownable, IERC721Receiver, ReentrancyGuard, Pausable { using EnumerableSet for EnumerableSet.UintSet; //addresses address nullAddress = 0x0000000000000000000000000000000000000000; address public apelootAddress; address public lootAddress; //uint256's uint256 public expiration; //rate governs how often you receive your token uint256 public rate; // mappings mapping(address => EnumerableSet.UintSet) private _deposits; mapping(address => mapping(uint256 => uint256)) public _depositBlocks; constructor( address _apelootAddress, uint256 _rate, uint256 _expiration, address _lootAddress ) { apelootAddress = _apelootAddress; rate = _rate; expiration = block.number + _expiration; lootAddress = _lootAddress; _pause(); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } /* LOOT MECHANICS */ // Set a multiplier for how many tokens to earn each time a block passes. function setRate(uint256 _rate) public onlyOwner() { rate = _rate; } // Set this to a block to disable the ability to continue accruing tokens past that block number. function setExpiration(uint256 _expiration) public onlyOwner() { expiration = block.number + _expiration; } //check deposit amount. function depositsOf(address account) external view returns (uint256[] memory) { EnumerableSet.UintSet storage depositSet = _deposits[account]; uint256[] memory tokenIds = new uint256[] (depositSet.length()); for (uint256 i; i < depositSet.length(); i++) { tokenIds[i] = depositSet.at(i); } return tokenIds; } function calculateRewards(address account, uint256[] memory tokenIds) public view returns (uint256[] memory rewards) { rewards = new uint256[](tokenIds.length); for (uint256 i; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; rewards[i] = rate * (_deposits[account].contains(tokenId) ? 1 : 0) * (Math.min(block.number, expiration) - _depositBlocks[account][tokenId]); } return rewards; } //reward amount by address/tokenIds[] function calculateReward(address account, uint256 tokenId) public view returns (uint256) { require(Math.min(block.number, expiration) > _depositBlocks[account][tokenId], "Invalid blocks"); return rate * (_deposits[account].contains(tokenId) ? 1 : 0) * (Math.min(block.number, expiration) - _depositBlocks[account][tokenId]); } //reward claim function function claimRewards(uint256[] calldata tokenIds) public whenNotPaused { uint256 reward; uint256 blockCur = Math.min(block.number, expiration); for (uint256 i; i < tokenIds.length; i++) { reward += calculateReward(msg.sender, tokenIds[i]); _depositBlocks[msg.sender][tokenIds[i]] = blockCur; } if (reward > 0) { IERC20(lootAddress).transfer(msg.sender, reward); } } //deposit function. function deposit(uint256[] calldata tokenIds) external whenNotPaused { require(msg.sender != apelootAddress, "Invalid address"); claimRewards(tokenIds); for (uint256 i; i < tokenIds.length; i++) { IERC721(apelootAddress).safeTransferFrom( msg.sender, address(this), tokenIds[i], "" ); _deposits[msg.sender].add(tokenIds[i]); } } //withdrawal function. function withdraw(uint256[] calldata tokenIds) external whenNotPaused nonReentrant() { claimRewards(tokenIds); for (uint256 i; i < tokenIds.length; i++) { require( _deposits[msg.sender].contains(tokenIds[i]), "Ape Loot token not deposited" ); _deposits[msg.sender].remove(tokenIds[i]); IERC721(apelootAddress).safeTransferFrom( address(this), msg.sender, tokenIds[i], "" ); } } //withdrawal function. function withdrawTokens() external onlyOwner { uint256 tokenSupply = IERC20(lootAddress).balanceOf(address(this)); IERC20(lootAddress).transfer(msg.sender, tokenSupply); } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_apelootAddress","type":"address"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_expiration","type":"uint256"},{"internalType":"address","name":"_lootAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_depositBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apelootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"calculateRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"setExpiration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040525f600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015610050575f80fd5b506040516126103803806126108339818101604052810190610072919061038a565b61008e61008361015e60201b60201c565b61016560201b60201c565b600180819055505f60025f6101000a81548160ff0219169083151502179055508360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826006819055508143610101919061041b565b6005819055508060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061015561022660201b60201c565b505050506104ee565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61023461029460201b60201c565b600160025f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861027d61015e60201b60201c565b60405161028a919061045d565b60405180910390a1565b6102a26102e460201b60201c565b156102e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d9906104d0565b60405180910390fd5b565b5f60025f9054906101000a900460ff16905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610326826102fd565b9050919050565b6103368161031c565b8114610340575f80fd5b50565b5f815190506103518161032d565b92915050565b5f819050919050565b61036981610357565b8114610373575f80fd5b50565b5f8151905061038481610360565b92915050565b5f805f80608085870312156103a2576103a16102f9565b5b5f6103af87828801610343565b94505060206103c087828801610376565b93505060406103d187828801610376565b92505060606103e287828801610343565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61042582610357565b915061043083610357565b9250828201905080821115610448576104476103ee565b5b92915050565b6104578161031c565b82525050565b5f6020820190506104705f83018461044e565b92915050565b5f82825260208201905092915050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6104ba601083610476565b91506104c582610486565b602082019050919050565b5f6020820190508181035f8301526104e7816104ae565b9050919050565b612115806104fb5f395ff3fe608060405234801561000f575f80fd5b5060043610610135575f3560e01c80635c975abb116100b65780638d8f2adb1161007a5780638d8f2adb146102ed5780638da5cb5b146102f7578063983d95ce14610315578063b343ae1414610331578063e3a9db1a14610361578063f2fde38b1461039157610135565b80635c975abb146102815780635eac62391461029f5780635f2f213a146102bb578063715018a6146102d95780638456cb59146102e357610135565b806334fcf437116100fd57806334fcf437146102055780633f4ba83a146102215780634665096d1461022b578063515a20ba14610249578063598b8e711461026557610135565b8063068c526f146101395780630e43932614610169578063150b7a02146101875780631852e8d9146101b75780632c4e722e146101e7575b5f80fd5b610153600480360381019061014e91906116ed565b6103ad565b60405161016091906117fe565b60405180910390f35b610171610531565b60405161017e919061182d565b60405180910390f35b6101a1600480360381019061019c919061189f565b610556565b6040516101ae919061195d565b60405180910390f35b6101d160048036038101906101cc9190611976565b61056a565b6040516101de91906119c3565b60405180910390f35b6101ef6106e5565b6040516101fc91906119c3565b60405180910390f35b61021f600480360381019061021a91906119dc565b6106eb565b005b6102296106fd565b005b61023361070f565b60405161024091906119c3565b60405180910390f35b610263600480360381019061025e91906119dc565b610715565b005b61027f600480360381019061027a9190611a5c565b610732565b005b6102896108ff565b6040516102969190611ac1565b60405180910390f35b6102b960048036038101906102b49190611a5c565b610914565b005b6102c3610a8d565b6040516102d0919061182d565b60405180910390f35b6102e1610ab2565b005b6102eb610ac5565b005b6102f5610ad7565b005b6102ff610c1b565b60405161030c919061182d565b60405180910390f35b61032f600480360381019061032a9190611a5c565b610c42565b005b61034b60048036038101906103469190611976565b610e37565b60405161035891906119c3565b60405180910390f35b61037b60048036038101906103769190611ada565b610e57565b60405161038891906117fe565b60405180910390f35b6103ab60048036038101906103a69190611ada565b610f49565b005b6060815167ffffffffffffffff8111156103ca576103c961157e565b5b6040519080825280602002602001820160405280156103f85781602001602082028036833780820191505090505b5090505f5b825181101561052a575f83828151811061041a57610419611b05565b5b6020026020010151905060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205461047d43600554610fcb565b6104879190611b5f565b6104d68260075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b6104e0575f6104e3565b60015b60ff166006546104f39190611b92565b6104fd9190611b92565b8383815181106105105761050f611b05565b5b6020026020010181815250505080806001019150506103fd565b5092915050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f63150b7a0260e01b905095945050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546105c443600554610fcb565b11610604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fb90611c2d565b60405180910390fd5b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461065d43600554610fcb565b6106679190611b5f565b6106b68360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b6106c0575f6106c3565b60015b60ff166006546106d39190611b92565b6106dd9190611b92565b905092915050565b60065481565b6106f3610ffa565b8060068190555050565b610705610ffa565b61070d611078565b565b60055481565b61071d610ffa565b80436107299190611c4b565b60058190555050565b61073a6110d9565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090611cc8565b60405180910390fd5b6107d38282610914565b5f5b828290508110156108fa5760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061083257610831611b05565b5b905060200201356040518463ffffffff1660e01b815260040161085793929190611d19565b5f604051808303815f87803b15801561086e575f80fd5b505af1158015610880573d5f803e3d5ffd5b505050506108ec83838381811061089a57610899611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061112390919063ffffffff16565b5080806001019150506107d5565b505050565b5f60025f9054906101000a900460ff16905090565b61091c6110d9565b5f8061092a43600554610fcb565b90505f5b848490508110156109e05761095c338686848181106109505761094f611b05565b5b9050602002013561056a565b836109679190611c4b565b92508160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8787858181106109bb576109ba611b05565b5b9050602002013581526020019081526020015f2081905550808060010191505061092e565b505f821115610a875760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610a45929190611d61565b6020604051808303815f875af1158015610a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a859190611db2565b505b50505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aba610ffa565b610ac35f61113a565b565b610acd610ffa565b610ad56111fb565b565b610adf610ffa565b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b3a919061182d565b602060405180830381865afa158015610b55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b799190611df1565b905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610bd7929190611d61565b6020604051808303815f875af1158015610bf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c179190611db2565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c4a6110d9565b610c5261125d565b610c5c8282610914565b5f5b82829050811015610e2a57610cd1838383818110610c7f57610c7e611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790611e66565b60405180910390fd5b610d78838383818110610d2657610d25611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206112ac90919063ffffffff16565b5060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3033868686818110610dcb57610dca611b05565b5b905060200201356040518463ffffffff1660e01b8152600401610df093929190611d19565b5f604051808303815f87803b158015610e07575f80fd5b505af1158015610e19573d5f803e3d5ffd5b505050508080600101915050610c5e565b50610e336112c3565b5050565b6008602052815f5260405f20602052805f5260405f205f91509150505481565b60605f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610ea3826112cc565b67ffffffffffffffff811115610ebc57610ebb61157e565b5b604051908082528060200260200182016040528015610eea5781602001602082028036833780820191505090505b5090505f5b610ef8836112cc565b811015610f3e57610f1281846112df90919063ffffffff16565b828281518110610f2557610f24611b05565b5b6020026020010181815250508080600101915050610eef565b508092505050919050565b610f51610ffa565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690611ef4565b60405180910390fd5b610fc88161113a565b50565b5f818310610fd95781610fdb565b825b905092915050565b5f610ff2835f01835f1b6112f6565b905092915050565b611002611316565b73ffffffffffffffffffffffffffffffffffffffff16611020610c1b565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90611f5c565b60405180910390fd5b565b61108061131d565b5f60025f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6110c2611316565b6040516110cf919061182d565b60405180910390a1565b6110e16108ff565b15611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890611fc4565b60405180910390fd5b565b5f611132835f01835f1b611366565b905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6112036110d9565b600160025f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611246611316565b604051611253919061182d565b60405180910390a1565b6002600154036112a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112999061202c565b60405180910390fd5b6002600181905550565b5f6112bb835f01835f1b6113cd565b905092915050565b60018081905550565b5f6112d8825f016114c9565b9050919050565b5f6112ec835f01836114d8565b5f1c905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f33905090565b6113256108ff565b611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90612094565b60405180910390fd5b565b5f61137183836112f6565b6113c357825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506113c7565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f81146114be575f6001826113fa9190611b5f565b90505f6001865f01805490506114109190611b5f565b9050818114611476575f865f01828154811061142f5761142e611b05565b5b905f5260205f200154905080875f0184815481106114505761144f611b05565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611489576114886120b2565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506114c3565b5f9150505b92915050565b5f815f01805490509050919050565b5f825f0182815481106114ee576114ed611b05565b5b905f5260205f200154905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61153982611510565b9050919050565b6115498161152f565b8114611553575f80fd5b50565b5f8135905061156481611540565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115b48261156e565b810181811067ffffffffffffffff821117156115d3576115d261157e565b5b80604052505050565b5f6115e56114ff565b90506115f182826115ab565b919050565b5f67ffffffffffffffff8211156116105761160f61157e565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61163781611625565b8114611641575f80fd5b50565b5f813590506116528161162e565b92915050565b5f61166a611665846115f6565b6115dc565b9050808382526020820190506020840283018581111561168d5761168c611621565b5b835b818110156116b657806116a28882611644565b84526020840193505060208101905061168f565b5050509392505050565b5f82601f8301126116d4576116d361156a565b5b81356116e4848260208601611658565b91505092915050565b5f806040838503121561170357611702611508565b5b5f61171085828601611556565b925050602083013567ffffffffffffffff8111156117315761173061150c565b5b61173d858286016116c0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61177981611625565b82525050565b5f61178a8383611770565b60208301905092915050565b5f602082019050919050565b5f6117ac82611747565b6117b68185611751565b93506117c183611761565b805f5b838110156117f15781516117d8888261177f565b97506117e383611796565b9250506001810190506117c4565b5085935050505092915050565b5f6020820190508181035f83015261181681846117a2565b905092915050565b6118278161152f565b82525050565b5f6020820190506118405f83018461181e565b92915050565b5f80fd5b5f8083601f84011261185f5761185e61156a565b5b8235905067ffffffffffffffff81111561187c5761187b611846565b5b60208301915083600182028301111561189857611897611621565b5b9250929050565b5f805f805f608086880312156118b8576118b7611508565b5b5f6118c588828901611556565b95505060206118d688828901611556565b94505060406118e788828901611644565b935050606086013567ffffffffffffffff8111156119085761190761150c565b5b6119148882890161184a565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61195781611923565b82525050565b5f6020820190506119705f83018461194e565b92915050565b5f806040838503121561198c5761198b611508565b5b5f61199985828601611556565b92505060206119aa85828601611644565b9150509250929050565b6119bd81611625565b82525050565b5f6020820190506119d65f8301846119b4565b92915050565b5f602082840312156119f1576119f0611508565b5b5f6119fe84828501611644565b91505092915050565b5f8083601f840112611a1c57611a1b61156a565b5b8235905067ffffffffffffffff811115611a3957611a38611846565b5b602083019150836020820283011115611a5557611a54611621565b5b9250929050565b5f8060208385031215611a7257611a71611508565b5b5f83013567ffffffffffffffff811115611a8f57611a8e61150c565b5b611a9b85828601611a07565b92509250509250929050565b5f8115159050919050565b611abb81611aa7565b82525050565b5f602082019050611ad45f830184611ab2565b92915050565b5f60208284031215611aef57611aee611508565b5b5f611afc84828501611556565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b6982611625565b9150611b7483611625565b9250828203905081811115611b8c57611b8b611b32565b5b92915050565b5f611b9c82611625565b9150611ba783611625565b9250828202611bb581611625565b91508282048414831517611bcc57611bcb611b32565b5b5092915050565b5f82825260208201905092915050565b7f496e76616c696420626c6f636b730000000000000000000000000000000000005f82015250565b5f611c17600e83611bd3565b9150611c2282611be3565b602082019050919050565b5f6020820190508181035f830152611c4481611c0b565b9050919050565b5f611c5582611625565b9150611c6083611625565b9250828201905080821115611c7857611c77611b32565b5b92915050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f611cb2600f83611bd3565b9150611cbd82611c7e565b602082019050919050565b5f6020820190508181035f830152611cdf81611ca6565b9050919050565b5f82825260208201905092915050565b50565b5f611d045f83611ce6565b9150611d0f82611cf6565b5f82019050919050565b5f608082019050611d2c5f83018661181e565b611d39602083018561181e565b611d4660408301846119b4565b8181036060830152611d5781611cf9565b9050949350505050565b5f604082019050611d745f83018561181e565b611d8160208301846119b4565b9392505050565b611d9181611aa7565b8114611d9b575f80fd5b50565b5f81519050611dac81611d88565b92915050565b5f60208284031215611dc757611dc6611508565b5b5f611dd484828501611d9e565b91505092915050565b5f81519050611deb8161162e565b92915050565b5f60208284031215611e0657611e05611508565b5b5f611e1384828501611ddd565b91505092915050565b7f417065204c6f6f7420746f6b656e206e6f74206465706f7369746564000000005f82015250565b5f611e50601c83611bd3565b9150611e5b82611e1c565b602082019050919050565b5f6020820190508181035f830152611e7d81611e44565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611ede602683611bd3565b9150611ee982611e84565b604082019050919050565b5f6020820190508181035f830152611f0b81611ed2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f46602083611bd3565b9150611f5182611f12565b602082019050919050565b5f6020820190508181035f830152611f7381611f3a565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f611fae601083611bd3565b9150611fb982611f7a565b602082019050919050565b5f6020820190508181035f830152611fdb81611fa2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612016601f83611bd3565b915061202182611fe2565b602082019050919050565b5f6020820190508181035f8301526120438161200a565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f61207e601483611bd3565b91506120898261204a565b602082019050919050565b5f6020820190508181035f8301526120ab81612072565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220d112ef93904e28d08055d87f6769a09ed6e3f26f7980347f217243720a070c1b64736f6c634300081a0033000000000000000000000000f39c9a863e2840a6c35068fdbc88c05a961aee0000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000004ec551c12ddce80f1d667b7c0a1bc3d0eb877837
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610135575f3560e01c80635c975abb116100b65780638d8f2adb1161007a5780638d8f2adb146102ed5780638da5cb5b146102f7578063983d95ce14610315578063b343ae1414610331578063e3a9db1a14610361578063f2fde38b1461039157610135565b80635c975abb146102815780635eac62391461029f5780635f2f213a146102bb578063715018a6146102d95780638456cb59146102e357610135565b806334fcf437116100fd57806334fcf437146102055780633f4ba83a146102215780634665096d1461022b578063515a20ba14610249578063598b8e711461026557610135565b8063068c526f146101395780630e43932614610169578063150b7a02146101875780631852e8d9146101b75780632c4e722e146101e7575b5f80fd5b610153600480360381019061014e91906116ed565b6103ad565b60405161016091906117fe565b60405180910390f35b610171610531565b60405161017e919061182d565b60405180910390f35b6101a1600480360381019061019c919061189f565b610556565b6040516101ae919061195d565b60405180910390f35b6101d160048036038101906101cc9190611976565b61056a565b6040516101de91906119c3565b60405180910390f35b6101ef6106e5565b6040516101fc91906119c3565b60405180910390f35b61021f600480360381019061021a91906119dc565b6106eb565b005b6102296106fd565b005b61023361070f565b60405161024091906119c3565b60405180910390f35b610263600480360381019061025e91906119dc565b610715565b005b61027f600480360381019061027a9190611a5c565b610732565b005b6102896108ff565b6040516102969190611ac1565b60405180910390f35b6102b960048036038101906102b49190611a5c565b610914565b005b6102c3610a8d565b6040516102d0919061182d565b60405180910390f35b6102e1610ab2565b005b6102eb610ac5565b005b6102f5610ad7565b005b6102ff610c1b565b60405161030c919061182d565b60405180910390f35b61032f600480360381019061032a9190611a5c565b610c42565b005b61034b60048036038101906103469190611976565b610e37565b60405161035891906119c3565b60405180910390f35b61037b60048036038101906103769190611ada565b610e57565b60405161038891906117fe565b60405180910390f35b6103ab60048036038101906103a69190611ada565b610f49565b005b6060815167ffffffffffffffff8111156103ca576103c961157e565b5b6040519080825280602002602001820160405280156103f85781602001602082028036833780820191505090505b5090505f5b825181101561052a575f83828151811061041a57610419611b05565b5b6020026020010151905060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8281526020019081526020015f205461047d43600554610fcb565b6104879190611b5f565b6104d68260075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b6104e0575f6104e3565b60015b60ff166006546104f39190611b92565b6104fd9190611b92565b8383815181106105105761050f611b05565b5b6020026020010181815250505080806001019150506103fd565b5092915050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f63150b7a0260e01b905095945050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546105c443600554610fcb565b11610604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fb90611c2d565b60405180910390fd5b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461065d43600554610fcb565b6106679190611b5f565b6106b68360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b6106c0575f6106c3565b60015b60ff166006546106d39190611b92565b6106dd9190611b92565b905092915050565b60065481565b6106f3610ffa565b8060068190555050565b610705610ffa565b61070d611078565b565b60055481565b61071d610ffa565b80436107299190611c4b565b60058190555050565b61073a6110d9565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c090611cc8565b60405180910390fd5b6107d38282610914565b5f5b828290508110156108fa5760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde333086868681811061083257610831611b05565b5b905060200201356040518463ffffffff1660e01b815260040161085793929190611d19565b5f604051808303815f87803b15801561086e575f80fd5b505af1158015610880573d5f803e3d5ffd5b505050506108ec83838381811061089a57610899611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061112390919063ffffffff16565b5080806001019150506107d5565b505050565b5f60025f9054906101000a900460ff16905090565b61091c6110d9565b5f8061092a43600554610fcb565b90505f5b848490508110156109e05761095c338686848181106109505761094f611b05565b5b9050602002013561056a565b836109679190611c4b565b92508160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8787858181106109bb576109ba611b05565b5b9050602002013581526020019081526020015f2081905550808060010191505061092e565b505f821115610a875760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610a45929190611d61565b6020604051808303815f875af1158015610a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a859190611db2565b505b50505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aba610ffa565b610ac35f61113a565b565b610acd610ffa565b610ad56111fb565b565b610adf610ffa565b5f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b3a919061182d565b602060405180830381865afa158015610b55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b799190611df1565b905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610bd7929190611d61565b6020604051808303815f875af1158015610bf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c179190611db2565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c4a6110d9565b610c5261125d565b610c5c8282610914565b5f5b82829050811015610e2a57610cd1838383818110610c7f57610c7e611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20610fe390919063ffffffff16565b610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790611e66565b60405180910390fd5b610d78838383818110610d2657610d25611b05565b5b9050602002013560075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206112ac90919063ffffffff16565b5060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3033868686818110610dcb57610dca611b05565b5b905060200201356040518463ffffffff1660e01b8152600401610df093929190611d19565b5f604051808303815f87803b158015610e07575f80fd5b505af1158015610e19573d5f803e3d5ffd5b505050508080600101915050610c5e565b50610e336112c3565b5050565b6008602052815f5260405f20602052805f5260405f205f91509150505481565b60605f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f610ea3826112cc565b67ffffffffffffffff811115610ebc57610ebb61157e565b5b604051908082528060200260200182016040528015610eea5781602001602082028036833780820191505090505b5090505f5b610ef8836112cc565b811015610f3e57610f1281846112df90919063ffffffff16565b828281518110610f2557610f24611b05565b5b6020026020010181815250508080600101915050610eef565b508092505050919050565b610f51610ffa565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb690611ef4565b60405180910390fd5b610fc88161113a565b50565b5f818310610fd95781610fdb565b825b905092915050565b5f610ff2835f01835f1b6112f6565b905092915050565b611002611316565b73ffffffffffffffffffffffffffffffffffffffff16611020610c1b565b73ffffffffffffffffffffffffffffffffffffffff1614611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d90611f5c565b60405180910390fd5b565b61108061131d565b5f60025f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6110c2611316565b6040516110cf919061182d565b60405180910390a1565b6110e16108ff565b15611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890611fc4565b60405180910390fd5b565b5f611132835f01835f1b611366565b905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6112036110d9565b600160025f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611246611316565b604051611253919061182d565b60405180910390a1565b6002600154036112a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112999061202c565b60405180910390fd5b6002600181905550565b5f6112bb835f01835f1b6113cd565b905092915050565b60018081905550565b5f6112d8825f016114c9565b9050919050565b5f6112ec835f01836114d8565b5f1c905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f33905090565b6113256108ff565b611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b90612094565b60405180910390fd5b565b5f61137183836112f6565b6113c357825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f2081905550600190506113c7565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f81146114be575f6001826113fa9190611b5f565b90505f6001865f01805490506114109190611b5f565b9050818114611476575f865f01828154811061142f5761142e611b05565b5b905f5260205f200154905080875f0184815481106114505761144f611b05565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480611489576114886120b2565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506114c3565b5f9150505b92915050565b5f815f01805490509050919050565b5f825f0182815481106114ee576114ed611b05565b5b905f5260205f200154905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61153982611510565b9050919050565b6115498161152f565b8114611553575f80fd5b50565b5f8135905061156481611540565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115b48261156e565b810181811067ffffffffffffffff821117156115d3576115d261157e565b5b80604052505050565b5f6115e56114ff565b90506115f182826115ab565b919050565b5f67ffffffffffffffff8211156116105761160f61157e565b5b602082029050602081019050919050565b5f80fd5b5f819050919050565b61163781611625565b8114611641575f80fd5b50565b5f813590506116528161162e565b92915050565b5f61166a611665846115f6565b6115dc565b9050808382526020820190506020840283018581111561168d5761168c611621565b5b835b818110156116b657806116a28882611644565b84526020840193505060208101905061168f565b5050509392505050565b5f82601f8301126116d4576116d361156a565b5b81356116e4848260208601611658565b91505092915050565b5f806040838503121561170357611702611508565b5b5f61171085828601611556565b925050602083013567ffffffffffffffff8111156117315761173061150c565b5b61173d858286016116c0565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61177981611625565b82525050565b5f61178a8383611770565b60208301905092915050565b5f602082019050919050565b5f6117ac82611747565b6117b68185611751565b93506117c183611761565b805f5b838110156117f15781516117d8888261177f565b97506117e383611796565b9250506001810190506117c4565b5085935050505092915050565b5f6020820190508181035f83015261181681846117a2565b905092915050565b6118278161152f565b82525050565b5f6020820190506118405f83018461181e565b92915050565b5f80fd5b5f8083601f84011261185f5761185e61156a565b5b8235905067ffffffffffffffff81111561187c5761187b611846565b5b60208301915083600182028301111561189857611897611621565b5b9250929050565b5f805f805f608086880312156118b8576118b7611508565b5b5f6118c588828901611556565b95505060206118d688828901611556565b94505060406118e788828901611644565b935050606086013567ffffffffffffffff8111156119085761190761150c565b5b6119148882890161184a565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61195781611923565b82525050565b5f6020820190506119705f83018461194e565b92915050565b5f806040838503121561198c5761198b611508565b5b5f61199985828601611556565b92505060206119aa85828601611644565b9150509250929050565b6119bd81611625565b82525050565b5f6020820190506119d65f8301846119b4565b92915050565b5f602082840312156119f1576119f0611508565b5b5f6119fe84828501611644565b91505092915050565b5f8083601f840112611a1c57611a1b61156a565b5b8235905067ffffffffffffffff811115611a3957611a38611846565b5b602083019150836020820283011115611a5557611a54611621565b5b9250929050565b5f8060208385031215611a7257611a71611508565b5b5f83013567ffffffffffffffff811115611a8f57611a8e61150c565b5b611a9b85828601611a07565b92509250509250929050565b5f8115159050919050565b611abb81611aa7565b82525050565b5f602082019050611ad45f830184611ab2565b92915050565b5f60208284031215611aef57611aee611508565b5b5f611afc84828501611556565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611b6982611625565b9150611b7483611625565b9250828203905081811115611b8c57611b8b611b32565b5b92915050565b5f611b9c82611625565b9150611ba783611625565b9250828202611bb581611625565b91508282048414831517611bcc57611bcb611b32565b5b5092915050565b5f82825260208201905092915050565b7f496e76616c696420626c6f636b730000000000000000000000000000000000005f82015250565b5f611c17600e83611bd3565b9150611c2282611be3565b602082019050919050565b5f6020820190508181035f830152611c4481611c0b565b9050919050565b5f611c5582611625565b9150611c6083611625565b9250828201905080821115611c7857611c77611b32565b5b92915050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f611cb2600f83611bd3565b9150611cbd82611c7e565b602082019050919050565b5f6020820190508181035f830152611cdf81611ca6565b9050919050565b5f82825260208201905092915050565b50565b5f611d045f83611ce6565b9150611d0f82611cf6565b5f82019050919050565b5f608082019050611d2c5f83018661181e565b611d39602083018561181e565b611d4660408301846119b4565b8181036060830152611d5781611cf9565b9050949350505050565b5f604082019050611d745f83018561181e565b611d8160208301846119b4565b9392505050565b611d9181611aa7565b8114611d9b575f80fd5b50565b5f81519050611dac81611d88565b92915050565b5f60208284031215611dc757611dc6611508565b5b5f611dd484828501611d9e565b91505092915050565b5f81519050611deb8161162e565b92915050565b5f60208284031215611e0657611e05611508565b5b5f611e1384828501611ddd565b91505092915050565b7f417065204c6f6f7420746f6b656e206e6f74206465706f7369746564000000005f82015250565b5f611e50601c83611bd3565b9150611e5b82611e1c565b602082019050919050565b5f6020820190508181035f830152611e7d81611e44565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611ede602683611bd3565b9150611ee982611e84565b604082019050919050565b5f6020820190508181035f830152611f0b81611ed2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f46602083611bd3565b9150611f5182611f12565b602082019050919050565b5f6020820190508181035f830152611f7381611f3a565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f611fae601083611bd3565b9150611fb982611f7a565b602082019050919050565b5f6020820190508181035f830152611fdb81611fa2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612016601f83611bd3565b915061202182611fe2565b602082019050919050565b5f6020820190508181035f8301526120438161200a565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f61207e601483611bd3565b91506120898261204a565b602082019050919050565b5f6020820190508181035f8301526120ab81612072565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220d112ef93904e28d08055d87f6769a09ed6e3f26f7980347f217243720a070c1b64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f39c9a863e2840a6c35068fdbc88c05a961aee0000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000002faf0800000000000000000000000004ec551c12ddce80f1d667b7c0a1bc3d0eb877837
-----Decoded View---------------
Arg [0] : _apelootAddress (address): 0xf39C9A863E2840a6c35068fDBC88c05a961aeE00
Arg [1] : _rate (uint256): 1000
Arg [2] : _expiration (uint256): 50000000
Arg [3] : _lootAddress (address): 0x4ec551c12dDcE80f1d667b7C0a1BC3D0eB877837
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f39c9a863e2840a6c35068fdbc88c05a961aee00
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 0000000000000000000000000000000000000000000000000000000002faf080
Arg [3] : 0000000000000000000000004ec551c12ddce80f1d667b7c0a1bc3d0eb877837
Deployed Bytecode Sourcemap
53111:4980:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55018:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53378:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57869:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55603:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53517:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54273:80;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54097:65;;;:::i;:::-;;53431:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54464:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56533:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49318:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56054:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53342:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8463:103;;;:::i;:::-;;54028:61;;;:::i;:::-;;57667:194;;;:::i;:::-;;7822:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57049:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53632:69;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54621:389;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8721:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55018:534;55133:24;55198:8;:15;55184:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55174:40;;55230:9;55225:295;55245:8;:15;55241:1;:19;55225:295;;;55278:15;55296:8;55305:1;55296:11;;;;;;;;:::i;:::-;;;;;;;;55278:29;;55477:14;:23;55492:7;55477:23;;;;;;;;;;;;;;;:32;55501:7;55477:32;;;;;;;;;;;;55426:34;55435:12;55449:10;;55426:8;:34::i;:::-;:83;;;;:::i;:::-;55365:36;55393:7;55365:9;:18;55375:7;55365:18;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;:44;;55408:1;55365:44;;;55404:1;55365:44;55345:65;;:4;;:65;;;;:::i;:::-;:165;;;;:::i;:::-;55320:7;55328:1;55320:10;;;;;;;;:::i;:::-;;;;;;;:190;;;;;55267:253;55262:3;;;;;;;55225:295;;;;55018:534;;;;:::o;53378:26::-;;;;;;;;;;;;;:::o;57869:219::-;58013:6;58039:41;;;58032:48;;57869:219;;;;;;;:::o;55603:413::-;55707:7;55776:14;:23;55791:7;55776:23;;;;;;;;;;;;;;;:32;55800:7;55776:32;;;;;;;;;;;;55739:34;55748:12;55762:10;;55739:8;:34::i;:::-;:69;55731:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;55975:14;:23;55990:7;55975:23;;;;;;;;;;;;;;;:32;55999:7;55975:32;;;;;;;;;;;;55924:34;55933:12;55947:10;;55924:8;:34::i;:::-;:83;;;;:::i;:::-;55863:36;55891:7;55863:9;:18;55873:7;55863:18;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;:44;;55906:1;55863:44;;;55902:1;55863:44;55843:65;;:4;;:65;;;;:::i;:::-;:165;;;;:::i;:::-;55836:172;;55603:413;;;;:::o;53517:19::-;;;;:::o;54273:80::-;7708:13;:11;:13::i;:::-;54340:5:::1;54333:4;:12;;;;54273:80:::0;:::o;54097:65::-;7708:13;:11;:13::i;:::-;54144:10:::1;:8;:10::i;:::-;54097:65::o:0;53431:25::-;;;;:::o;54464:119::-;7708:13;:11;:13::i;:::-;54564:11:::1;54549:12;:26;;;;:::i;:::-;54536:10;:39;;;;54464:119:::0;:::o;56533:480::-;48923:19;:17;:19::i;:::-;56635:14:::1;;;;;;;;;;;56621:28;;:10;:28;;::::0;56613:56:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56680:22;56693:8;;56680:12;:22::i;:::-;56720:9;56715:291;56735:8;;:15;;56731:1;:19;56715:291;;;56780:14;;;;;;;;;;;56772:40;;;56831:10;56868:4;56892:8;;56901:1;56892:11;;;;;;;:::i;:::-;;;;;;;;56772:167;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56956:38;56982:8;;56991:1;56982:11;;;;;;;:::i;:::-;;;;;;;;56956:9;:21;56966:10;56956:21;;;;;;;;;;;;;;;:25;;:38;;;;:::i;:::-;;56752:3;;;;;;;56715:291;;;;56533:480:::0;;:::o;49318:86::-;49365:4;49389:7;;;;;;;;;;;49382:14;;49318:86;:::o;56054:445::-;48923:19;:17;:19::i;:::-;56135:14:::1;56159:16:::0;56178:34:::1;56187:12;56201:10;;56178:8;:34::i;:::-;56159:53;;56228:9;56223:174;56243:8;;:15;;56239:1;:19;56223:174;;;56286:40;56302:10;56314:8;;56323:1;56314:11;;;;;;;:::i;:::-;;;;;;;;56286:15;:40::i;:::-;56276:50;;;;;:::i;:::-;;;56379:8;56337:14;:26;56352:10;56337:26;;;;;;;;;;;;;;;:39;56364:8;;56373:1;56364:11;;;;;;;:::i;:::-;;;;;;;;56337:39;;;;;;;;;;;:50;;;;56260:3;;;;;;;56223:174;;;;56420:1;56411:6;:10;56407:85;;;56441:11;;;;;;;;;;;56434:28;;;56463:10;56475:6;56434:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56407:85;56126:373;;56054:445:::0;;:::o;53342:29::-;;;;;;;;;;;;;:::o;8463:103::-;7708:13;:11;:13::i;:::-;8528:30:::1;8555:1;8528:18;:30::i;:::-;8463:103::o:0;54028:61::-;7708:13;:11;:13::i;:::-;54073:8:::1;:6;:8::i;:::-;54028:61::o:0;57667:194::-;7708:13;:11;:13::i;:::-;57723:19:::1;57752:11;;;;;;;;;;;57745:29;;;57783:4;57745:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57723:66;;57807:11;;;;;;;;;;;57800:28;;;57829:10;57841:11;57800:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57712:149;57667:194::o:0;7822:87::-;7868:7;7895:6;;;;;;;;;;;7888:13;;7822:87;:::o;57049:582::-;48923:19;:17;:19::i;:::-;33719:21:::1;:19;:21::i;:::-;57145:22:::2;57158:8;;57145:12;:22::i;:::-;57185:9;57180:444;57200:8;;:15;;57196:1;:19;57180:444;;;57263:43;57294:8;;57303:1;57294:11;;;;;;;:::i;:::-;;;;;;;;57263:9;:21;57273:10;57263:21;;;;;;;;;;;;;;;:30;;:43;;;;:::i;:::-;57237:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;57387:41;57416:8;;57425:1;57416:11;;;;;;;:::i;:::-;;;;;;;;57387:9;:21;57397:10;57387:21;;;;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;;57453:14;;;;;;;;;;;57445:40;;;57512:4;57536:10;57565:8;;57574:1;57565:11;;;;;;;:::i;:::-;;;;;;;;57445:167;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;57217:3;;;;;;;57180:444;;;;33763:20:::1;:18;:20::i;:::-;57049:582:::0;;:::o;53632:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54621:389::-;54704:16;54736:40;54779:9;:18;54789:7;54779:18;;;;;;;;;;;;;;;54736:61;;54806:25;54849:19;:10;:17;:19::i;:::-;54834:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54806:63;;54885:9;54880:97;54900:19;:10;:17;:19::i;:::-;54896:1;:23;54880:97;;;54951:16;54965:1;54951:10;:13;;:16;;;;:::i;:::-;54937:8;54946:1;54937:11;;;;;;;;:::i;:::-;;;;;;;:30;;;;;54921:3;;;;;;;54880:97;;;;54994:8;54987:15;;;;54621:389;;;:::o;8721:201::-;7708:13;:11;:13::i;:::-;8830:1:::1;8810:22;;:8;:22;;::::0;8802:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8886:28;8905:8;8886:18;:28::i;:::-;8721:201:::0;:::o;35194:106::-;35252:7;35283:1;35279;:5;:13;;35291:1;35279:13;;;35287:1;35279:13;35272:20;;35194:106;;;;:::o;29740:146::-;29817:4;29841:37;29851:3;:10;;29871:5;29863:14;;29841:9;:37::i;:::-;29834:44;;29740:146;;;;:::o;7987:132::-;8062:12;:10;:12::i;:::-;8051:23;;:7;:5;:7::i;:::-;:23;;;8043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7987:132::o;50173:120::-;49182:16;:14;:16::i;:::-;50242:5:::1;50232:7;;:15;;;;;;;;;;;;;;;;;;50263:22;50272:12;:10;:12::i;:::-;50263:22;;;;;;:::i;:::-;;;;;;;;50173:120::o:0;49477:108::-;49548:8;:6;:8::i;:::-;49547:9;49539:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49477:108::o;29210:131::-;29277:4;29301:32;29306:3;:10;;29326:5;29318:14;;29301:4;:32::i;:::-;29294:39;;29210:131;;;;:::o;9082:191::-;9156:16;9175:6;;;;;;;;;;;9156:25;;9201:8;9192:6;;:17;;;;;;;;;;;;;;;;;;9256:8;9225:40;;9246:8;9225:40;;;;;;;;;;;;9145:128;9082:191;:::o;49914:118::-;48923:19;:17;:19::i;:::-;49984:4:::1;49974:7;;:14;;;;;;;;;;;;;;;;;;50004:20;50011:12;:10;:12::i;:::-;50004:20;;;;;;:::i;:::-;;;;;;;;49914:118::o:0;33799:293::-;33201:1;33933:7;;:19;33925:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33201:1;34066:7;:18;;;;33799:293::o;29517:137::-;29587:4;29611:35;29619:3;:10;;29639:5;29631:14;;29611:7;:35::i;:::-;29604:42;;29517:137;;;;:::o;34100:213::-;33157:1;34283:7;:22;;;;34100:213::o;29972:114::-;30032:7;30059:19;30067:3;:10;;30059:7;:19::i;:::-;30052:26;;29972:114;;;:::o;30440:137::-;30511:7;30546:22;30550:3;:10;;30562:5;30546:3;:22::i;:::-;30538:31;;30531:38;;30440:137;;;;:::o;22475:129::-;22548:4;22595:1;22572:3;:12;;:19;22585:5;22572:19;;;;;;;;;;;;:24;;22565:31;;22475:129;;;;:::o;1505:98::-;1558:7;1585:10;1578:17;;1505:98;:::o;49662:108::-;49729:8;:6;:8::i;:::-;49721:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;49662:108::o;20379:414::-;20442:4;20464:21;20474:3;20479:5;20464:9;:21::i;:::-;20459:327;;20502:3;:11;;20519:5;20502:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20685:3;:11;;:18;;;;20663:3;:12;;:19;20676:5;20663:19;;;;;;;;;;;:40;;;;20725:4;20718:11;;;;20459:327;20769:5;20762:12;;20379:414;;;;;:::o;20969:1420::-;21035:4;21153:18;21174:3;:12;;:19;21187:5;21174:19;;;;;;;;;;;;21153:40;;21224:1;21210:10;:15;21206:1176;;21585:21;21622:1;21609:10;:14;;;;:::i;:::-;21585:38;;21638:17;21679:1;21658:3;:11;;:18;;;;:22;;;;:::i;:::-;21638:42;;21714:13;21701:9;:26;21697:405;;21748:17;21768:3;:11;;21780:9;21768:22;;;;;;;;:::i;:::-;;;;;;;;;;21748:42;;21922:9;21893:3;:11;;21905:13;21893:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;22033:10;22007:3;:12;;:23;22020:9;22007:23;;;;;;;;;;;:36;;;;21729:373;21697:405;22183:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22278:3;:12;;:19;22291:5;22278:19;;;;;;;;;;;22271:26;;;22321:4;22314:11;;;;;;;21206:1176;22365:5;22358:12;;;20969:1420;;;;;:::o;22690:109::-;22746:7;22773:3;:11;;:18;;;;22766:25;;22690:109;;;:::o;23153:120::-;23220:7;23247:3;:11;;23259:5;23247:18;;;;;;;;:::i;:::-;;;;;;;;;;23240:25;;23153:120;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:117::-;950:1;947;940:12;964:102;1005:6;1056:2;1052:7;1047:2;1040:5;1036:14;1032:28;1022:38;;964:102;;;:::o;1072:180::-;1120:77;1117:1;1110:88;1217:4;1214:1;1207:15;1241:4;1238:1;1231:15;1258:281;1341:27;1363:4;1341:27;:::i;:::-;1333:6;1329:40;1471:6;1459:10;1456:22;1435:18;1423:10;1420:34;1417:62;1414:88;;;1482:18;;:::i;:::-;1414:88;1522:10;1518:2;1511:22;1301:238;1258:281;;:::o;1545:129::-;1579:6;1606:20;;:::i;:::-;1596:30;;1635:33;1663:4;1655:6;1635:33;:::i;:::-;1545:129;;;:::o;1680:311::-;1757:4;1847:18;1839:6;1836:30;1833:56;;;1869:18;;:::i;:::-;1833:56;1919:4;1911:6;1907:17;1899:25;;1979:4;1973;1969:15;1961:23;;1680:311;;;:::o;1997:117::-;2106:1;2103;2096:12;2120:77;2157:7;2186:5;2175:16;;2120:77;;;:::o;2203:122::-;2276:24;2294:5;2276:24;:::i;:::-;2269:5;2266:35;2256:63;;2315:1;2312;2305:12;2256:63;2203:122;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:710::-;2589:5;2614:81;2630:64;2687:6;2630:64;:::i;:::-;2614:81;:::i;:::-;2605:90;;2715:5;2744:6;2737:5;2730:21;2778:4;2771:5;2767:16;2760:23;;2831:4;2823:6;2819:17;2811:6;2807:30;2860:3;2852:6;2849:15;2846:122;;;2879:79;;:::i;:::-;2846:122;2994:6;2977:220;3011:6;3006:3;3003:15;2977:220;;;3086:3;3115:37;3148:3;3136:10;3115:37;:::i;:::-;3110:3;3103:50;3182:4;3177:3;3173:14;3166:21;;3053:144;3037:4;3032:3;3028:14;3021:21;;2977:220;;;2981:21;2595:608;;2493:710;;;;;:::o;3226:370::-;3297:5;3346:3;3339:4;3331:6;3327:17;3323:27;3313:122;;3354:79;;:::i;:::-;3313:122;3471:6;3458:20;3496:94;3586:3;3578:6;3571:4;3563:6;3559:17;3496:94;:::i;:::-;3487:103;;3303:293;3226:370;;;;:::o;3602:684::-;3695:6;3703;3752:2;3740:9;3731:7;3727:23;3723:32;3720:119;;;3758:79;;:::i;:::-;3720:119;3878:1;3903:53;3948:7;3939:6;3928:9;3924:22;3903:53;:::i;:::-;3893:63;;3849:117;4033:2;4022:9;4018:18;4005:32;4064:18;4056:6;4053:30;4050:117;;;4086:79;;:::i;:::-;4050:117;4191:78;4261:7;4252:6;4241:9;4237:22;4191:78;:::i;:::-;4181:88;;3976:303;3602:684;;;;;:::o;4292:114::-;4359:6;4393:5;4387:12;4377:22;;4292:114;;;:::o;4412:184::-;4511:11;4545:6;4540:3;4533:19;4585:4;4580:3;4576:14;4561:29;;4412:184;;;;:::o;4602:132::-;4669:4;4692:3;4684:11;;4722:4;4717:3;4713:14;4705:22;;4602:132;;;:::o;4740:108::-;4817:24;4835:5;4817:24;:::i;:::-;4812:3;4805:37;4740:108;;:::o;4854:179::-;4923:10;4944:46;4986:3;4978:6;4944:46;:::i;:::-;5022:4;5017:3;5013:14;4999:28;;4854:179;;;;:::o;5039:113::-;5109:4;5141;5136:3;5132:14;5124:22;;5039:113;;;:::o;5188:732::-;5307:3;5336:54;5384:5;5336:54;:::i;:::-;5406:86;5485:6;5480:3;5406:86;:::i;:::-;5399:93;;5516:56;5566:5;5516:56;:::i;:::-;5595:7;5626:1;5611:284;5636:6;5633:1;5630:13;5611:284;;;5712:6;5706:13;5739:63;5798:3;5783:13;5739:63;:::i;:::-;5732:70;;5825:60;5878:6;5825:60;:::i;:::-;5815:70;;5671:224;5658:1;5655;5651:9;5646:14;;5611:284;;;5615:14;5911:3;5904:10;;5312:608;;;5188:732;;;;:::o;5926:373::-;6069:4;6107:2;6096:9;6092:18;6084:26;;6156:9;6150:4;6146:20;6142:1;6131:9;6127:17;6120:47;6184:108;6287:4;6278:6;6184:108;:::i;:::-;6176:116;;5926:373;;;;:::o;6305:118::-;6392:24;6410:5;6392:24;:::i;:::-;6387:3;6380:37;6305:118;;:::o;6429:222::-;6522:4;6560:2;6549:9;6545:18;6537:26;;6573:71;6641:1;6630:9;6626:17;6617:6;6573:71;:::i;:::-;6429:222;;;;:::o;6657:117::-;6766:1;6763;6756:12;6793:552;6850:8;6860:6;6910:3;6903:4;6895:6;6891:17;6887:27;6877:122;;6918:79;;:::i;:::-;6877:122;7031:6;7018:20;7008:30;;7061:18;7053:6;7050:30;7047:117;;;7083:79;;:::i;:::-;7047:117;7197:4;7189:6;7185:17;7173:29;;7251:3;7243:4;7235:6;7231:17;7221:8;7217:32;7214:41;7211:128;;;7258:79;;:::i;:::-;7211:128;6793:552;;;;;:::o;7351:963::-;7448:6;7456;7464;7472;7480;7529:3;7517:9;7508:7;7504:23;7500:33;7497:120;;;7536:79;;:::i;:::-;7497:120;7656:1;7681:53;7726:7;7717:6;7706:9;7702:22;7681:53;:::i;:::-;7671:63;;7627:117;7783:2;7809:53;7854:7;7845:6;7834:9;7830:22;7809:53;:::i;:::-;7799:63;;7754:118;7911:2;7937:53;7982:7;7973:6;7962:9;7958:22;7937:53;:::i;:::-;7927:63;;7882:118;8067:2;8056:9;8052:18;8039:32;8098:18;8090:6;8087:30;8084:117;;;8120:79;;:::i;:::-;8084:117;8233:64;8289:7;8280:6;8269:9;8265:22;8233:64;:::i;:::-;8215:82;;;;8010:297;7351:963;;;;;;;;:::o;8320:149::-;8356:7;8396:66;8389:5;8385:78;8374:89;;8320:149;;;:::o;8475:115::-;8560:23;8577:5;8560:23;:::i;:::-;8555:3;8548:36;8475:115;;:::o;8596:218::-;8687:4;8725:2;8714:9;8710:18;8702:26;;8738:69;8804:1;8793:9;8789:17;8780:6;8738:69;:::i;:::-;8596:218;;;;:::o;8820:474::-;8888:6;8896;8945:2;8933:9;8924:7;8920:23;8916:32;8913:119;;;8951:79;;:::i;:::-;8913:119;9071:1;9096:53;9141:7;9132:6;9121:9;9117:22;9096:53;:::i;:::-;9086:63;;9042:117;9198:2;9224:53;9269:7;9260:6;9249:9;9245:22;9224:53;:::i;:::-;9214:63;;9169:118;8820:474;;;;;:::o;9300:118::-;9387:24;9405:5;9387:24;:::i;:::-;9382:3;9375:37;9300:118;;:::o;9424:222::-;9517:4;9555:2;9544:9;9540:18;9532:26;;9568:71;9636:1;9625:9;9621:17;9612:6;9568:71;:::i;:::-;9424:222;;;;:::o;9652:329::-;9711:6;9760:2;9748:9;9739:7;9735:23;9731:32;9728:119;;;9766:79;;:::i;:::-;9728:119;9886:1;9911:53;9956:7;9947:6;9936:9;9932:22;9911:53;:::i;:::-;9901:63;;9857:117;9652:329;;;;:::o;10004:568::-;10077:8;10087:6;10137:3;10130:4;10122:6;10118:17;10114:27;10104:122;;10145:79;;:::i;:::-;10104:122;10258:6;10245:20;10235:30;;10288:18;10280:6;10277:30;10274:117;;;10310:79;;:::i;:::-;10274:117;10424:4;10416:6;10412:17;10400:29;;10478:3;10470:4;10462:6;10458:17;10448:8;10444:32;10441:41;10438:128;;;10485:79;;:::i;:::-;10438:128;10004:568;;;;;:::o;10578:559::-;10664:6;10672;10721:2;10709:9;10700:7;10696:23;10692:32;10689:119;;;10727:79;;:::i;:::-;10689:119;10875:1;10864:9;10860:17;10847:31;10905:18;10897:6;10894:30;10891:117;;;10927:79;;:::i;:::-;10891:117;11040:80;11112:7;11103:6;11092:9;11088:22;11040:80;:::i;:::-;11022:98;;;;10818:312;10578:559;;;;;:::o;11143:90::-;11177:7;11220:5;11213:13;11206:21;11195:32;;11143:90;;;:::o;11239:109::-;11320:21;11335:5;11320:21;:::i;:::-;11315:3;11308:34;11239:109;;:::o;11354:210::-;11441:4;11479:2;11468:9;11464:18;11456:26;;11492:65;11554:1;11543:9;11539:17;11530:6;11492:65;:::i;:::-;11354:210;;;;:::o;11570:329::-;11629:6;11678:2;11666:9;11657:7;11653:23;11649:32;11646:119;;;11684:79;;:::i;:::-;11646:119;11804:1;11829:53;11874:7;11865:6;11854:9;11850:22;11829:53;:::i;:::-;11819:63;;11775:117;11570:329;;;;:::o;11905:180::-;11953:77;11950:1;11943:88;12050:4;12047:1;12040:15;12074:4;12071:1;12064:15;12091:180;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:194;12317:4;12337:20;12355:1;12337:20;:::i;:::-;12332:25;;12371:20;12389:1;12371:20;:::i;:::-;12366:25;;12415:1;12412;12408:9;12400:17;;12439:1;12433:4;12430:11;12427:37;;;12444:18;;:::i;:::-;12427:37;12277:194;;;;:::o;12477:410::-;12517:7;12540:20;12558:1;12540:20;:::i;:::-;12535:25;;12574:20;12592:1;12574:20;:::i;:::-;12569:25;;12629:1;12626;12622:9;12651:30;12669:11;12651:30;:::i;:::-;12640:41;;12830:1;12821:7;12817:15;12814:1;12811:22;12791:1;12784:9;12764:83;12741:139;;12860:18;;:::i;:::-;12741:139;12525:362;12477:410;;;;:::o;12893:169::-;12977:11;13011:6;13006:3;12999:19;13051:4;13046:3;13042:14;13027:29;;12893:169;;;;:::o;13068:164::-;13208:16;13204:1;13196:6;13192:14;13185:40;13068:164;:::o;13238:366::-;13380:3;13401:67;13465:2;13460:3;13401:67;:::i;:::-;13394:74;;13477:93;13566:3;13477:93;:::i;:::-;13595:2;13590:3;13586:12;13579:19;;13238:366;;;:::o;13610:419::-;13776:4;13814:2;13803:9;13799:18;13791:26;;13863:9;13857:4;13853:20;13849:1;13838:9;13834:17;13827:47;13891:131;14017:4;13891:131;:::i;:::-;13883:139;;13610:419;;;:::o;14035:191::-;14075:3;14094:20;14112:1;14094:20;:::i;:::-;14089:25;;14128:20;14146:1;14128:20;:::i;:::-;14123:25;;14171:1;14168;14164:9;14157:16;;14192:3;14189:1;14186:10;14183:36;;;14199:18;;:::i;:::-;14183:36;14035:191;;;;:::o;14232:165::-;14372:17;14368:1;14360:6;14356:14;14349:41;14232:165;:::o;14403:366::-;14545:3;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14403:366;;;:::o;14775:419::-;14941:4;14979:2;14968:9;14964:18;14956:26;;15028:9;15022:4;15018:20;15014:1;15003:9;14999:17;14992:47;15056:131;15182:4;15056:131;:::i;:::-;15048:139;;14775:419;;;:::o;15200:168::-;15283:11;15317:6;15312:3;15305:19;15357:4;15352:3;15348:14;15333:29;;15200:168;;;;:::o;15374:114::-;;:::o;15494:362::-;15635:3;15656:65;15719:1;15714:3;15656:65;:::i;:::-;15649:72;;15730:93;15819:3;15730:93;:::i;:::-;15848:1;15843:3;15839:11;15832:18;;15494:362;;;:::o;15862:748::-;16111:4;16149:3;16138:9;16134:19;16126:27;;16163:71;16231:1;16220:9;16216:17;16207:6;16163:71;:::i;:::-;16244:72;16312:2;16301:9;16297:18;16288:6;16244:72;:::i;:::-;16326;16394:2;16383:9;16379:18;16370:6;16326:72;:::i;:::-;16445:9;16439:4;16435:20;16430:2;16419:9;16415:18;16408:48;16473:130;16598:4;16473:130;:::i;:::-;16465:138;;15862:748;;;;;;:::o;16616:332::-;16737:4;16775:2;16764:9;16760:18;16752:26;;16788:71;16856:1;16845:9;16841:17;16832:6;16788:71;:::i;:::-;16869:72;16937:2;16926:9;16922:18;16913:6;16869:72;:::i;:::-;16616:332;;;;;:::o;16954:116::-;17024:21;17039:5;17024:21;:::i;:::-;17017:5;17014:32;17004:60;;17060:1;17057;17050:12;17004:60;16954:116;:::o;17076:137::-;17130:5;17161:6;17155:13;17146:22;;17177:30;17201:5;17177:30;:::i;:::-;17076:137;;;;:::o;17219:345::-;17286:6;17335:2;17323:9;17314:7;17310:23;17306:32;17303:119;;;17341:79;;:::i;:::-;17303:119;17461:1;17486:61;17539:7;17530:6;17519:9;17515:22;17486:61;:::i;:::-;17476:71;;17432:125;17219:345;;;;:::o;17570:143::-;17627:5;17658:6;17652:13;17643:22;;17674:33;17701:5;17674:33;:::i;:::-;17570:143;;;;:::o;17719:351::-;17789:6;17838:2;17826:9;17817:7;17813:23;17809:32;17806:119;;;17844:79;;:::i;:::-;17806:119;17964:1;17989:64;18045:7;18036:6;18025:9;18021:22;17989:64;:::i;:::-;17979:74;;17935:128;17719:351;;;;:::o;18076:178::-;18216:30;18212:1;18204:6;18200:14;18193:54;18076:178;:::o;18260:366::-;18402:3;18423:67;18487:2;18482:3;18423:67;:::i;:::-;18416:74;;18499:93;18588:3;18499:93;:::i;:::-;18617:2;18612:3;18608:12;18601:19;;18260:366;;;:::o;18632:419::-;18798:4;18836:2;18825:9;18821:18;18813:26;;18885:9;18879:4;18875:20;18871:1;18860:9;18856:17;18849:47;18913:131;19039:4;18913:131;:::i;:::-;18905:139;;18632:419;;;:::o;19057:225::-;19197:34;19193:1;19185:6;19181:14;19174:58;19266:8;19261:2;19253:6;19249:15;19242:33;19057:225;:::o;19288:366::-;19430:3;19451:67;19515:2;19510:3;19451:67;:::i;:::-;19444:74;;19527:93;19616:3;19527:93;:::i;:::-;19645:2;19640:3;19636:12;19629:19;;19288:366;;;:::o;19660:419::-;19826:4;19864:2;19853:9;19849:18;19841:26;;19913:9;19907:4;19903:20;19899:1;19888:9;19884:17;19877:47;19941:131;20067:4;19941:131;:::i;:::-;19933:139;;19660:419;;;:::o;20085:182::-;20225:34;20221:1;20213:6;20209:14;20202:58;20085:182;:::o;20273:366::-;20415:3;20436:67;20500:2;20495:3;20436:67;:::i;:::-;20429:74;;20512:93;20601:3;20512:93;:::i;:::-;20630:2;20625:3;20621:12;20614:19;;20273:366;;;:::o;20645:419::-;20811:4;20849:2;20838:9;20834:18;20826:26;;20898:9;20892:4;20888:20;20884:1;20873:9;20869:17;20862:47;20926:131;21052:4;20926:131;:::i;:::-;20918:139;;20645:419;;;:::o;21070:166::-;21210:18;21206:1;21198:6;21194:14;21187:42;21070:166;:::o;21242:366::-;21384:3;21405:67;21469:2;21464:3;21405:67;:::i;:::-;21398:74;;21481:93;21570:3;21481:93;:::i;:::-;21599:2;21594:3;21590:12;21583:19;;21242:366;;;:::o;21614:419::-;21780:4;21818:2;21807:9;21803:18;21795:26;;21867:9;21861:4;21857:20;21853:1;21842:9;21838:17;21831:47;21895:131;22021:4;21895:131;:::i;:::-;21887:139;;21614:419;;;:::o;22039:181::-;22179:33;22175:1;22167:6;22163:14;22156:57;22039:181;:::o;22226:366::-;22368:3;22389:67;22453:2;22448:3;22389:67;:::i;:::-;22382:74;;22465:93;22554:3;22465:93;:::i;:::-;22583:2;22578:3;22574:12;22567:19;;22226:366;;;:::o;22598:419::-;22764:4;22802:2;22791:9;22787:18;22779:26;;22851:9;22845:4;22841:20;22837:1;22826:9;22822:17;22815:47;22879:131;23005:4;22879:131;:::i;:::-;22871:139;;22598:419;;;:::o;23023:170::-;23163:22;23159:1;23151:6;23147:14;23140:46;23023:170;:::o;23199:366::-;23341:3;23362:67;23426:2;23421:3;23362:67;:::i;:::-;23355:74;;23438:93;23527:3;23438:93;:::i;:::-;23556:2;23551:3;23547:12;23540:19;;23199:366;;;:::o;23571:419::-;23737:4;23775:2;23764:9;23760:18;23752:26;;23824:9;23818:4;23814:20;23810:1;23799:9;23795:17;23788:47;23852:131;23978:4;23852:131;:::i;:::-;23844:139;;23571:419;;;:::o;23996:180::-;24044:77;24041:1;24034:88;24141:4;24138:1;24131:15;24165:4;24162:1;24155:15
Swarm Source
ipfs://d112ef93904e28d08055d87f6769a09ed6e3f26f7980347f217243720a070c1b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.