Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,856 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw ETH | 16131087 | 613 days ago | IN | 0 ETH | 0.00041008 | ||||
Grant Role | 16131077 | 613 days ago | IN | 0 ETH | 0.00102306 | ||||
Mint NFT | 15159212 | 756 days ago | IN | 0.091 ETH | 0.00056175 | ||||
Mint NFT | 15146244 | 758 days ago | IN | 0.091 ETH | 0.00146158 | ||||
Mint NFT | 15146225 | 758 days ago | IN | 0.091 ETH | 0.0011046 | ||||
Mint NFT | 15146194 | 758 days ago | IN | 0.091 ETH | 0.00123276 | ||||
Mint NFT | 15146180 | 758 days ago | IN | 0.091 ETH | 0.00157558 | ||||
Mint NFT | 15146159 | 758 days ago | IN | 0.091 ETH | 0.00117376 | ||||
Mint NFT | 15146132 | 758 days ago | IN | 0.091 ETH | 0.00100371 | ||||
Mint NFT | 15146129 | 758 days ago | IN | 0.091 ETH | 0.00255217 | ||||
Mint NFT | 15146115 | 758 days ago | IN | 0.091 ETH | 0.00654832 | ||||
Mint NFT | 15146109 | 758 days ago | IN | 0.091 ETH | 0.00353942 | ||||
Mint NFT | 15146101 | 758 days ago | IN | 0.091 ETH | 0.00690077 | ||||
Mint NFT | 15146088 | 758 days ago | IN | 0.091 ETH | 0.00348081 | ||||
Mint NFT | 15146078 | 758 days ago | IN | 0.091 ETH | 0.00610216 | ||||
Mint NFT | 15146043 | 758 days ago | IN | 0.091 ETH | 0.00546969 | ||||
Mint NFT | 15146012 | 758 days ago | IN | 0.091 ETH | 0.00591322 | ||||
Mint NFT | 15145976 | 758 days ago | IN | 0.091 ETH | 0.00548659 | ||||
Mint NFT | 15145954 | 758 days ago | IN | 0.091 ETH | 0.00712731 | ||||
Mint NFT | 15145940 | 758 days ago | IN | 0.091 ETH | 0.00909242 | ||||
Mint NFT | 15145915 | 758 days ago | IN | 0.091 ETH | 0.0067719 | ||||
Mint NFT | 15145894 | 758 days ago | IN | 0.091 ETH | 0.00503181 | ||||
Mint NFT | 15145861 | 758 days ago | IN | 0.091 ETH | 0.00651475 | ||||
Mint NFT | 15145849 | 758 days ago | IN | 0.091 ETH | 0.00491832 | ||||
Mint NFT | 15145834 | 758 days ago | IN | 0.091 ETH | 0.00537695 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16131087 | 613 days ago | 136.5 ETH |
Loading...
Loading
Contract Name:
NFTFactory
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity >=0.6.0 <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 () internal { _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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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); } // 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)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/access/AccessControl.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/cryptography/MerkleProof.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: contracts/NFTFactory.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface IERC721 { function safeMint(address to, uint256 tokenId) external; function totalSupply() external view returns (uint256); } contract NFTFactory is AccessControl, ReentrancyGuard { using SafeMath for uint256; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); bytes32 public constant TREASURY_ROLE = keccak256("TREASURY_ROLE"); IERC721 public nft; struct UserInfo { uint256 claimedNum; } struct PoolInfo { uint256 maxNum; uint256 supply; bool paused; uint256 price; bytes32 root; uint256 limitPerAccount; } PoolInfo[] private pools; mapping(uint256 => mapping(address => UserInfo)) private users; event NewPool(uint256 indexed pid, uint256 maxNum, bool paused, uint256 price, bytes32 root, uint256 limitPerAccount); event ChangePoolMaxAndLimit(uint256 indexed pid, uint256 maxNum, uint256 price, uint256 limitPerAccount); event SetPoolRoot(uint256 indexed pid, bytes32 root); event MintNFT(uint256 indexed pid, address indexed account, uint256 tokenId, uint256 payAmount); event Withdraw(address indexed account, uint256 amount); event Paused(uint256 indexed pid); event Unpaused(uint256 indexed pid); constructor(IERC721 _nft) public { nft = _nft; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(OPERATOR_ROLE, _msgSender()); _setupRole(TREASURY_ROLE, _msgSender()); } modifier onlyOperator() { require(hasRole(OPERATOR_ROLE, _msgSender()), "NFTFactory::caller is not operator"); _; } modifier onlyTreasury() { require(hasRole(TREASURY_ROLE, _msgSender()), "NFTFactory::caller is not treasury"); _; } function addPool(uint256 _maxNum, bool _paused, uint256 _price, uint256 _limitPerAccount, bytes32 _root) external onlyOperator { require(_limitPerAccount > 0, "NFTFactory::addPool: Limit per account must great than zero"); require(_maxNum > 0, "NFTFactory::addPool: Max num must be higher than zero"); pools.push(PoolInfo({ maxNum : _maxNum, supply : 0, paused : _paused, price : _price, // allow to zero root : _root, limitPerAccount : _limitPerAccount })); emit NewPool(pools.length.sub(1), _maxNum, _paused, _price, _root, _limitPerAccount); } function poolInfo(uint256 _pid) external view returns (PoolInfo memory) { return pools[_pid]; } function userInfo(uint256 _pid, address account) external view returns (UserInfo memory) { return users[_pid][account]; } function poolLength() external view returns (uint256) { return pools.length; } function mintNFT(uint256 _pid, uint256 _num, bytes32[] calldata _proof) external payable nonReentrant { address account = _msgSender(); PoolInfo storage pool = pools[_pid]; require(!pool.paused, "NFTFactory::mintNFT: Has paused"); require(MerkleProof.verify(_proof, pool.root, keccak256(abi.encodePacked(account))), "NFTFactory::mintNFT: Not in whitelist"); require(_num > 0, "NFTFactory:mintNFT: num must be great than zero"); require(pool.supply.add(_num) <= pool.maxNum, "NFTFactory:mintNFT: Pool cap exceeded"); require(pool.price.mul(_num) == msg.value, "NFTFactory::mintNFT: Pay amount error"); UserInfo storage userinfo = users[_pid][account]; require(userinfo.claimedNum.add(_num) <= pool.limitPerAccount, "NFTFactory::mintNFT: Claim num exceeded"); for (uint256 i = 0; i < _num; i++) { uint256 tokenId = nft.totalSupply().add(1); pool.supply = pool.supply.add(1); userinfo.claimedNum = userinfo.claimedNum.add(1); nft.safeMint(account, tokenId); emit MintNFT(_pid, account, tokenId, pool.price); } } function mintAirdrop(uint256 _pid, address[] calldata _accounts) external onlyOperator { PoolInfo storage pool = pools[_pid]; require(!pool.paused, "NFTFactory::mintAirdrop: Has paused"); require(_accounts.length > 0, "NFTFactory::mintAirdrop: Accounts is empty"); require(pool.supply.add(_accounts.length) <= pool.maxNum, "NFTFactory:mintAirdrop: Pool cap exceeded"); // pool.limitPerAccount unused // pool.price unused for (uint256 i = 0; i < _accounts.length; i++) { address account = _accounts[i]; uint256 tokenId = nft.totalSupply().add(1); UserInfo storage userinfo = users[_pid][account]; pool.supply = pool.supply.add(1); userinfo.claimedNum = userinfo.claimedNum.add(1); nft.safeMint(account, tokenId); emit MintNFT(_pid, account, tokenId, 0); } } function setPoolMaxNumAndLimit(uint256 _pid, uint256 _maxNum, uint256 _price, uint256 _limitPerAccount) external onlyOperator { PoolInfo storage pool = pools[_pid]; require(pool.paused, "NFTFactory::setPoolMaxNumAndLimit: Has started"); require(_limitPerAccount > 0, "NFTFactory::setPoolMaxNumAndLimit: Limit must great than zero"); require(_maxNum > 0, "NFTFactory::setPoolMaxNumAndLimit: Max num must be higher than zero"); require(_maxNum >= pool.supply, "NFTFactory::setPoolMaxNumAndLimit: Max num cap exceeded"); pool.maxNum = _maxNum; pool.price = _price; pool.limitPerAccount = _limitPerAccount; emit ChangePoolMaxAndLimit(_pid, _maxNum, _price, _limitPerAccount); } function setPoolRoot(uint256 _pid, bytes32 _root) external onlyOperator { require(pools[_pid].paused, "NFTFactory::setPoolRoot: Has started"); pools[_pid].root = _root; emit SetPoolRoot(_pid, _root); } function pause(uint256 _pid) external onlyOperator { require(!pools[_pid].paused, "NFTFactory::pause: Has paused"); pools[_pid].paused = true; emit Paused(_pid); } function unpause(uint256 _pid) external onlyOperator { require(pools[_pid].paused, "NFTFactory::pause: Has started"); pools[_pid].paused = false; emit Unpaused(_pid); } function totalMaxNum() public view returns (uint256) { uint256 maxNum; for (uint256 i = 0; i < pools.length; i++) { maxNum = maxNum.add(pools[i].maxNum); } return maxNum; } function totalSupply() public view returns (uint256) { uint256 supply; for (uint256 i = 0; i < pools.length; i++) { supply = supply.add(pools[i].supply); } return supply; } function withdrawETH() public onlyTreasury { uint256 balance = address(this).balance; Address.sendValue(msg.sender, balance); emit Withdraw(msg.sender, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC721","name":"_nft","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxNum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"limitPerAccount","type":"uint256"}],"name":"ChangePoolMaxAndLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payAmount","type":"uint256"}],"name":"MintNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxNum","type":"uint256"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"limitPerAccount","type":"uint256"}],"name":"NewPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"SetPoolRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxNum","type":"uint256"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_limitPerAccount","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"mintAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolInfo","outputs":[{"components":[{"internalType":"uint256","name":"maxNum","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"limitPerAccount","type":"uint256"}],"internalType":"struct NFTFactory.PoolInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_maxNum","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_limitPerAccount","type":"uint256"}],"name":"setPoolMaxNumAndLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setPoolRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalMaxNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"userInfo","outputs":[{"components":[{"internalType":"uint256","name":"claimedNum","type":"uint256"}],"internalType":"struct NFTFactory.UserInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620025a6380380620025a68339810160408190526200003491620001e2565b60018055600280546001600160a01b0319166001600160a01b03831617905562000069600062000063620000ce565b620000d2565b620000987f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92962000063620000ce565b620000c77fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca962000063620000ce565b5062000212565b3390565b620000de8282620000e2565b5050565b60008281526020818152604090912062000107918390620012f06200015b821b17901c565b15620000de5762000117620000ce565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000172836001600160a01b0384166200017b565b90505b92915050565b6000620001898383620001ca565b620001c15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000175565b50600062000175565b60009081526001919091016020526040902054151590565b600060208284031215620001f4578081fd5b81516001600160a01b03811681146200020b578182fd5b9392505050565b61238480620002226000396000f3fe60806040526004361061014b5760003560e01c80639010d07c116100b6578063d0fa9a091161006f578063d0fa9a09146103a3578063d11a57ec146103b8578063d547741f146103cd578063e086e5ec146103ed578063f5b541a614610402578063fabc1cbc146104175761014b565b80639010d07c146102d457806391d14854146102f457806393f1a40b14610321578063a217fddf1461034e578063b34b146814610363578063ca15c873146103835761014b565b80632f2ff15d116101085780632f2ff15d1461021f57806336568abe1461023f57806347ccca021461025f57806365aad4fd146102815780636ba846ac146102945780637eaeb546146102b45761014b565b8063081e3eda14610150578063136439dd1461017b57806314fe4b941461019d5780631526fe27146101bd57806318160ddd146101ea578063248a9ca3146101ff575b600080fd5b34801561015c57600080fd5b50610165610437565b6040516101729190611a4f565b60405180910390f35b34801561018757600080fd5b5061019b61019636600461181b565b61043d565b005b3480156101a957600080fd5b5061019b6101b83660046118d2565b61051a565b3480156101c957600080fd5b506101dd6101d836600461181b565b6107ad565b6040516101729190612285565b3480156101f657600080fd5b50610165610823565b34801561020b57600080fd5b5061016561021a36600461181b565b610874565b34801561022b57600080fd5b5061019b61023a366004611833565b610889565b34801561024b57600080fd5b5061019b61025a366004611833565b6108d1565b34801561026b57600080fd5b50610274610913565b6040516101729190611a17565b61019b61028f366004611967565b610922565b3480156102a057600080fd5b5061019b6102af36600461186d565b610c41565b3480156102c057600080fd5b5061019b6102cf36600461191c565b610d16565b3480156102e057600080fd5b506102746102ef36600461186d565b610f1b565b34801561030057600080fd5b5061031461030f366004611833565b610f3c565b6040516101729190611a44565b34801561032d57600080fd5b5061034161033c3660046118a6565b610f54565b60405161017291906122cb565b34801561035a57600080fd5b50610165610f91565b34801561036f57600080fd5b5061019b61037e3660046119b8565b610f96565b34801561038f57600080fd5b5061016561039e36600461181b565b6110bd565b3480156103af57600080fd5b506101656110d4565b3480156103c457600080fd5b50610165611116565b3480156103d957600080fd5b5061019b6103e8366004611833565b61113a565b3480156103f957600080fd5b5061019b611174565b34801561040e57600080fd5b5061016561120b565b34801561042357600080fd5b5061019b61043236600461181b565b61121d565b60035490565b61045760008051602061230f83398151915261030f611305565b61047c5760405162461bcd60e51b815260040161047390611d48565b60405180910390fd5b6003818154811061048957fe5b600091825260209091206002600690920201015460ff16156104bd5760405162461bcd60e51b81526004016104739061224e565b6001600382815481106104cc57fe5b60009182526020822060069190910201600201805460ff19169215159290921790915560405182917f32fb7c9891bc4f963c7de9f1186d2a7755c7d6e9f4604dabe1d8bb3027c2f49e91a250565b61053460008051602061230f83398151915261030f611305565b6105505760405162461bcd60e51b815260040161047390611d48565b60006003848154811061055f57fe5b60009182526020909120600690910201600281015490915060ff16156105975760405162461bcd60e51b815260040161047390611bfe565b816105b45760405162461bcd60e51b815260040161047390611e7a565b805460018201546105c59084611309565b11156105e35760405162461bcd60e51b815260040161047390611e31565b60005b828110156107a65760008484838181106105fc57fe5b90506020020160208101906106119190611800565b905060006106a66001600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066857600080fd5b505afa15801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a0919061188e565b90611309565b60008881526004602090815260408083206001600160a01b0387168452909152902060018681015492935090916106dc91611309565b60018087019190915581546106f091611309565b8155600254604051632851206560e21b81526001600160a01b039091169063a1448194906107249086908690600401611a2b565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b50505050826001600160a01b0316887fa8df055256606ba5aac9eb70062e4896d61ca7e3a678b0e783be2a1c18cdc0e6846000604051610793929190611a06565b60405180910390a35050506001016105e6565b5050505050565b6107b5611752565b600382815481106107c257fe5b60009182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015460ff16151590820152600382015460608201526004820154608082015260059091015460a08201529050919050565b60008060005b60035481101561086e576108646003828154811061084357fe5b9060005260206000209060060201600101548361130990919063ffffffff16565b9150600101610829565b50905090565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546108a79061030f611305565b6108c35760405162461bcd60e51b815260040161047390611b23565b6108cd828261132e565b5050565b6108d9611305565b6001600160a01b0316816001600160a01b0316146109095760405162461bcd60e51b8152600401610473906121ff565b6108cd8282611397565b6002546001600160a01b031681565b600260015414156109455760405162461bcd60e51b8152600401610473906121c8565b60026001556000610954611305565b905060006003868154811061096557fe5b60009182526020909120600690910201600281015490915060ff161561099d5760405162461bcd60e51b815260040161047390611ff3565b610a0484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060048301546040516109e99086906020016119e9565b60405160208183030381529060405280519060200120611400565b610a205760405162461bcd60e51b8152600401610473906120f3565b60008511610a405760405162461bcd60e51b815260040161047390611fa4565b80546001820154610a519087611309565b1115610a6f5760405162461bcd60e51b815260040161047390612183565b60038101543490610a80908761149d565b14610a9d5760405162461bcd60e51b815260040161047390611ade565b60008681526004602090815260408083206001600160a01b0386168452909152902060058201548154610ad09088611309565b1115610aee5760405162461bcd60e51b815260040161047390612061565b60005b86811015610c33576000610b4e6001600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066857600080fd5b9050610b686001856001015461130990919063ffffffff16565b6001808601919091558354610b7c91611309565b8355600254604051632851206560e21b81526001600160a01b039091169063a144819490610bb09088908590600401611a2b565b600060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b50505050846001600160a01b0316897fa8df055256606ba5aac9eb70062e4896d61ca7e3a678b0e783be2a1c18cdc0e6838760030154604051610c22929190611a06565b60405180910390a350600101610af1565b505060018055505050505050565b610c5b60008051602061230f83398151915261030f611305565b610c775760405162461bcd60e51b815260040161047390611d48565b60038281548110610c8457fe5b600091825260209091206002600690920201015460ff16610cb75760405162461bcd60e51b815260040161047390611a58565b8060038381548110610cc557fe5b906000526020600020906006020160040181905550817f79d7408f662dd8563da2d4eb506229026770f7d49a04500e7134cb8b93fe61a682604051610d0a9190611a4f565b60405180910390a25050565b610d3060008051602061230f83398151915261030f611305565b610d4c5760405162461bcd60e51b815260040161047390611d48565b60008211610d6c5760405162461bcd60e51b815260040161047390611f47565b60008511610d8c5760405162461bcd60e51b815260040161047390611b72565b6040805160c081018252868152600060208201818152871515938301938452606083018781526080840186815260a0850188815260038054600180820183559682905296517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60069098029788015593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c87015595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805460ff191691151591909117905590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f84015592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f860909201919091559054610ed5916114d7565b7fa2d579ab0bf34a1b4c45c28eb40d8b9e188e08b4e4948ddc33bef7ab3859f2f08686868587604051610f0c9594939291906122d5565b60405180910390a25050505050565b6000828152602081905260408120610f3390836114ff565b90505b92915050565b6000828152602081905260408120610f33908361150b565b610f5c61178d565b5060009182526004602090815260408084206001600160a01b0393909316845291815291819020815192830190915254815290565b600081565b610fb060008051602061230f83398151915261030f611305565b610fcc5760405162461bcd60e51b815260040161047390611d48565b600060038581548110610fdb57fe5b60009182526020909120600690910201600281015490915060ff166110125760405162461bcd60e51b815260040161047390611c41565b600082116110325760405162461bcd60e51b8152600401610473906120a8565b600084116110525760405162461bcd60e51b815260040161047390611dda565b80600101548410156110765760405162461bcd60e51b815260040161047390612138565b838155600381018390556005810182905560405185907f8b9d819ed25708b0f7087c2d19f08a10bdaf8430c616078e81dd6f174d129bca90610f0c908790879087906122f8565b6000818152602081905260408120610f3690611520565b60008060005b60035481101561086e5761110c600382815481106110f457fe5b60009182526020909120600690910201548390611309565b91506001016110da565b7fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca981565b6000828152602081905260409020600201546111589061030f611305565b6109095760405162461bcd60e51b815260040161047390611d8a565b6111a07fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca961030f611305565b6111bc5760405162461bcd60e51b815260040161047390611ec4565b476111c7338261152b565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516112009190611a4f565b60405180910390a250565b60008051602061230f83398151915281565b61123760008051602061230f83398151915261030f611305565b6112535760405162461bcd60e51b815260040161047390611d48565b6003818154811061126057fe5b600091825260209091206002600690920201015460ff166112935760405162461bcd60e51b81526004016104739061202a565b6000600382815481106112a257fe5b60009182526020822060069190910201600201805460ff19169215159290921790915560405182917f9dd715fed52c25e642f97653bb4c4339ad98fe6d6e130348be82ae5d86383a8c91a250565b6000610f33836001600160a01b0384166115cc565b3390565b600082820183811015610f335760405162461bcd60e51b815260040161047390611bc7565b600082815260208190526040902061134690826112f0565b156108cd57611353611305565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206113af9082611616565b156108cd576113bc611305565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600081815b855181101561149257600086828151811061141c57fe5b6020026020010151905080831161145d578281604051602001611440929190611a06565b604051602081830303815290604052805190602001209250611489565b8083604051602001611470929190611a06565b6040516020818303038152906040528051906020012092505b50600101611405565b509092149392505050565b6000826114ac57506000610f36565b828202828482816114b957fe5b0414610f335760405162461bcd60e51b815260040161047390611f06565b6000828211156114f95760405162461bcd60e51b815260040161047390611c7d565b50900390565b6000610f33838361162b565b6000610f33836001600160a01b038416611670565b6000610f3682611688565b8047101561154b5760405162461bcd60e51b815260040161047390611d11565b6000826001600160a01b03168260405161156490611a14565b60006040518083038185875af1925050503d80600081146115a1576040519150601f19603f3d011682016040523d82523d6000602084013e6115a6565b606091505b50509050806115c75760405162461bcd60e51b815260040161047390611cb4565b505050565b60006115d88383611670565b61160e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f36565b506000610f36565b6000610f33836001600160a01b03841661168c565b8154600090821061164e5760405162461bcd60e51b815260040161047390611a9c565b82600001828154811061165d57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b6000818152600183016020526040812054801561174857835460001980830191908101906000908790839081106116bf57fe5b90600052602060002001549050808760000184815481106116dc57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061170c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f36565b6000915050610f36565b6040518060c0016040528060008152602001600081526020016000151581526020016000815260200160008019168152602001600081525090565b6040518060200160405280600081525090565b80356001600160a01b0381168114610f3657600080fd5b60008083601f8401126117c8578182fd5b50813567ffffffffffffffff8111156117df578182fd5b60208301915083602080830285010111156117f957600080fd5b9250929050565b600060208284031215611811578081fd5b610f3383836117a0565b60006020828403121561182c578081fd5b5035919050565b60008060408385031215611845578081fd5b8235915060208301356001600160a01b0381168114611862578182fd5b809150509250929050565b6000806040838503121561187f578182fd5b50508035926020909101359150565b60006020828403121561189f578081fd5b5051919050565b600080604083850312156118b8578182fd5b823591506118c984602085016117a0565b90509250929050565b6000806000604084860312156118e6578081fd5b83359250602084013567ffffffffffffffff811115611903578182fd5b61190f868287016117b7565b9497909650939450505050565b600080600080600060a08688031215611933578081fd5b8535945060208601358015158114611949578182fd5b94979496505050506040830135926060810135926080909101359150565b6000806000806060858703121561197c578384fd5b8435935060208501359250604085013567ffffffffffffffff8111156119a0578283fd5b6119ac878288016117b7565b95989497509550505050565b600080600080608085870312156119cd578384fd5b5050823594602084013594506040840135936060013592509050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526024908201527f4e4654466163746f72793a3a736574506f6f6c526f6f743a20486173207374616040820152631c9d195960e21b606082015260800190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526025908201527f4e4654466163746f72793a3a6d696e744e46543a2050617920616d6f756e742060408201526432b93937b960d91b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526035908201527f4e4654466163746f72793a3a616464506f6f6c3a204d6178206e756d206d75736040820152747420626520686967686572207468616e207a65726f60581b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526023908201527f4e4654466163746f72793a3a6d696e7441697264726f703a20486173207061756040820152621cd95960ea1b606082015260800190565b6020808252602e9082015260008051602061232f83398151915260408201526d1d0e8812185cc81cdd185c9d195960921b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526022908201527f4e4654466163746f72793a3a63616c6c6572206973206e6f74206f706572617460408201526137b960f11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b602080825260439082015260008051602061232f83398151915260408201527f743a204d6178206e756d206d75737420626520686967686572207468616e207a60608201526265726f60e81b608082015260a00190565b60208082526029908201527f4e4654466163746f72793a6d696e7441697264726f703a20506f6f6c2063617060408201526808195e18d95959195960ba1b606082015260800190565b6020808252602a908201527f4e4654466163746f72793a3a6d696e7441697264726f703a204163636f756e746040820152697320697320656d70747960b01b606082015260800190565b60208082526022908201527f4e4654466163746f72793a3a63616c6c6572206973206e6f7420747265617375604082015261727960f01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252603b908201527f4e4654466163746f72793a3a616464506f6f6c3a204c696d697420706572206160408201527f63636f756e74206d757374206772656174207468616e207a65726f0000000000606082015260800190565b6020808252602f908201527f4e4654466163746f72793a6d696e744e46543a206e756d206d7573742062652060408201526e6772656174207468616e207a65726f60881b606082015260800190565b6020808252601f908201527f4e4654466163746f72793a3a6d696e744e46543a204861732070617573656400604082015260600190565b6020808252601e908201527f4e4654466163746f72793a3a70617573653a2048617320737461727465640000604082015260600190565b60208082526027908201527f4e4654466163746f72793a3a6d696e744e46543a20436c61696d206e756d20656040820152661e18d95959195960ca1b606082015260800190565b6020808252603d9082015260008051602061232f83398151915260408201527f743a204c696d6974206d757374206772656174207468616e207a65726f000000606082015260800190565b60208082526025908201527f4e4654466163746f72793a3a6d696e744e46543a204e6f7420696e2077686974604082015264195b1a5cdd60da1b606082015260800190565b602080825260379082015260008051602061232f83398151915260408201527f743a204d6178206e756d20636170206578636565646564000000000000000000606082015260800190565b60208082526025908201527f4e4654466163746f72793a6d696e744e46543a20506f6f6c2063617020657863604082015264195959195960da1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6020808252601d908201527f4e4654466163746f72793a3a70617573653a2048617320706175736564000000604082015260600190565b600060c0820190508251825260208301516020830152604083015115156040830152606083015160608301526080830151608083015260a083015160a083015292915050565b9051815260200190565b948552921515602085015260408401919091526060830152608082015260a00190565b928352602083019190915260408201526060019056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9294e4654466163746f72793a3a736574506f6f6c4d61784e756d416e644c696d69a264697066735822122082ba7ea50dfbd1134356048cf4178bc4deaaa0d15defe82cfc6d74c42dbf82f564736f6c634300060c0033000000000000000000000000afb3fbacc5877fc96e953ddc1ccc4c2114238273
Deployed Bytecode
0x60806040526004361061014b5760003560e01c80639010d07c116100b6578063d0fa9a091161006f578063d0fa9a09146103a3578063d11a57ec146103b8578063d547741f146103cd578063e086e5ec146103ed578063f5b541a614610402578063fabc1cbc146104175761014b565b80639010d07c146102d457806391d14854146102f457806393f1a40b14610321578063a217fddf1461034e578063b34b146814610363578063ca15c873146103835761014b565b80632f2ff15d116101085780632f2ff15d1461021f57806336568abe1461023f57806347ccca021461025f57806365aad4fd146102815780636ba846ac146102945780637eaeb546146102b45761014b565b8063081e3eda14610150578063136439dd1461017b57806314fe4b941461019d5780631526fe27146101bd57806318160ddd146101ea578063248a9ca3146101ff575b600080fd5b34801561015c57600080fd5b50610165610437565b6040516101729190611a4f565b60405180910390f35b34801561018757600080fd5b5061019b61019636600461181b565b61043d565b005b3480156101a957600080fd5b5061019b6101b83660046118d2565b61051a565b3480156101c957600080fd5b506101dd6101d836600461181b565b6107ad565b6040516101729190612285565b3480156101f657600080fd5b50610165610823565b34801561020b57600080fd5b5061016561021a36600461181b565b610874565b34801561022b57600080fd5b5061019b61023a366004611833565b610889565b34801561024b57600080fd5b5061019b61025a366004611833565b6108d1565b34801561026b57600080fd5b50610274610913565b6040516101729190611a17565b61019b61028f366004611967565b610922565b3480156102a057600080fd5b5061019b6102af36600461186d565b610c41565b3480156102c057600080fd5b5061019b6102cf36600461191c565b610d16565b3480156102e057600080fd5b506102746102ef36600461186d565b610f1b565b34801561030057600080fd5b5061031461030f366004611833565b610f3c565b6040516101729190611a44565b34801561032d57600080fd5b5061034161033c3660046118a6565b610f54565b60405161017291906122cb565b34801561035a57600080fd5b50610165610f91565b34801561036f57600080fd5b5061019b61037e3660046119b8565b610f96565b34801561038f57600080fd5b5061016561039e36600461181b565b6110bd565b3480156103af57600080fd5b506101656110d4565b3480156103c457600080fd5b50610165611116565b3480156103d957600080fd5b5061019b6103e8366004611833565b61113a565b3480156103f957600080fd5b5061019b611174565b34801561040e57600080fd5b5061016561120b565b34801561042357600080fd5b5061019b61043236600461181b565b61121d565b60035490565b61045760008051602061230f83398151915261030f611305565b61047c5760405162461bcd60e51b815260040161047390611d48565b60405180910390fd5b6003818154811061048957fe5b600091825260209091206002600690920201015460ff16156104bd5760405162461bcd60e51b81526004016104739061224e565b6001600382815481106104cc57fe5b60009182526020822060069190910201600201805460ff19169215159290921790915560405182917f32fb7c9891bc4f963c7de9f1186d2a7755c7d6e9f4604dabe1d8bb3027c2f49e91a250565b61053460008051602061230f83398151915261030f611305565b6105505760405162461bcd60e51b815260040161047390611d48565b60006003848154811061055f57fe5b60009182526020909120600690910201600281015490915060ff16156105975760405162461bcd60e51b815260040161047390611bfe565b816105b45760405162461bcd60e51b815260040161047390611e7a565b805460018201546105c59084611309565b11156105e35760405162461bcd60e51b815260040161047390611e31565b60005b828110156107a65760008484838181106105fc57fe5b90506020020160208101906106119190611800565b905060006106a66001600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066857600080fd5b505afa15801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a0919061188e565b90611309565b60008881526004602090815260408083206001600160a01b0387168452909152902060018681015492935090916106dc91611309565b60018087019190915581546106f091611309565b8155600254604051632851206560e21b81526001600160a01b039091169063a1448194906107249086908690600401611a2b565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b50505050826001600160a01b0316887fa8df055256606ba5aac9eb70062e4896d61ca7e3a678b0e783be2a1c18cdc0e6846000604051610793929190611a06565b60405180910390a35050506001016105e6565b5050505050565b6107b5611752565b600382815481106107c257fe5b60009182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015460ff16151590820152600382015460608201526004820154608082015260059091015460a08201529050919050565b60008060005b60035481101561086e576108646003828154811061084357fe5b9060005260206000209060060201600101548361130990919063ffffffff16565b9150600101610829565b50905090565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546108a79061030f611305565b6108c35760405162461bcd60e51b815260040161047390611b23565b6108cd828261132e565b5050565b6108d9611305565b6001600160a01b0316816001600160a01b0316146109095760405162461bcd60e51b8152600401610473906121ff565b6108cd8282611397565b6002546001600160a01b031681565b600260015414156109455760405162461bcd60e51b8152600401610473906121c8565b60026001556000610954611305565b905060006003868154811061096557fe5b60009182526020909120600690910201600281015490915060ff161561099d5760405162461bcd60e51b815260040161047390611ff3565b610a0484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060048301546040516109e99086906020016119e9565b60405160208183030381529060405280519060200120611400565b610a205760405162461bcd60e51b8152600401610473906120f3565b60008511610a405760405162461bcd60e51b815260040161047390611fa4565b80546001820154610a519087611309565b1115610a6f5760405162461bcd60e51b815260040161047390612183565b60038101543490610a80908761149d565b14610a9d5760405162461bcd60e51b815260040161047390611ade565b60008681526004602090815260408083206001600160a01b0386168452909152902060058201548154610ad09088611309565b1115610aee5760405162461bcd60e51b815260040161047390612061565b60005b86811015610c33576000610b4e6001600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561066857600080fd5b9050610b686001856001015461130990919063ffffffff16565b6001808601919091558354610b7c91611309565b8355600254604051632851206560e21b81526001600160a01b039091169063a144819490610bb09088908590600401611a2b565b600060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b50505050846001600160a01b0316897fa8df055256606ba5aac9eb70062e4896d61ca7e3a678b0e783be2a1c18cdc0e6838760030154604051610c22929190611a06565b60405180910390a350600101610af1565b505060018055505050505050565b610c5b60008051602061230f83398151915261030f611305565b610c775760405162461bcd60e51b815260040161047390611d48565b60038281548110610c8457fe5b600091825260209091206002600690920201015460ff16610cb75760405162461bcd60e51b815260040161047390611a58565b8060038381548110610cc557fe5b906000526020600020906006020160040181905550817f79d7408f662dd8563da2d4eb506229026770f7d49a04500e7134cb8b93fe61a682604051610d0a9190611a4f565b60405180910390a25050565b610d3060008051602061230f83398151915261030f611305565b610d4c5760405162461bcd60e51b815260040161047390611d48565b60008211610d6c5760405162461bcd60e51b815260040161047390611f47565b60008511610d8c5760405162461bcd60e51b815260040161047390611b72565b6040805160c081018252868152600060208201818152871515938301938452606083018781526080840186815260a0850188815260038054600180820183559682905296517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60069098029788015593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c87015595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d8601805460ff191691151591909117905590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f84015592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f860909201919091559054610ed5916114d7565b7fa2d579ab0bf34a1b4c45c28eb40d8b9e188e08b4e4948ddc33bef7ab3859f2f08686868587604051610f0c9594939291906122d5565b60405180910390a25050505050565b6000828152602081905260408120610f3390836114ff565b90505b92915050565b6000828152602081905260408120610f33908361150b565b610f5c61178d565b5060009182526004602090815260408084206001600160a01b0393909316845291815291819020815192830190915254815290565b600081565b610fb060008051602061230f83398151915261030f611305565b610fcc5760405162461bcd60e51b815260040161047390611d48565b600060038581548110610fdb57fe5b60009182526020909120600690910201600281015490915060ff166110125760405162461bcd60e51b815260040161047390611c41565b600082116110325760405162461bcd60e51b8152600401610473906120a8565b600084116110525760405162461bcd60e51b815260040161047390611dda565b80600101548410156110765760405162461bcd60e51b815260040161047390612138565b838155600381018390556005810182905560405185907f8b9d819ed25708b0f7087c2d19f08a10bdaf8430c616078e81dd6f174d129bca90610f0c908790879087906122f8565b6000818152602081905260408120610f3690611520565b60008060005b60035481101561086e5761110c600382815481106110f457fe5b60009182526020909120600690910201548390611309565b91506001016110da565b7fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca981565b6000828152602081905260409020600201546111589061030f611305565b6109095760405162461bcd60e51b815260040161047390611d8a565b6111a07fe1dcbdb91df27212a29bc27177c840cf2f819ecf2187432e1fac86c2dd5dfca961030f611305565b6111bc5760405162461bcd60e51b815260040161047390611ec4565b476111c7338261152b565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516112009190611a4f565b60405180910390a250565b60008051602061230f83398151915281565b61123760008051602061230f83398151915261030f611305565b6112535760405162461bcd60e51b815260040161047390611d48565b6003818154811061126057fe5b600091825260209091206002600690920201015460ff166112935760405162461bcd60e51b81526004016104739061202a565b6000600382815481106112a257fe5b60009182526020822060069190910201600201805460ff19169215159290921790915560405182917f9dd715fed52c25e642f97653bb4c4339ad98fe6d6e130348be82ae5d86383a8c91a250565b6000610f33836001600160a01b0384166115cc565b3390565b600082820183811015610f335760405162461bcd60e51b815260040161047390611bc7565b600082815260208190526040902061134690826112f0565b156108cd57611353611305565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206113af9082611616565b156108cd576113bc611305565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600081815b855181101561149257600086828151811061141c57fe5b6020026020010151905080831161145d578281604051602001611440929190611a06565b604051602081830303815290604052805190602001209250611489565b8083604051602001611470929190611a06565b6040516020818303038152906040528051906020012092505b50600101611405565b509092149392505050565b6000826114ac57506000610f36565b828202828482816114b957fe5b0414610f335760405162461bcd60e51b815260040161047390611f06565b6000828211156114f95760405162461bcd60e51b815260040161047390611c7d565b50900390565b6000610f33838361162b565b6000610f33836001600160a01b038416611670565b6000610f3682611688565b8047101561154b5760405162461bcd60e51b815260040161047390611d11565b6000826001600160a01b03168260405161156490611a14565b60006040518083038185875af1925050503d80600081146115a1576040519150601f19603f3d011682016040523d82523d6000602084013e6115a6565b606091505b50509050806115c75760405162461bcd60e51b815260040161047390611cb4565b505050565b60006115d88383611670565b61160e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f36565b506000610f36565b6000610f33836001600160a01b03841661168c565b8154600090821061164e5760405162461bcd60e51b815260040161047390611a9c565b82600001828154811061165d57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b6000818152600183016020526040812054801561174857835460001980830191908101906000908790839081106116bf57fe5b90600052602060002001549050808760000184815481106116dc57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061170c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f36565b6000915050610f36565b6040518060c0016040528060008152602001600081526020016000151581526020016000815260200160008019168152602001600081525090565b6040518060200160405280600081525090565b80356001600160a01b0381168114610f3657600080fd5b60008083601f8401126117c8578182fd5b50813567ffffffffffffffff8111156117df578182fd5b60208301915083602080830285010111156117f957600080fd5b9250929050565b600060208284031215611811578081fd5b610f3383836117a0565b60006020828403121561182c578081fd5b5035919050565b60008060408385031215611845578081fd5b8235915060208301356001600160a01b0381168114611862578182fd5b809150509250929050565b6000806040838503121561187f578182fd5b50508035926020909101359150565b60006020828403121561189f578081fd5b5051919050565b600080604083850312156118b8578182fd5b823591506118c984602085016117a0565b90509250929050565b6000806000604084860312156118e6578081fd5b83359250602084013567ffffffffffffffff811115611903578182fd5b61190f868287016117b7565b9497909650939450505050565b600080600080600060a08688031215611933578081fd5b8535945060208601358015158114611949578182fd5b94979496505050506040830135926060810135926080909101359150565b6000806000806060858703121561197c578384fd5b8435935060208501359250604085013567ffffffffffffffff8111156119a0578283fd5b6119ac878288016117b7565b95989497509550505050565b600080600080608085870312156119cd578384fd5b5050823594602084013594506040840135936060013592509050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b918252602082015260400190565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526024908201527f4e4654466163746f72793a3a736574506f6f6c526f6f743a20486173207374616040820152631c9d195960e21b606082015260800190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526025908201527f4e4654466163746f72793a3a6d696e744e46543a2050617920616d6f756e742060408201526432b93937b960d91b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b60208082526035908201527f4e4654466163746f72793a3a616464506f6f6c3a204d6178206e756d206d75736040820152747420626520686967686572207468616e207a65726f60581b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526023908201527f4e4654466163746f72793a3a6d696e7441697264726f703a20486173207061756040820152621cd95960ea1b606082015260800190565b6020808252602e9082015260008051602061232f83398151915260408201526d1d0e8812185cc81cdd185c9d195960921b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526022908201527f4e4654466163746f72793a3a63616c6c6572206973206e6f74206f706572617460408201526137b960f11b606082015260800190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b602080825260439082015260008051602061232f83398151915260408201527f743a204d6178206e756d206d75737420626520686967686572207468616e207a60608201526265726f60e81b608082015260a00190565b60208082526029908201527f4e4654466163746f72793a6d696e7441697264726f703a20506f6f6c2063617060408201526808195e18d95959195960ba1b606082015260800190565b6020808252602a908201527f4e4654466163746f72793a3a6d696e7441697264726f703a204163636f756e746040820152697320697320656d70747960b01b606082015260800190565b60208082526022908201527f4e4654466163746f72793a3a63616c6c6572206973206e6f7420747265617375604082015261727960f01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252603b908201527f4e4654466163746f72793a3a616464506f6f6c3a204c696d697420706572206160408201527f63636f756e74206d757374206772656174207468616e207a65726f0000000000606082015260800190565b6020808252602f908201527f4e4654466163746f72793a6d696e744e46543a206e756d206d7573742062652060408201526e6772656174207468616e207a65726f60881b606082015260800190565b6020808252601f908201527f4e4654466163746f72793a3a6d696e744e46543a204861732070617573656400604082015260600190565b6020808252601e908201527f4e4654466163746f72793a3a70617573653a2048617320737461727465640000604082015260600190565b60208082526027908201527f4e4654466163746f72793a3a6d696e744e46543a20436c61696d206e756d20656040820152661e18d95959195960ca1b606082015260800190565b6020808252603d9082015260008051602061232f83398151915260408201527f743a204c696d6974206d757374206772656174207468616e207a65726f000000606082015260800190565b60208082526025908201527f4e4654466163746f72793a3a6d696e744e46543a204e6f7420696e2077686974604082015264195b1a5cdd60da1b606082015260800190565b602080825260379082015260008051602061232f83398151915260408201527f743a204d6178206e756d20636170206578636565646564000000000000000000606082015260800190565b60208082526025908201527f4e4654466163746f72793a6d696e744e46543a20506f6f6c2063617020657863604082015264195959195960da1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b6020808252601d908201527f4e4654466163746f72793a3a70617573653a2048617320706175736564000000604082015260600190565b600060c0820190508251825260208301516020830152604083015115156040830152606083015160608301526080830151608083015260a083015160a083015292915050565b9051815260200190565b948552921515602085015260408401919091526060830152608082015260a00190565b928352602083019190915260408201526060019056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9294e4654466163746f72793a3a736574506f6f6c4d61784e756d416e644c696d69a264697066735822122082ba7ea50dfbd1134356048cf4178bc4deaaa0d15defe82cfc6d74c42dbf82f564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afb3fbacc5877fc96e953ddc1ccc4c2114238273
-----Decoded View---------------
Arg [0] : _nft (address): 0xafB3FBAcc5877fc96E953DDC1CCC4C2114238273
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000afb3fbacc5877fc96e953ddc1ccc4c2114238273
Deployed Bytecode Sourcemap
40436:6938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43042:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46291:197;;;;;;;;;;-1:-1:-1;46291:197:0;;;;;:::i;:::-;;:::i;:::-;;44337:930;;;;;;;;;;-1:-1:-1;44337:930:0;;;;;:::i;:::-;;:::i;42782:109::-;;;;;;;;;;-1:-1:-1;42782:109:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46940:226::-;;;;;;;;;;;;;:::i;35591:114::-;;;;;;;;;;-1:-1:-1;35591:114:0;;;;;:::i;:::-;;:::i;35967:227::-;;;;;;;;;;-1:-1:-1;35967:227:0;;;;;:::i;:::-;;:::i;37176:209::-;;;;;;;;;;-1:-1:-1;37176:209:0;;;;;:::i;:::-;;:::i;40680:18::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43142:1187::-;;;;;;:::i;:::-;;:::i;46048:235::-;;;;;;;;;;-1:-1:-1;46048:235:0;;;;;:::i;:::-;;:::i;42120:654::-;;;;;;;;;;-1:-1:-1;42120:654:0;;;;;:::i;:::-;;:::i;35264:138::-;;;;;;;;;;-1:-1:-1;35264:138:0;;;;;:::i;:::-;;:::i;34225:139::-;;;;;;;;;;-1:-1:-1;34225:139:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42899:135::-;;;;;;;;;;-1:-1:-1;42899:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32970:49::-;;;;;;;;;;;;;:::i;45275:765::-;;;;;;;;;;-1:-1:-1;45275:765:0;;;;;:::i;:::-;;:::i;34538:127::-;;;;;;;;;;-1:-1:-1;34538:127:0;;;;;:::i;:::-;;:::i;46706:226::-;;;;;;;;;;;;;:::i;40605:66::-;;;;;;;;;;;;;:::i;36439:230::-;;;;;;;;;;-1:-1:-1;36439:230:0;;;;;:::i;:::-;;:::i;47174:197::-;;;;;;;;;;;;;:::i;40532:66::-;;;;;;;;;;;;;:::i;46496:202::-;;;;;;;;;;-1:-1:-1;46496:202:0;;;;;:::i;:::-;;:::i;43042:92::-;43114:5;:12;43042:92;:::o;46291:197::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;;;;;;;;;46362:5:::1;46368:4;46362:11;;;;;;;;;::::0;;;::::1;::::0;;;:18:::1;:11;::::0;;::::1;;:18;::::0;::::1;;46361:19;46353:61;;;;-1:-1:-1::0;;;46353:61:0::1;;;;;;;:::i;:::-;46448:4;46427:5;46433:4;46427:11;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;:18;;:25:::0;;-1:-1:-1;;46427:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;46468:12:::1;::::0;46475:4;;46468:12:::1;::::0;::::1;46291:197:::0;:::o;44337:930::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;44435:21:::1;44459:5;44465:4;44459:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;44490;::::0;::::1;::::0;44459;;-1:-1:-1;44490:11:0::1;;44489:12;44481:60;;;;-1:-1:-1::0;;;44481:60:0::1;;;;;;;:::i;:::-;44560:20:::0;44552:75:::1;;;;-1:-1:-1::0;;;44552:75:0::1;;;;;;;:::i;:::-;44683:11:::0;;44646::::1;::::0;::::1;::::0;:33:::1;::::0;44662:9;44646:15:::1;:33::i;:::-;:48;;44638:102;;;;-1:-1:-1::0;;;44638:102:0::1;;;;;;;:::i;:::-;44828:9;44823:437;44843:20:::0;;::::1;44823:437;;;44885:15;44903:9;;44913:1;44903:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;44885:30;;44930:15;44948:24;44970:1;44948:3;;;;;;;;;-1:-1:-1::0;;;;;44948:3:0::1;-1:-1:-1::0;;;;;44948:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:21:::0;::::1;:24::i;:::-;44989:25;45017:11:::0;;;:5:::1;:11;::::0;;;;;;;-1:-1:-1;;;;;45017:20:0;::::1;::::0;;;;;;;45082:1:::1;45066:11:::0;;::::1;::::0;44930:42;;-1:-1:-1;45017:20:0;;45066:18:::1;::::0;:15:::1;:18::i;:::-;45052:11;::::0;;::::1;:32:::0;;;;45121:19;;:26:::1;::::0;:23:::1;:26::i;:::-;45099:48:::0;;45162:3:::1;::::0;:30:::1;::::0;-1:-1:-1;;;45162:30:0;;-1:-1:-1;;;;;45162:3:0;;::::1;::::0;:12:::1;::::0;:30:::1;::::0;45175:7;;45184;;45162:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45228:7;-1:-1:-1::0;;;;;45214:34:0::1;45222:4;45214:34;45237:7;45246:1;45214:34;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;44865:3:0::1;;44823:437;;;;41957:1;44337:930:::0;;;:::o;42782:109::-;42837:15;;:::i;:::-;42872:5;42878:4;42872:11;;;;;;;;;;;;;;;;;42865:18;;;;;;;;42872:11;;;;;;;42865:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42782:109:0;;;:::o;46940:226::-;46984:7;47004:14;47034:9;47029:106;47053:5;:12;47049:16;;47029:106;;;47096:27;47107:5;47113:1;47107:8;;;;;;;;;;;;;;;;;;:15;;;47096:6;:10;;:27;;;;:::i;:::-;47087:36;-1:-1:-1;47067:3:0;;47029:106;;;-1:-1:-1;47152:6:0;-1:-1:-1;46940:226:0;:::o;35591:114::-;35648:7;35675:12;;;;;;;;;;:22;;;;35591:114::o;35967:227::-;36059:6;:12;;;;;;;;;;:22;;;36051:45;;36083:12;:10;:12::i;36051:45::-;36043:105;;;;-1:-1:-1;;;36043:105:0;;;;;;;:::i;:::-;36161:25;36172:4;36178:7;36161:10;:25::i;:::-;35967:227;;:::o;37176:209::-;37274:12;:10;:12::i;:::-;-1:-1:-1;;;;;37263:23:0;:7;-1:-1:-1;;;;;37263:23:0;;37255:83;;;;-1:-1:-1;;;37255:83:0;;;;;;;:::i;:::-;37351:26;37363:4;37369:7;37351:11;:26::i;40680:18::-;;;-1:-1:-1;;;;;40680:18:0;;:::o;43142:1187::-;5089:1;5695:7;;:19;;5687:63;;;;-1:-1:-1;;;5687:63:0;;;;;;;:::i;:::-;5089:1;5828:7;:18;43255:15:::1;43273:12;:10;:12::i;:::-;43255:30;;43296:21;43320:5;43326:4;43320:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;43353;::::0;::::1;::::0;43320;;-1:-1:-1;43353:11:0::1;;43352:12;43344:56;;;;-1:-1:-1::0;;;43344:56:0::1;;;;;;;:::i;:::-;43419:75;43438:6;;43419:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;43446:9:0::1;::::0;::::1;::::0;43467:25:::1;::::0;::::1;::::0;43484:7;;43467:25:::1;;;:::i;:::-;;;;;;;;;;;;;43457:36;;;;;;43419:18;:75::i;:::-;43411:125;;;;-1:-1:-1::0;;;43411:125:0::1;;;;;;;:::i;:::-;43562:1;43555:4;:8;43547:68;;;;-1:-1:-1::0;;;43547:68:0::1;;;;;;;:::i;:::-;43659:11:::0;;43634::::1;::::0;::::1;::::0;:21:::1;::::0;43650:4;43634:15:::1;:21::i;:::-;:36;;43626:86;;;;-1:-1:-1::0;;;43626:86:0::1;;;;;;;:::i;:::-;43731:10;::::0;::::1;::::0;43755:9:::1;::::0;43731:20:::1;::::0;43746:4;43731:14:::1;:20::i;:::-;:33;43723:83;;;;-1:-1:-1::0;;;43723:83:0::1;;;;;;;:::i;:::-;43819:25;43847:11:::0;;;:5:::1;:11;::::0;;;;;;;-1:-1:-1;;;;;43847:20:0;::::1;::::0;;;;;;;43919::::1;::::0;::::1;::::0;43886:19;;:29:::1;::::0;43910:4;43886:23:::1;:29::i;:::-;:53;;43878:105;;;;-1:-1:-1::0;;;43878:105:0::1;;;;;;;:::i;:::-;44001:9;43996:326;44020:4;44016:1;:8;43996:326;;;44046:15;44064:24;44086:1;44064:3;;;;;;;;;-1:-1:-1::0;;;;;44064:3:0::1;-1:-1:-1::0;;;;;44064:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;:24;44046:42;;44119:18;44135:1;44119:4;:11;;;:15;;:18;;;;:::i;:::-;44105:11;::::0;;::::1;:32:::0;;;;44174:19;;:26:::1;::::0;:23:::1;:26::i;:::-;44152:48:::0;;44215:3:::1;::::0;:30:::1;::::0;-1:-1:-1;;;44215:30:0;;-1:-1:-1;;;;;44215:3:0;;::::1;::::0;:12:::1;::::0;:30:::1;::::0;44228:7;;44237;;44215:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44281:7;-1:-1:-1::0;;;;;44267:43:0::1;44275:4;44267:43;44290:7;44299:4;:10;;;44267:43;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;44026:3:0::1;;43996:326;;;-1:-1:-1::0;;5045:1:0;6007:22;;-1:-1:-1;;;;;;43142:1187:0:o;46048:235::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;46139:5:::1;46145:4;46139:11;;;;;;;;;::::0;;;::::1;::::0;;;:18:::1;:11;::::0;;::::1;;:18;::::0;::::1;;46131:67;;;;-1:-1:-1::0;;;46131:67:0::1;;;;;;;:::i;:::-;46230:5;46211;46217:4;46211:11;;;;;;;;;;;;;;;;;;:16;;:24;;;;46263:4;46251:24;46269:5;46251:24;;;;;;:::i;:::-;;;;;;;;46048:235:::0;;:::o;42120:654::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;42285:1:::1;42266:16;:20;42258:92;;;;-1:-1:-1::0;;;42258:92:0::1;;;;;;;:::i;:::-;42379:1;42369:7;:11;42361:77;;;;-1:-1:-1::0;;;42361:77:0::1;;;;;;;:::i;:::-;42462:206;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;42462:206:0::1;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;42451:5:::1;:218:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;;42451:218:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;42695:12;;:19:::1;::::0;:16:::1;:19::i;:::-;42687:79;42716:7;42725;42734:6;42742:5;42749:16;42687:79;;;;;;;;;;:::i;:::-;;;;;;;;42120:654:::0;;;;;:::o;35264:138::-;35337:7;35364:12;;;;;;;;;;:30;;35388:5;35364:23;:30::i;:::-;35357:37;;35264:138;;;;;:::o;34225:139::-;34294:4;34318:12;;;;;;;;;;:38;;34348:7;34318:29;:38::i;42899:135::-;42971:15;;:::i;:::-;-1:-1:-1;43006:11:0;;;;:5;:11;;;;;;;;-1:-1:-1;;;;;43006:20:0;;;;;;;;;;;;;42999:27;;;;;;;;;;;;42899:135::o;32970:49::-;33015:4;32970:49;:::o;45275:765::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;45412:21:::1;45436:5;45442:4;45436:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;45468;::::0;::::1;::::0;45436;;-1:-1:-1;45468:11:0::1;;45460:70;;;;-1:-1:-1::0;;;45460:70:0::1;;;;;;;:::i;:::-;45568:1;45549:16;:20;45541:94;;;;-1:-1:-1::0;;;45541:94:0::1;;;;;;;:::i;:::-;45664:1;45654:7;:11;45646:91;;;;-1:-1:-1::0;;;45646:91:0::1;;;;;;;:::i;:::-;45767:4;:11;;;45756:7;:22;;45748:90;;;;-1:-1:-1::0;;;45748:90:0::1;;;;;;;:::i;:::-;45851:21:::0;;;45883:10:::1;::::0;::::1;:19:::0;;;45913:20:::1;::::0;::::1;:39:::0;;;45970:62:::1;::::0;45992:4;;45970:62:::1;::::0;::::1;::::0;45865:7;;45896:6;;45936:16;;45970:62:::1;:::i;34538:127::-:0;34601:7;34628:12;;;;;;;;;;:29;;:27;:29::i;46706:226::-;46750:7;46770:14;46800:9;46795:106;46819:5;:12;46815:16;;46795:106;;;46862:27;46873:5;46879:1;46873:8;;;;;;;;;;;;;;;;;;;;;:15;46862:6;;:10;:27::i;:::-;46853:36;-1:-1:-1;46833:3:0;;46795:106;;40605:66;40645:26;40605:66;:::o;36439:230::-;36532:6;:12;;;;;;;;;;:22;;;36524:45;;36556:12;:10;:12::i;36524:45::-;36516:106;;;;-1:-1:-1;;;36516:106:0;;;;;;;:::i;47174:197::-;42017:36;40645:26;42040:12;:10;:12::i;42017:36::-;42009:83;;;;-1:-1:-1;;;42009:83:0;;;;;;;:::i;:::-;47246:21:::1;47278:38;47296:10;47246:21:::0;47278:17:::1;:38::i;:::-;47343:10;-1:-1:-1::0;;;;;47334:29:0::1;;47355:7;47334:29;;;;;;:::i;:::-;;;;;;;;42103:1;47174:197::o:0;40532:66::-;-1:-1:-1;;;;;;;;;;;40532:66:0;:::o;46496:202::-;41871:36;-1:-1:-1;;;;;;;;;;;41894:12:0;:10;:12::i;41871:36::-;41863:83;;;;-1:-1:-1;;;41863:83:0;;;;;;;:::i;:::-;46568:5:::1;46574:4;46568:11;;;;;;;;;::::0;;;::::1;::::0;;;:18:::1;:11;::::0;;::::1;;:18;::::0;::::1;;46560:61;;;;-1:-1:-1::0;;;46560:61:0::1;;;;;;;:::i;:::-;46655:5;46634;46640:4;46634:11;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;:18;;:26:::0;;-1:-1:-1;;46634:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;46676:14:::1;::::0;46685:4;;46676:14:::1;::::0;::::1;46496:202:::0;:::o;20166:152::-;20236:4;20260:50;20265:3;-1:-1:-1;;;;;20285:23:0;;20260:4;:50::i;667:106::-;755:10;667:106;:::o;8841:179::-;8899:7;8931:5;;;8955:6;;;;8947:46;;;;-1:-1:-1;;;8947:46:0;;;;;;;:::i;38419:188::-;38493:6;:12;;;;;;;;;;:33;;38518:7;38493:24;:33::i;:::-;38489:111;;;38575:12;:10;:12::i;:::-;-1:-1:-1;;;;;38548:40:0;38566:7;-1:-1:-1;;;;;38548:40:0;38560:4;38548:40;;;;;;;;;;38419:188;;:::o;38615:192::-;38690:6;:12;;;;;;;;;;:36;;38718:7;38690:27;:36::i;:::-;38686:114;;;38775:12;:10;:12::i;:::-;-1:-1:-1;;;;;38748:40:0;38766:7;-1:-1:-1;;;;;38748:40:0;38760:4;38748:40;;;;;;;;;;38615:192;;:::o;39367:796::-;39458:4;39498;39458;39515:525;39539:5;:12;39535:1;:16;39515:525;;;39573:20;39596:5;39602:1;39596:8;;;;;;;;;;;;;;39573:31;;39641:12;39625;:28;39621:408;;39795:12;39809;39778:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39768:55;;;;;;39753:70;;39621:408;;;39985:12;39999;39968:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39958:55;;;;;;39943:70;;39621:408;-1:-1:-1;39553:3:0;;39515:525;;;-1:-1:-1;40135:20:0;;;;39367:796;-1:-1:-1;;;39367:796:0:o;9720:220::-;9778:7;9802:6;9798:20;;-1:-1:-1;9817:1:0;9810:8;;9798:20;9841:5;;;9845:1;9841;:5;:1;9865:5;;;;;:10;9857:56;;;;-1:-1:-1;;;9857:56:0;;;;;;;:::i;9303:158::-;9361:7;9394:1;9389;:6;;9381:49;;;;-1:-1:-1;;;9381:49:0;;;;;;;:::i;:::-;-1:-1:-1;9448:5:0;;;9303:158::o;21452:::-;21526:7;21577:22;21581:3;21593:5;21577:3;:22::i;20738:167::-;20818:4;20842:55;20852:3;-1:-1:-1;;;;;20872:23:0;;20842:9;:55::i;20991:117::-;21054:7;21081:19;21089:3;21081:7;:19::i;25355:397::-;25470:6;25445:21;:31;;25437:73;;;;-1:-1:-1;;;25437:73:0;;;;;;;:::i;:::-;25602:12;25620:9;-1:-1:-1;;;;;25620:14:0;25643:6;25620:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25601:54;;;25674:7;25666:78;;;;-1:-1:-1;;;25666:78:0;;;;;;;:::i;:::-;25355:397;;;:::o;15230:414::-;15293:4;15315:21;15325:3;15330:5;15315:9;:21::i;:::-;15310:327;;-1:-1:-1;15353:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;15536:18;;15514:19;;;:12;;;:19;;;;;;:40;;;;15569:11;;15310:327;-1:-1:-1;15620:5:0;15613:12;;20494:158;20567:4;20591:53;20599:3;-1:-1:-1;;;;;20619:23:0;;20591:7;:53::i;18118:204::-;18213:18;;18185:7;;18213:26;-1:-1:-1;18205:73:0;;;;-1:-1:-1;;;18205:73:0;;;;;;;:::i;:::-;18296:3;:11;;18308:5;18296:18;;;;;;;;;;;;;;;;18289:25;;18118:204;;;;:::o;17450:129::-;17523:4;17547:19;;;:12;;;;;:19;;;;;;:24;;;17450:129::o;17665:109::-;17748:18;;17665:109::o;15820:1544::-;15886:4;16025:19;;;:12;;;:19;;;;;;16061:15;;16057:1300;;16496:18;;-1:-1:-1;;16447:14:0;;;;16496:22;;;;16423:21;;16496:3;;:22;;16783;;;;;;;;;;;;;;16763:42;;16929:9;16900:3;:11;;16912:13;16900:26;;;;;;;;;;;;;;;;;;;:38;;;;17006:23;;;17048:1;17006:12;;;:23;;;;;;17032:17;;;17006:43;;17158:17;;17006:3;;17158:17;;;;;;;;;;;;;;;;;;;;;;17253:3;:12;;:19;17266:5;17253:19;;;;;;;;;;;17246:26;;;17296:4;17289:11;;;;;;;;16057:1300;17340:5;17333:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;39571:54;;40570:35;;40560:2;;40619:1;;40609:12;160:352;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;-1:-1;328:20;;368:18;357:30;;354:2;;;-1:-1;;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;502:1;;492:12;445:2;250:262;;;;;:::o;1444:241::-;;1548:2;1536:9;1527:7;1523:23;1519:32;1516:2;;;-1:-1;;1554:12;1516:2;1616:53;1661:7;1637:22;1616:53;:::i;1692:241::-;;1796:2;1784:9;1775:7;1771:23;1767:32;1764:2;;;-1:-1;;1802:12;1764:2;-1:-1;1096:20;;1758:175;-1:-1;1758:175::o;1940:366::-;;;2061:2;2049:9;2040:7;2036:23;2032:32;2029:2;;;-1:-1;;2067:12;2029:2;1096:20;;;-1:-1;2219:2;2258:22;;72:20;-1:-1;;;;;39571:54;;40570:35;;40560:2;;-1:-1;;40609:12;40560:2;2227:63;;;;2023:283;;;;;:::o;2313:366::-;;;2434:2;2422:9;2413:7;2409:23;2405:32;2402:2;;;-1:-1;;2440:12;2402:2;-1:-1;;1096:20;;;2592:2;2631:22;;;1233:20;;-1:-1;2396:283::o;2934:263::-;;3049:2;3037:9;3028:7;3024:23;3020:32;3017:2;;;-1:-1;;3055:12;3017:2;-1:-1;1381:13;;3011:186;-1:-1;3011:186::o;3204:366::-;;;3325:2;3313:9;3304:7;3300:23;3296:32;3293:2;;;-1:-1;;3331:12;3293:2;1246:6;1233:20;3383:63;;3501:53;3546:7;3483:2;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3287:283;;;;;:::o;3577:522::-;;;;3733:2;3721:9;3712:7;3708:23;3704:32;3701:2;;;-1:-1;;3739:12;3701:2;1246:6;1233:20;3791:63;;3919:2;3908:9;3904:18;3891:32;3943:18;3935:6;3932:30;3929:2;;;-1:-1;;3965:12;3929:2;4003:80;4075:7;4066:6;4055:9;4051:22;4003:80;:::i;:::-;3695:404;;3985:98;;-1:-1;3985:98;;-1:-1;;;;3695:404::o;4106:737::-;;;;;;4275:3;4263:9;4254:7;4250:23;4246:33;4243:2;;;-1:-1;;4282:12;4243:2;1246:6;1233:20;4334:63;;4434:2;4474:9;4470:22;962:20;40716:5;39404:13;39397:21;40694:5;40691:32;40681:2;;-1:-1;;40727:12;40681:2;4237:606;;4442:60;;-1:-1;;;;4539:2;4578:22;;1233:20;;4647:2;4686:22;;1233:20;;4755:3;4795:22;;;1096:20;;-1:-1;4237:606::o;5223:647::-;;;;;5396:2;5384:9;5375:7;5371:23;5367:32;5364:2;;;-1:-1;;5402:12;5364:2;1246:6;1233:20;5454:63;;5554:2;5597:9;5593:22;1233:20;5562:63;;5690:2;5679:9;5675:18;5662:32;5714:18;5706:6;5703:30;5700:2;;;-1:-1;;5736:12;5700:2;5774:80;5846:7;5837:6;5826:9;5822:22;5774:80;:::i;:::-;5358:512;;;;-1:-1;5756:98;-1:-1;;;;5358:512::o;5877:617::-;;;;;6032:3;6020:9;6011:7;6007:23;6003:33;6000:2;;;-1:-1;;6039:12;6000:2;-1:-1;;1233:20;;;6191:2;6230:22;;1233:20;;-1:-1;6299:2;6338:22;;1233:20;;6407:2;6446:22;1233:20;;-1:-1;5994:500;-1:-1;5994:500::o;21198:253::-;40483:2;40479:14;;;;-1:-1;;40479:14;6710:58;;21423:2;21414:12;;21314:137::o;21458:392::-;7053:37;;;21711:2;21702:12;;7053:37;21813:12;;;21602:248::o;21857:379::-;22221:10;22045:191::o;22243:222::-;-1:-1;;;;;39571:54;;;;6572:37;;22370:2;22355:18;;22341:124::o;22472:333::-;-1:-1;;;;;39571:54;;;;6572:37;;22791:2;22776:18;;7053:37;22627:2;22612:18;;22598:207::o;22812:210::-;39404:13;;39397:21;6835:34;;22933:2;22918:18;;22904:118::o;23029:222::-;7053:37;;;23156:2;23141:18;;23127:124::o;23519:416::-;23719:2;23733:47;;;7920:2;23704:18;;;39172:19;7956:34;39212:14;;;7936:55;-1:-1;;;8011:12;;;8004:28;8051:12;;;23690:245::o;23942:416::-;24142:2;24156:47;;;8302:2;24127:18;;;39172:19;8338:34;39212:14;;;8318:55;-1:-1;;;8393:12;;;8386:26;8431:12;;;24113:245::o;24365:416::-;24565:2;24579:47;;;8682:2;24550:18;;;39172:19;8718:34;39212:14;;;8698:55;-1:-1;;;8773:12;;;8766:29;8814:12;;;24536:245::o;24788:416::-;24988:2;25002:47;;;9065:2;24973:18;;;39172:19;9101:34;39212:14;;;9081:55;-1:-1;;;9156:12;;;9149:39;9207:12;;;24959:245::o;25211:416::-;25411:2;25425:47;;;9458:2;25396:18;;;39172:19;9494:34;39212:14;;;9474:55;-1:-1;;;9549:12;;;9542:45;9606:12;;;25382:245::o;25634:416::-;25834:2;25848:47;;;9857:2;25819:18;;;39172:19;9893:29;39212:14;;;9873:50;9942:12;;;25805:245::o;26057:416::-;26257:2;26271:47;;;10193:2;26242:18;;;39172:19;10229:34;39212:14;;;10209:55;-1:-1;;;10284:12;;;10277:27;10323:12;;;26228:245::o;26480:416::-;26680:2;26694:47;;;10574:2;26665:18;;;39172:19;-1:-1;;;;;;;;;;;39212:14;;;10590:55;-1:-1;;;10665:12;;;10658:38;10715:12;;;26651:245::o;26903:416::-;27103:2;27117:47;;;10966:2;27088:18;;;39172:19;11002:32;39212:14;;;10982:53;11054:12;;;27074:245::o;27326:416::-;27526:2;27540:47;;;11305:2;27511:18;;;39172:19;11341:34;39212:14;;;11321:55;11410:28;11396:12;;;11389:50;11458:12;;;27497:245::o;27749:416::-;27949:2;27963:47;;;11709:2;27934:18;;;39172:19;11745:31;39212:14;;;11725:52;11796:12;;;27920:245::o;28172:416::-;28372:2;28386:47;;;12047:2;28357:18;;;39172:19;12083:34;39212:14;;;12063:55;-1:-1;;;12138:12;;;12131:26;12176:12;;;28343:245::o;28595:416::-;28795:2;28809:47;;;12427:2;28780:18;;;39172:19;12463:34;39212:14;;;12443:55;-1:-1;;;12518:12;;;12511:40;12570:12;;;28766:245::o;29018:416::-;29218:2;29232:47;;;12821:2;29203:18;;;39172:19;-1:-1;;;;;;;;;;;39212:14;;;12837:55;12926:34;12912:12;;;12905:56;-1:-1;;;12981:12;;;12974:27;13020:12;;;29189:245::o;29441:416::-;29641:2;29655:47;;;13271:2;29626:18;;;39172:19;13307:34;39212:14;;;13287:55;-1:-1;;;13362:12;;;13355:33;13407:12;;;29612:245::o;29864:416::-;30064:2;30078:47;;;13658:2;30049:18;;;39172:19;13694:34;39212:14;;;13674:55;-1:-1;;;13749:12;;;13742:34;13795:12;;;30035:245::o;30287:416::-;30487:2;30501:47;;;14046:2;30472:18;;;39172:19;14082:34;39212:14;;;14062:55;-1:-1;;;14137:12;;;14130:26;14175:12;;;30458:245::o;30710:416::-;30910:2;30924:47;;;14426:2;30895:18;;;39172:19;14462:34;39212:14;;;14442:55;-1:-1;;;14517:12;;;14510:25;14554:12;;;30881:245::o;31133:416::-;31333:2;31347:47;;;14805:2;31318:18;;;39172:19;14841:34;39212:14;;;14821:55;14910:29;14896:12;;;14889:51;14959:12;;;31304:245::o;31556:416::-;31756:2;31770:47;;;15210:2;31741:18;;;39172:19;15246:34;39212:14;;;15226:55;-1:-1;;;15301:12;;;15294:39;15352:12;;;31727:245::o;31979:416::-;32179:2;32193:47;;;15603:2;32164:18;;;39172:19;15639:33;39212:14;;;15619:54;15692:12;;;32150:245::o;32402:416::-;32602:2;32616:47;;;15943:2;32587:18;;;39172:19;15979:32;39212:14;;;15959:53;16031:12;;;32573:245::o;32825:416::-;33025:2;33039:47;;;16282:2;33010:18;;;39172:19;16318:34;39212:14;;;16298:55;-1:-1;;;16373:12;;;16366:31;16416:12;;;32996:245::o;33248:416::-;33448:2;33462:47;;;16972:2;33433:18;;;39172:19;-1:-1;;;;;;;;;;;39212:14;;;16988:55;17077:31;17063:12;;;17056:53;17128:12;;;33419:245::o;33671:416::-;33871:2;33885:47;;;17379:2;33856:18;;;39172:19;17415:34;39212:14;;;17395:55;-1:-1;;;17470:12;;;17463:29;17511:12;;;33842:245::o;34094:416::-;34294:2;34308:47;;;17762:2;34279:18;;;39172:19;-1:-1;;;;;;;;;;;39212:14;;;17778:55;17867:25;17853:12;;;17846:47;17912:12;;;34265:245::o;34517:416::-;34717:2;34731:47;;;18163:2;34702:18;;;39172:19;18199:34;39212:14;;;18179:55;-1:-1;;;18254:12;;;18247:29;18295:12;;;34688:245::o;34940:416::-;35140:2;35154:47;;;18546:2;35125:18;;;39172:19;18582:33;39212:14;;;18562:54;18635:12;;;35111:245::o;35363:416::-;35563:2;35577:47;;;18886:2;35548:18;;;39172:19;18922:34;39212:14;;;18902:55;-1:-1;;;18977:12;;;18970:39;19028:12;;;35534:245::o;35786:416::-;35986:2;36000:47;;;19279:2;35971:18;;;39172:19;19315:31;39212:14;;;19295:52;19366:12;;;35957:245::o;36209:327::-;;36388:3;36377:9;36373:19;36365:27;;19674:16;19668:23;7060:3;7053:37;19841:4;19834:5;19830:16;19824:23;19841:4;19905:3;19901:14;7053:37;19997:4;19990:5;19986:16;19980:23;39404:13;39397:21;19997:4;20055:3;20051:14;6835:34;20146:4;20139:5;20135:16;20129:23;20146:4;20210:3;20206:14;7053:37;20300:4;20293:5;20289:16;20283:23;20300:4;20364:3;20360:14;7053:37;20465:4;20458:5;20454:16;20448:23;20465:4;20529:3;20525:14;7053:37;36359:177;;;;:::o;36543:326::-;20848:23;;7053:37;;36722:2;36707:18;;36693:176::o;37105:656::-;7053:37;;;39404:13;;39397:21;37497:2;37482:18;;6835:34;37580:2;37565:18;;7053:37;;;;37663:2;37648:18;;7053:37;37746:3;37731:19;;7053:37;37338:3;37323:19;;37309:452::o;38464:444::-;7053:37;;;38811:2;38796:18;;7053:37;;;;38894:2;38879:18;;7053:37;38647:2;38632:18;;38618:290::o
Swarm Source
ipfs://82ba7ea50dfbd1134356048cf4178bc4deaaa0d15defe82cfc6d74c42dbf82f5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.