Source Code
Latest 25 from a total of 537 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Settle Auction | 15898092 | 1206 days ago | IN | 0 ETH | 0.00208364 | ||||
| Stop Auction | 15897977 | 1206 days ago | IN | 0 ETH | 0.00051635 | ||||
| Create Bid | 15897881 | 1206 days ago | IN | 5.84 ETH | 0.00128862 | ||||
| Create Bid | 15897628 | 1206 days ago | IN | 5.55 ETH | 0.00161286 | ||||
| Create Bid | 15897625 | 1206 days ago | IN | 5.261 ETH | 0.00154189 | ||||
| Create Bid | 15897459 | 1206 days ago | IN | 5.01 ETH | 0.0015104 | ||||
| Create Bid | 15897382 | 1206 days ago | IN | 4.44 ETH | 0.00179687 | ||||
| Create Bid | 15897078 | 1206 days ago | IN | 4 ETH | 0.00198305 | ||||
| Create Bid | 15896851 | 1206 days ago | IN | 3.35 ETH | 0.00178445 | ||||
| Create Bid | 15892112 | 1206 days ago | IN | 3.1415 ETH | 0.00107578 | ||||
| Create Bid | 15891459 | 1207 days ago | IN | 2.22 ETH | 0.00128262 | ||||
| Create Bid | 15891058 | 1207 days ago | IN | 0.5 ETH | 0.00240702 | ||||
| Settle Current A... | 15891041 | 1207 days ago | IN | 0 ETH | 0.00511053 | ||||
| Create Bid | 15890929 | 1207 days ago | IN | 5.3 ETH | 0.00144756 | ||||
| Create Bid | 15890859 | 1207 days ago | IN | 5 ETH | 0.00197161 | ||||
| Create Bid | 15890853 | 1207 days ago | IN | 4.7 ETH | 0.00187645 | ||||
| Create Bid | 15890798 | 1207 days ago | IN | 4.44 ETH | 0.00142937 | ||||
| Create Bid | 15890794 | 1207 days ago | IN | 4 ETH | 0.00153898 | ||||
| Create Bid | 15890792 | 1207 days ago | IN | 3.5 ETH | 0.00147555 | ||||
| Create Bid | 15890238 | 1207 days ago | IN | 3.33 ETH | 0.0011743 | ||||
| Create Bid | 15889864 | 1207 days ago | IN | 3 ETH | 0.00098829 | ||||
| Create Bid | 15884136 | 1208 days ago | IN | 0.5 ETH | 0.00246207 | ||||
| Settle Current A... | 15884061 | 1208 days ago | IN | 0 ETH | 0.00571129 | ||||
| Create Bid | 15883838 | 1208 days ago | IN | 5.15 ETH | 0.00118162 | ||||
| Create Bid | 15883801 | 1208 days ago | IN | 4.9 ETH | 0.00106843 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 15898092 | 1206 days ago | 5.84 ETH | ||||
| Transfer | 15897881 | 1206 days ago | 5.55 ETH | ||||
| Transfer | 15897628 | 1206 days ago | 5.261 ETH | ||||
| Transfer | 15897625 | 1206 days ago | 5.01 ETH | ||||
| Transfer | 15897459 | 1206 days ago | 4.44 ETH | ||||
| Transfer | 15897382 | 1206 days ago | 4 ETH | ||||
| Transfer | 15897078 | 1206 days ago | 3.35 ETH | ||||
| Transfer | 15896851 | 1206 days ago | 3.1415 ETH | ||||
| Transfer | 15892112 | 1206 days ago | 2.22 ETH | ||||
| Transfer | 15891459 | 1207 days ago | 0.5 ETH | ||||
| Transfer | 15891041 | 1207 days ago | 5.3 ETH | ||||
| Transfer | 15890929 | 1207 days ago | 5 ETH | ||||
| Transfer | 15890859 | 1207 days ago | 4.7 ETH | ||||
| Transfer | 15890853 | 1207 days ago | 4.44 ETH | ||||
| Transfer | 15890798 | 1207 days ago | 4 ETH | ||||
| Transfer | 15890794 | 1207 days ago | 3.5 ETH | ||||
| Transfer | 15890792 | 1207 days ago | 3.33 ETH | ||||
| Transfer | 15890238 | 1207 days ago | 3 ETH | ||||
| Transfer | 15889864 | 1207 days ago | 0.5 ETH | ||||
| Transfer | 15884061 | 1208 days ago | 5.15 ETH | ||||
| Transfer | 15883838 | 1208 days ago | 4.9 ETH | ||||
| Transfer | 15883801 | 1208 days ago | 4.44 ETH | ||||
| Transfer | 15883715 | 1208 days ago | 3.95 ETH | ||||
| Transfer | 15883385 | 1208 days ago | 3.4 ETH | ||||
| Transfer | 15883249 | 1208 days ago | 3 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PlayerZeroAuctionHouse
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-09-15
*/
// SPDX-License-Identifier: GPL-3.0
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
* initialization step. This is essential to configure modules that are added through upgrades and that require
* initialization.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuardUpgradeable is Initializable {
// 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;
function __ReentrancyGuard_init() internal onlyInitializing {
__ReentrancyGuard_init_unchained();
}
function __ReentrancyGuard_init_unchained() internal onlyInitializing {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
/// @title Interface for Player Zero Token
pragma solidity ^0.8.6;
abstract contract PLAYERZEROTOKEN is IERC721 {
function mintToken() external virtual;
function totalSupply() external view virtual returns (uint256);
}
/// @title Interface for Player Zero Auction
pragma solidity ^0.8.6;
interface PlayerZeroAuction {
event AuctionCreated(uint256 indexed currentToken, uint256 startTime, uint256 endTime);
event AuctionBid(uint256 indexed currentToken, address sender, uint256 value, bool extended);
event AuctionExtended(uint256 indexed currentToken, uint256 endTime);
event AuctionSettled(uint256 indexed currentToken, address winner, uint256 amount);
event AuctionTimeBufferUpdated(uint256 timeBuffer);
event AuctionReservePriceUpdated(uint256 reservePrice);
event AuctionMinBidIncrementPercentageUpdated(uint256 minBidIncrementPercentage);
function settleAuction() external;
function settleCurrentAndCreateNewAuction() external;
function createBid(uint256 token) external payable;
function setTimeBuffer(uint256 timeBuffer) external;
function setReservePrice(uint256 reservePrice) external;
function setMinBidIncrementPercentage(uint8 minBidIncrementPercentage) external;
}
/// @title IWETH
pragma solidity ^0.8.6;
interface IWETH {
function deposit() external payable;
function withdraw(uint256 wad) external;
function transfer(address to, uint256 value) external returns (bool);
}
// LICENSE
// PlayerZeroAuction.sol is a modified version of Zora's AuctionHouse.sol:
// https://github.com/ourzora/auction-house/blob/54a12ec1a6cf562e49f0a4917990474b11350a2d/contracts/AuctionHouse.sol
//
// PlayerZeroAuction.sol source code Copyright Zora licensed under the GPL-3.0 license.
// With modifications by PlayerZero.
/// @title The PlayerZero Auction House
contract PlayerZeroAuctionHouse is PlayerZeroAuction, ReentrancyGuardUpgradeable, OwnableUpgradeable, ERC721Holder {
// The PlayerZero ERC721 token contract
PLAYERZEROTOKEN public playerzero;
// The status of the auction
bool public auctionStatus;
// The address of the WETH contract
address public weth;
// The address of the admin wallet
address public adminWallet;
// The minimum amount of time left in an auction after a new bid is created
uint256 public timeBuffer;
// The minimum price accepted in an auction
uint256 public reservePrice;
// The minimum percentage difference between the last bid amount and the current bid
uint8 public minBidIncrementPercentage;
// The duration of a single auction
uint256 public duration;
// ID for the Player Zero (ERC721 token ID)
uint256 public currentToken;
// The current highest bid amount
uint256 public amount;
// The time that the auction started
uint256 public startTime;
// The time that the auction is scheduled to end
uint256 public endTime;
// The address of the current highest bid
address payable public bidder;
// Whether or not the auction has been settled
bool public settled;
// The address of the winning bid based on any token
mapping(uint256 => address) public getWinningBidders;
// The amount of the winning bid based on any token
mapping(uint256 => uint256) public getWinningAmount;
/**
* @notice Initialize the auction house and base contracts,
* @dev This function can only be called once.
*/
function initialize(
PLAYERZEROTOKEN _playerzero,
address _weth,
address _adminWallet,
uint256 _timeBuffer,
uint256 _reservePrice,
uint8 _minBidIncrementPercentage,
uint256 _duration
) external initializer {
__ReentrancyGuard_init();
__Ownable_init();
auctionStatus = false;
playerzero = _playerzero;
weth = _weth;
adminWallet = _adminWallet;
timeBuffer = _timeBuffer;
reservePrice = _reservePrice;
minBidIncrementPercentage = _minBidIncrementPercentage;
duration = _duration;
}
///////////////////////////
// BIDDING FUNCTIONALITY //
///////////////////////////
/**
* @notice Create a bid for a Token, with a given amount.
* @dev This contract only accepts payment in ETH.
*/
function createBid(uint256 token) external payable override nonReentrant {
require(currentToken == token, "Token not up for auction");
require(block.timestamp < endTime, "Auction expired");
require(msg.value >= reservePrice, "Must send at least reservePrice");
require(
msg.value >= amount + ((amount * minBidIncrementPercentage) / 100),
"Must send more than last bid by minBidIncrementPercentage amount"
);
address payable lastBidder = bidder;
// Refund the last bidder, if applicable
if (lastBidder != address(0)) {
_safeTransferETHWithFallback(lastBidder, amount);
}
amount = msg.value;
bidder = payable(msg.sender);
// Extend the auction if the bid was received within `timeBuffer` of the auction end time
bool extended = endTime - block.timestamp < timeBuffer;
if (extended) {
endTime = block.timestamp + timeBuffer;
}
emit AuctionBid(currentToken, msg.sender, msg.value, extended);
if (extended) {
emit AuctionExtended(currentToken, endTime);
}
}
////////////////////////////
// EXTERNAL FUNCTIONALITY //
////////////////////////////
/**
* @notice Settle the current auction.
* @dev This function can only be called when the contract is off and by owner.
*/
function settleAuction() external override nonReentrant onlyOwner {
require(!auctionStatus, "Auction is on");
_settleAuction();
}
/**
* @notice create an current auction.
* @dev This function can only be called when the contract is off and by owner
*/
function createAuction() external nonReentrant onlyOwner {
require(!auctionStatus, "Auction is on");
_createAuction();
auctionStatus = true;
}
/**
* @notice Settle the current auction, mint a new Token, and put it up for auction.
* @dev This function can only be called when the contract is on.
*/
function settleCurrentAndCreateNewAuction() external override nonReentrant {
require(auctionStatus, "Auction is not on");
_settleAuction();
_createAuction();
}
/**
* @notice Calls total supply on token contract
*/
function getNextTokenID() external view returns (uint256) {
return playerzero.totalSupply();
}
/**
* @notice Calls total supply on token contract and subtracts 1 for current auction
*/
function getCurrentTokenID() external view returns (uint256) {
return playerzero.totalSupply() - 1;
}
/**
* @notice Calls Remaing time of the current auction
*/
function getRemainingTime() external view returns (uint256) {
return endTime - block.timestamp;
}
/**
* @notice Calls block timestamp
*/
function getBockTimestamp() external view returns (uint256) {
return block.timestamp;
}
////////////////////////////
// INTERNAL FUNCTIONALITY //
////////////////////////////
/**
* @notice Create an auction.
* @dev Store the auction details in the `auction` state variable and emit an AuctionCreated event.
*/
function _createAuction() internal {
currentToken = playerzero.totalSupply();
playerzero.mintToken();
startTime = block.timestamp;
endTime = startTime + duration;
amount = 0;
bidder = payable(0);
settled = false;
emit AuctionCreated(currentToken, startTime, endTime);
}
/**
* @notice Settle an auction, finalizing the bid and paying out to the owner.
*/
function _settleAuction() internal {
require(startTime != 0, "Auction hasn't begun");
require(!settled, "Auction has already been settled");
require(block.timestamp >= endTime, "Auction hasn't completed");
settled = true;
if (bidder == address(0)) {
playerzero.transferFrom(address(this), adminWallet, currentToken);
} else {
playerzero.transferFrom(address(this), bidder, currentToken);
getWinningBidders[currentToken] = bidder;
}
if (amount > 0) {
_safeTransferETHWithFallback(adminWallet, amount);
getWinningAmount[currentToken] = amount;
}
emit AuctionSettled(currentToken, bidder, amount);
}
/**
* @notice Transfer ETH. If the ETH transfer fails, wrap the ETH and try send it as WETH.
*/
function _safeTransferETHWithFallback(address to, uint256 value) internal {
if (!_safeTransferETH(to, value)) {
IWETH(weth).deposit{ value: value }();
IERC20(weth).transfer(to, value);
}
}
/**
* @notice Transfer ETH and return the success status.
* @dev This function only forwards 30,000 gas to the callee.
*/
function _safeTransferETH(address to, uint256 value) internal returns (bool) {
(bool success, ) = to.call{ value: value, gas: 30_000 }(new bytes(0));
return success;
}
/////////////////////////
// ADMIN FUNCTIONALITY //
/////////////////////////
/**
* @notice turns off the Player Zero auction house.
* @dev This function can only be called by the owner when the
* contract is on. While no new auctions can be started when the contract is on,
* anyone can settle an ongoing auction.
*/
function stopAuction() external onlyOwner {
require(auctionStatus, "Auction is not on");
auctionStatus = false;
}
/**
* @notice turns on the Player Zero auction house.
* @dev This function can only be called by the owner when the
* contract is not on. If required, this function will start a new auction.
*/
function startAuction() external onlyOwner {
require(!auctionStatus, "Auction is on");
_createAuction();
auctionStatus = true;
}
/**
* @notice Set the auction time buffer.
* @dev Only callable by the owner.
*/
function setTimeBuffer(uint256 _timeBuffer) external override onlyOwner {
timeBuffer = _timeBuffer;
emit AuctionTimeBufferUpdated(_timeBuffer);
}
/**
* @notice Set the auction reserve price.
* @dev Only callable by the owner.
*/
function setReservePrice(uint256 _reservePrice) external override onlyOwner {
reservePrice = _reservePrice;
emit AuctionReservePriceUpdated(_reservePrice);
}
/**
* @notice Set the admin wallet.
* @dev Only callable by the owner.
*/
function setAdminWallet(address _wallet) external onlyOwner {
adminWallet = _wallet;
}
/**
* @notice Set the auction minimum bid increment percentage.
* @dev Only callable by the owner.
*/
function setMinBidIncrementPercentage(uint8 _minBidIncrementPercentage) external override onlyOwner {
minBidIncrementPercentage = _minBidIncrementPercentage;
emit AuctionMinBidIncrementPercentageUpdated(_minBidIncrementPercentage);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"currentToken","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"currentToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"currentToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AuctionExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"name":"AuctionMinBidIncrementPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"AuctionReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"currentToken","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timeBuffer","type":"uint256"}],"name":"AuctionTimeBufferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"adminWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"createBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getWinningAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getWinningBidders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract PLAYERZEROTOKEN","name":"_playerzero","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_adminWallet","type":"address"},{"internalType":"uint256","name":"_timeBuffer","type":"uint256"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint8","name":"_minBidIncrementPercentage","type":"uint8"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBidIncrementPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"playerzero","outputs":[{"internalType":"contract PLAYERZEROTOKEN","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_minBidIncrementPercentage","type":"uint8"}],"name":"setMinBidIncrementPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reservePrice","type":"uint256"}],"name":"setReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeBuffer","type":"uint256"}],"name":"setTimeBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleCurrentAndCreateNewAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50613082806100206000396000f3fe6080604052600436106102045760003560e01c80638c6861c411610118578063c4a6d0d2116100a0578063efb98bcf1161006f578063efb98bcf146106e0578063f25efffc1461070b578063f2fde38b14610722578063f496d8821461074b578063f58114471461077657610204565b8063c4a6d0d214610636578063ce9c7c0d14610661578063db2e1eed1461068a578063ec91f2a4146106b557610204565b80639d6a0f28116100e75780639d6a0f2814610573578063a4d0a17e1461059e578063aa8c217c146105b5578063b296024d146105e0578063b508b7581461060b57610204565b80638c6861c4146104b55780638da5cb5b146104e05780638e905c931461050b5780638f7758391461054857610204565b80633fc8cef31161019b5780636b64c7691161016a5780636b64c769146104085780637120334b1461041f578063715018a61461044857806378e979251461045f578063836c081d1461048a57610204565b80633fc8cef31461036d5780634a1981191461039857806360fca259146103c3578063659dd2b4146103ec57610204565b80633197cbb6116101d75780633197cbb6146102c557806335082933146102f057806336b19cd71461031957806336ebdb381461034457610204565b80630fb5a6b414610209578063150b7a021461023457806323dd957e14610271578063269b9a08146102ae575b600080fd5b34801561021557600080fd5b5061021e61078d565b60405161022b91906128c1565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906120c7565b610793565b60405161026891906126b0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612219565b6107a7565b6040516102a59190612568565b60405180910390f35b3480156102ba57600080fd5b506102c36107da565b005b3480156102d157600080fd5b506102da61084e565b6040516102e791906128c1565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061209a565b610854565b005b34801561032557600080fd5b5061032e6108a0565b60405161033b9190612568565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612273565b6108c6565b005b34801561037957600080fd5b50610382610923565b60405161038f9190612568565b60405180910390f35b3480156103a457600080fd5b506103ad610949565b6040516103ba91906128c1565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190612177565b6109f0565b005b61040660048036038101906104019190612219565b610c4b565b005b34801561041457600080fd5b5061041d610f4f565b005b34801561042b57600080fd5b5061044660048036038101906104419190612219565b610fcc565b005b34801561045457600080fd5b5061045d611015565b005b34801561046b57600080fd5b50610474611029565b60405161048191906128c1565b60405180910390f35b34801561049657600080fd5b5061049f61102f565b6040516104ac91906128c1565b60405180910390f35b3480156104c157600080fd5b506104ca611035565b6040516104d791906126cb565b60405180910390f35b3480156104ec57600080fd5b506104f561105b565b6040516105029190612568565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190612219565b611085565b60405161053f91906128c1565b60405180910390f35b34801561055457600080fd5b5061055d61109d565b60405161056a9190612695565b60405180910390f35b34801561057f57600080fd5b506105886110b0565b6040516105959190612695565b60405180910390f35b3480156105aa57600080fd5b506105b36110c3565b005b3480156105c157600080fd5b506105ca61117a565b6040516105d791906128c1565b60405180910390f35b3480156105ec57600080fd5b506105f5611180565b6040516106029190612920565b60405180910390f35b34801561061757600080fd5b50610620611193565b60405161062d91906128c1565b60405180910390f35b34801561064257600080fd5b5061064b61119b565b60405161065891906128c1565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190612219565b61124e565b005b34801561069657600080fd5b5061069f611297565b6040516106ac91906128c1565b60405180910390f35b3480156106c157600080fd5b506106ca61129d565b6040516106d791906128c1565b60405180910390f35b3480156106ec57600080fd5b506106f56112a3565b60405161070291906128c1565b60405180910390f35b34801561071757600080fd5b506107206112b8565b005b34801561072e57600080fd5b506107496004803603810190610744919061209a565b61136e565b005b34801561075757600080fd5b506107606113f2565b60405161076d9190612583565b60405180910390f35b34801561078257600080fd5b5061078b611418565b005b609d5481565b600063150b7a0260e01b9050949350505050565b60a36020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107e26114ea565b609760149054906101000a900460ff16610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890612741565b60405180910390fd5b6000609760146101000a81548160ff021916908315150217905550565b60a15481565b61085c6114ea565b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108ce6114ea565b80609c60006101000a81548160ff021916908360ff1602179055507fec5ccd96cc77b6219e9d44143df916af68fc169339ea7de5008ff15eae13450d816040516109189190612905565b60405180910390a150565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109b357600080fd5b505afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190612246565b905090565b60008060019054906101000a900460ff16159050808015610a215750600160008054906101000a900460ff1660ff16105b80610a4e5750610a3030611568565b158015610a4d5750600160008054906101000a900460ff1660ff16145b5b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a84906127c1565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610aca576001600060016101000a81548160ff0219169083151502179055505b610ad261158b565b610ada6115e4565b6000609760146101000a81548160ff02191690831515021790555087609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084609a8190555083609b8190555082609c60006101000a81548160ff021916908360ff16021790555081609d819055508015610c415760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610c3891906126e6565b60405180910390a15b5050505050505050565b60026001541415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612881565b60405180910390fd5b600260018190555080609e5414610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490612701565b60405180910390fd5b60a1544210610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d18906128a1565b60405180910390fd5b609b54341015610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90612781565b60405180910390fd5b6064609c60009054906101000a900460ff1660ff16609f54610d889190612a3f565b610d929190612a0e565b609f54610d9f91906129b8565b341015610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd8906127e1565b60405180910390fd5b600060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4957610e4881609f5461163d565b5b34609f819055503360a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000609a544260a154610ea49190612a99565b1090508015610ec257609a5442610ebb91906129b8565b60a1819055505b609e547f1159164c56f277e6fc99c11731bd380e0347deb969b75523398734c252706ea3333484604051610ef89392919061265e565b60405180910390a28015610f4357609e547f6e912a3a9105bdd2af817ba5adc14e6c127c1035b5b648faa29ca0d58ab8ff4e60a154604051610f3a91906128c1565b60405180910390a25b50506001808190555050565b610f576114ea565b609760149054906101000a900460ff1615610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e906127a1565b60405180910390fd5b610faf611783565b6001609760146101000a81548160ff021916908315150217905550565b610fd46114ea565b80609a819055507f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d8160405161100a91906128c1565b60405180910390a150565b61101d6114ea565b611027600061196f565b565b60a05481565b609e5481565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a46020528060005260406000206000915090505481565b60a260149054906101000a900460ff1681565b609760149054906101000a900460ff1681565b60026001541415611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090612881565b60405180910390fd5b60026001819055506111196114ea565b609760149054906101000a900460ff1615611169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611160906127a1565b60405180910390fd5b611171611a35565b60018081905550565b609f5481565b609c60009054906101000a900460ff1681565b600042905090565b60006001609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120757600080fd5b505afa15801561121b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123f9190612246565b6112499190612a99565b905090565b6112566114ea565b80609b819055507f6ab2e127d7fdf53b8f304e59d3aab5bfe97979f52a85479691a6fab27a28a6b28160405161128c91906128c1565b60405180910390a150565b609b5481565b609a5481565b60004260a1546112b39190612a99565b905090565b600260015414156112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612881565b60405180910390fd5b6002600181905550609760149054906101000a900460ff16611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90612741565b60405180910390fd5b61135d611a35565b611365611783565b60018081905550565b6113766114ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612721565b60405180910390fd5b6113ef8161196f565b50565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600154141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590612881565b60405180910390fd5b600260018190555061146e6114ea565b609760149054906101000a900460ff16156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906127a1565b60405180910390fd5b6114c6611783565b6001609760146101000a81548160ff02191690831515021790555060018081905550565b6114f2611e20565b73ffffffffffffffffffffffffffffffffffffffff1661151061105b565b73ffffffffffffffffffffffffffffffffffffffff1614611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90612801565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190612841565b60405180910390fd5b6115e2611e28565b565b600060019054906101000a900460ff16611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90612841565b60405180910390fd5b61163b611e80565b565b6116478282611ee1565b61177f57609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116b557600080fd5b505af11580156116c9573d6000803e3d6000fd5b5050505050609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161172b929190612635565b602060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177d919061214a565b505b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117eb57600080fd5b505afa1580156117ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118239190612246565b609e81905550609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632004ffd96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561189357600080fd5b505af11580156118a7573d6000803e3d6000fd5b505050504260a081905550609d5460a0546118c291906129b8565b60a1819055506000609f81905550600060a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060a260146101000a81548160ff021916908315150217905550609e547fd6eddd1118d71820909c1197aa966dbc15ed6f508554252169cc3d5ccac756ca60a05460a1546040516119659291906128dc565b60405180910390a2565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060a0541415611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290612761565b60405180910390fd5b60a260149054906101000a900460ff1615611acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac290612821565b60405180910390fd5b60a154421015611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612861565b60405180910390fd5b600160a260146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff1660a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c3c57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609e546040518463ffffffff1660e01b8152600401611c05939291906125fe565b600060405180830381600087803b158015611c1f57600080fd5b505af1158015611c33573d6000803e3d6000fd5b50505050611d68565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609e546040518463ffffffff1660e01b8152600401611cbf939291906125c7565b600060405180830381600087803b158015611cd957600080fd5b505af1158015611ced573d6000803e3d6000fd5b5050505060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660a36000609e54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000609f541115611dbe57611da1609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f5461163d565b609f5460a46000609e548152602001908152602001600020819055505b609e547fc9f72b276a388619c6d185d146697036241880c36654b1a3ffdad07c24038d9960a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f54604051611e1692919061259e565b60405180910390a2565b600033905090565b600060019054906101000a900460ff16611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e90612841565b60405180910390fd5b60018081905550565b600060019054906101000a900460ff16611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec690612841565b60405180910390fd5b611edf611eda611e20565b61196f565b565b6000808373ffffffffffffffffffffffffffffffffffffffff168361753090600067ffffffffffffffff811115611f1b57611f1a612caf565b5b6040519080825280601f01601f191660200182016040528015611f4d5781602001600182028036833780820191505090505b50604051611f5b9190612551565b600060405180830381858888f193505050503d8060008114611f99576040519150601f19603f3d011682016040523d82523d6000602084013e611f9e565b606091505b505090508091505092915050565b6000611fbf611fba84612960565b61293b565b905082815260208101848484011115611fdb57611fda612ce3565b5b611fe6848285612bde565b509392505050565b600081359050611ffd81612fd9565b92915050565b60008151905061201281612ff0565b92915050565b600082601f83011261202d5761202c612cde565b5b813561203d848260208601611fac565b91505092915050565b60008135905061205581613007565b92915050565b60008135905061206a8161301e565b92915050565b60008151905061207f8161301e565b92915050565b60008135905061209481613035565b92915050565b6000602082840312156120b0576120af612ced565b5b60006120be84828501611fee565b91505092915050565b600080600080608085870312156120e1576120e0612ced565b5b60006120ef87828801611fee565b945050602061210087828801611fee565b93505060406121118782880161205b565b925050606085013567ffffffffffffffff81111561213257612131612ce8565b5b61213e87828801612018565b91505092959194509250565b6000602082840312156121605761215f612ced565b5b600061216e84828501612003565b91505092915050565b600080600080600080600060e0888a03121561219657612195612ced565b5b60006121a48a828b01612046565b97505060206121b58a828b01611fee565b96505060406121c68a828b01611fee565b95505060606121d78a828b0161205b565b94505060806121e88a828b0161205b565b93505060a06121f98a828b01612085565b92505060c061220a8a828b0161205b565b91505092959891949750929550565b60006020828403121561222f5761222e612ced565b5b600061223d8482850161205b565b91505092915050565b60006020828403121561225c5761225b612ced565b5b600061226a84828501612070565b91505092915050565b60006020828403121561228957612288612ced565b5b600061229784828501612085565b91505092915050565b6122a981612b72565b82525050565b6122b881612adf565b82525050565b6122c781612acd565b82525050565b6122d681612af1565b82525050565b6122e581612afd565b82525050565b60006122f682612991565b612300818561299c565b9350612310818560208601612bed565b80840191505092915050565b61232581612b84565b82525050565b61233481612b96565b82525050565b60006123476018836129a7565b915061235282612d03565b602082019050919050565b600061236a6026836129a7565b915061237582612d2c565b604082019050919050565b600061238d6011836129a7565b915061239882612d7b565b602082019050919050565b60006123b06014836129a7565b91506123bb82612da4565b602082019050919050565b60006123d3601f836129a7565b91506123de82612dcd565b602082019050919050565b60006123f6600d836129a7565b915061240182612df6565b602082019050919050565b6000612419602e836129a7565b915061242482612e1f565b604082019050919050565b600061243c6040836129a7565b915061244782612e6e565b604082019050919050565b600061245f6020836129a7565b915061246a82612ebd565b602082019050919050565b60006124826020836129a7565b915061248d82612ee6565b602082019050919050565b60006124a5602b836129a7565b91506124b082612f0f565b604082019050919050565b60006124c86018836129a7565b91506124d382612f5e565b602082019050919050565b60006124eb601f836129a7565b91506124f682612f87565b602082019050919050565b600061250e600f836129a7565b915061251982612fb0565b602082019050919050565b61252d81612b5b565b82525050565b61253c81612bcc565b82525050565b61254b81612b65565b82525050565b600061255d82846122eb565b915081905092915050565b600060208201905061257d60008301846122be565b92915050565b600060208201905061259860008301846122af565b92915050565b60006040820190506125b360008301856122a0565b6125c06020830184612524565b9392505050565b60006060820190506125dc60008301866122be565b6125e960208301856122a0565b6125f66040830184612524565b949350505050565b600060608201905061261360008301866122be565b61262060208301856122be565b61262d6040830184612524565b949350505050565b600060408201905061264a60008301856122be565b6126576020830184612524565b9392505050565b600060608201905061267360008301866122be565b6126806020830185612524565b61268d60408301846122cd565b949350505050565b60006020820190506126aa60008301846122cd565b92915050565b60006020820190506126c560008301846122dc565b92915050565b60006020820190506126e0600083018461231c565b92915050565b60006020820190506126fb600083018461232b565b92915050565b6000602082019050818103600083015261271a8161233a565b9050919050565b6000602082019050818103600083015261273a8161235d565b9050919050565b6000602082019050818103600083015261275a81612380565b9050919050565b6000602082019050818103600083015261277a816123a3565b9050919050565b6000602082019050818103600083015261279a816123c6565b9050919050565b600060208201905081810360008301526127ba816123e9565b9050919050565b600060208201905081810360008301526127da8161240c565b9050919050565b600060208201905081810360008301526127fa8161242f565b9050919050565b6000602082019050818103600083015261281a81612452565b9050919050565b6000602082019050818103600083015261283a81612475565b9050919050565b6000602082019050818103600083015261285a81612498565b9050919050565b6000602082019050818103600083015261287a816124bb565b9050919050565b6000602082019050818103600083015261289a816124de565b9050919050565b600060208201905081810360008301526128ba81612501565b9050919050565b60006020820190506128d66000830184612524565b92915050565b60006040820190506128f16000830185612524565b6128fe6020830184612524565b9392505050565b600060208201905061291a6000830184612533565b92915050565b60006020820190506129356000830184612542565b92915050565b6000612945612956565b90506129518282612c20565b919050565b6000604051905090565b600067ffffffffffffffff82111561297b5761297a612caf565b5b61298482612cf2565b9050602081019050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006129c382612b5b565b91506129ce83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a0357612a02612c51565b5b828201905092915050565b6000612a1982612b5b565b9150612a2483612b5b565b925082612a3457612a33612c80565b5b828204905092915050565b6000612a4a82612b5b565b9150612a5583612b5b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8e57612a8d612c51565b5b828202905092915050565b6000612aa482612b5b565b9150612aaf83612b5b565b925082821015612ac257612ac1612c51565b5b828203905092915050565b6000612ad882612b3b565b9050919050565b6000612aea82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612b3482612acd565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612b7d82612ba8565b9050919050565b6000612b8f82612ba8565b9050919050565b6000612ba182612b65565b9050919050565b6000612bb382612bba565b9050919050565b6000612bc582612b3b565b9050919050565b6000612bd782612b65565b9050919050565b82818337600083830152505050565b60005b83811015612c0b578082015181840152602081019050612bf0565b83811115612c1a576000848401525b50505050565b612c2982612cf2565b810181811067ffffffffffffffff82111715612c4857612c47612caf565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e206e6f7420757020666f722061756374696f6e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206f6e000000000000000000000000000000600082015250565b7f41756374696f6e206861736e277420626567756e000000000000000000000000600082015250565b7f4d7573742073656e64206174206c656173742072657365727665507269636500600082015250565b7f41756374696f6e206973206f6e00000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060008201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e74602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41756374696f6e2068617320616c7265616479206265656e20736574746c6564600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420636f6d706c657465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f41756374696f6e20657870697265640000000000000000000000000000000000600082015250565b612fe281612acd565b8114612fed57600080fd5b50565b612ff981612af1565b811461300457600080fd5b50565b61301081612b29565b811461301b57600080fd5b50565b61302781612b5b565b811461303257600080fd5b50565b61303e81612b65565b811461304957600080fd5b5056fea2646970667358221220e610af27a81e5c365a17276f057ef8d3b81a667519ee60b79f0ca3c7a658ce8564736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102045760003560e01c80638c6861c411610118578063c4a6d0d2116100a0578063efb98bcf1161006f578063efb98bcf146106e0578063f25efffc1461070b578063f2fde38b14610722578063f496d8821461074b578063f58114471461077657610204565b8063c4a6d0d214610636578063ce9c7c0d14610661578063db2e1eed1461068a578063ec91f2a4146106b557610204565b80639d6a0f28116100e75780639d6a0f2814610573578063a4d0a17e1461059e578063aa8c217c146105b5578063b296024d146105e0578063b508b7581461060b57610204565b80638c6861c4146104b55780638da5cb5b146104e05780638e905c931461050b5780638f7758391461054857610204565b80633fc8cef31161019b5780636b64c7691161016a5780636b64c769146104085780637120334b1461041f578063715018a61461044857806378e979251461045f578063836c081d1461048a57610204565b80633fc8cef31461036d5780634a1981191461039857806360fca259146103c3578063659dd2b4146103ec57610204565b80633197cbb6116101d75780633197cbb6146102c557806335082933146102f057806336b19cd71461031957806336ebdb381461034457610204565b80630fb5a6b414610209578063150b7a021461023457806323dd957e14610271578063269b9a08146102ae575b600080fd5b34801561021557600080fd5b5061021e61078d565b60405161022b91906128c1565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906120c7565b610793565b60405161026891906126b0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612219565b6107a7565b6040516102a59190612568565b60405180910390f35b3480156102ba57600080fd5b506102c36107da565b005b3480156102d157600080fd5b506102da61084e565b6040516102e791906128c1565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061209a565b610854565b005b34801561032557600080fd5b5061032e6108a0565b60405161033b9190612568565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612273565b6108c6565b005b34801561037957600080fd5b50610382610923565b60405161038f9190612568565b60405180910390f35b3480156103a457600080fd5b506103ad610949565b6040516103ba91906128c1565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190612177565b6109f0565b005b61040660048036038101906104019190612219565b610c4b565b005b34801561041457600080fd5b5061041d610f4f565b005b34801561042b57600080fd5b5061044660048036038101906104419190612219565b610fcc565b005b34801561045457600080fd5b5061045d611015565b005b34801561046b57600080fd5b50610474611029565b60405161048191906128c1565b60405180910390f35b34801561049657600080fd5b5061049f61102f565b6040516104ac91906128c1565b60405180910390f35b3480156104c157600080fd5b506104ca611035565b6040516104d791906126cb565b60405180910390f35b3480156104ec57600080fd5b506104f561105b565b6040516105029190612568565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190612219565b611085565b60405161053f91906128c1565b60405180910390f35b34801561055457600080fd5b5061055d61109d565b60405161056a9190612695565b60405180910390f35b34801561057f57600080fd5b506105886110b0565b6040516105959190612695565b60405180910390f35b3480156105aa57600080fd5b506105b36110c3565b005b3480156105c157600080fd5b506105ca61117a565b6040516105d791906128c1565b60405180910390f35b3480156105ec57600080fd5b506105f5611180565b6040516106029190612920565b60405180910390f35b34801561061757600080fd5b50610620611193565b60405161062d91906128c1565b60405180910390f35b34801561064257600080fd5b5061064b61119b565b60405161065891906128c1565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190612219565b61124e565b005b34801561069657600080fd5b5061069f611297565b6040516106ac91906128c1565b60405180910390f35b3480156106c157600080fd5b506106ca61129d565b6040516106d791906128c1565b60405180910390f35b3480156106ec57600080fd5b506106f56112a3565b60405161070291906128c1565b60405180910390f35b34801561071757600080fd5b506107206112b8565b005b34801561072e57600080fd5b506107496004803603810190610744919061209a565b61136e565b005b34801561075757600080fd5b506107606113f2565b60405161076d9190612583565b60405180910390f35b34801561078257600080fd5b5061078b611418565b005b609d5481565b600063150b7a0260e01b9050949350505050565b60a36020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107e26114ea565b609760149054906101000a900460ff16610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890612741565b60405180910390fd5b6000609760146101000a81548160ff021916908315150217905550565b60a15481565b61085c6114ea565b80609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108ce6114ea565b80609c60006101000a81548160ff021916908360ff1602179055507fec5ccd96cc77b6219e9d44143df916af68fc169339ea7de5008ff15eae13450d816040516109189190612905565b60405180910390a150565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109b357600080fd5b505afa1580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190612246565b905090565b60008060019054906101000a900460ff16159050808015610a215750600160008054906101000a900460ff1660ff16105b80610a4e5750610a3030611568565b158015610a4d5750600160008054906101000a900460ff1660ff16145b5b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a84906127c1565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610aca576001600060016101000a81548160ff0219169083151502179055505b610ad261158b565b610ada6115e4565b6000609760146101000a81548160ff02191690831515021790555087609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085609960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084609a8190555083609b8190555082609c60006101000a81548160ff021916908360ff16021790555081609d819055508015610c415760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610c3891906126e6565b60405180910390a15b5050505050505050565b60026001541415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612881565b60405180910390fd5b600260018190555080609e5414610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd490612701565b60405180910390fd5b60a1544210610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d18906128a1565b60405180910390fd5b609b54341015610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90612781565b60405180910390fd5b6064609c60009054906101000a900460ff1660ff16609f54610d889190612a3f565b610d929190612a0e565b609f54610d9f91906129b8565b341015610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd8906127e1565b60405180910390fd5b600060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e4957610e4881609f5461163d565b5b34609f819055503360a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000609a544260a154610ea49190612a99565b1090508015610ec257609a5442610ebb91906129b8565b60a1819055505b609e547f1159164c56f277e6fc99c11731bd380e0347deb969b75523398734c252706ea3333484604051610ef89392919061265e565b60405180910390a28015610f4357609e547f6e912a3a9105bdd2af817ba5adc14e6c127c1035b5b648faa29ca0d58ab8ff4e60a154604051610f3a91906128c1565b60405180910390a25b50506001808190555050565b610f576114ea565b609760149054906101000a900460ff1615610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e906127a1565b60405180910390fd5b610faf611783565b6001609760146101000a81548160ff021916908315150217905550565b610fd46114ea565b80609a819055507f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d8160405161100a91906128c1565b60405180910390a150565b61101d6114ea565b611027600061196f565b565b60a05481565b609e5481565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a46020528060005260406000206000915090505481565b60a260149054906101000a900460ff1681565b609760149054906101000a900460ff1681565b60026001541415611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090612881565b60405180910390fd5b60026001819055506111196114ea565b609760149054906101000a900460ff1615611169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611160906127a1565b60405180910390fd5b611171611a35565b60018081905550565b609f5481565b609c60009054906101000a900460ff1681565b600042905090565b60006001609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120757600080fd5b505afa15801561121b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123f9190612246565b6112499190612a99565b905090565b6112566114ea565b80609b819055507f6ab2e127d7fdf53b8f304e59d3aab5bfe97979f52a85479691a6fab27a28a6b28160405161128c91906128c1565b60405180910390a150565b609b5481565b609a5481565b60004260a1546112b39190612a99565b905090565b600260015414156112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612881565b60405180910390fd5b6002600181905550609760149054906101000a900460ff16611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90612741565b60405180910390fd5b61135d611a35565b611365611783565b60018081905550565b6113766114ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612721565b60405180910390fd5b6113ef8161196f565b50565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600154141561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590612881565b60405180910390fd5b600260018190555061146e6114ea565b609760149054906101000a900460ff16156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906127a1565b60405180910390fd5b6114c6611783565b6001609760146101000a81548160ff02191690831515021790555060018081905550565b6114f2611e20565b73ffffffffffffffffffffffffffffffffffffffff1661151061105b565b73ffffffffffffffffffffffffffffffffffffffff1614611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90612801565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff166115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190612841565b60405180910390fd5b6115e2611e28565b565b600060019054906101000a900460ff16611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90612841565b60405180910390fd5b61163b611e80565b565b6116478282611ee1565b61177f57609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116b557600080fd5b505af11580156116c9573d6000803e3d6000fd5b5050505050609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161172b929190612635565b602060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177d919061214a565b505b5050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117eb57600080fd5b505afa1580156117ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118239190612246565b609e81905550609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632004ffd96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561189357600080fd5b505af11580156118a7573d6000803e3d6000fd5b505050504260a081905550609d5460a0546118c291906129b8565b60a1819055506000609f81905550600060a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060a260146101000a81548160ff021916908315150217905550609e547fd6eddd1118d71820909c1197aa966dbc15ed6f508554252169cc3d5ccac756ca60a05460a1546040516119659291906128dc565b60405180910390a2565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060a0541415611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290612761565b60405180910390fd5b60a260149054906101000a900460ff1615611acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac290612821565b60405180910390fd5b60a154421015611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612861565b60405180910390fd5b600160a260146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff1660a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c3c57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd30609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609e546040518463ffffffff1660e01b8152600401611c05939291906125fe565b600060405180830381600087803b158015611c1f57600080fd5b505af1158015611c33573d6000803e3d6000fd5b50505050611d68565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609e546040518463ffffffff1660e01b8152600401611cbf939291906125c7565b600060405180830381600087803b158015611cd957600080fd5b505af1158015611ced573d6000803e3d6000fd5b5050505060a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660a36000609e54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000609f541115611dbe57611da1609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f5461163d565b609f5460a46000609e548152602001908152602001600020819055505b609e547fc9f72b276a388619c6d185d146697036241880c36654b1a3ffdad07c24038d9960a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16609f54604051611e1692919061259e565b60405180910390a2565b600033905090565b600060019054906101000a900460ff16611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e90612841565b60405180910390fd5b60018081905550565b600060019054906101000a900460ff16611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec690612841565b60405180910390fd5b611edf611eda611e20565b61196f565b565b6000808373ffffffffffffffffffffffffffffffffffffffff168361753090600067ffffffffffffffff811115611f1b57611f1a612caf565b5b6040519080825280601f01601f191660200182016040528015611f4d5781602001600182028036833780820191505090505b50604051611f5b9190612551565b600060405180830381858888f193505050503d8060008114611f99576040519150601f19603f3d011682016040523d82523d6000602084013e611f9e565b606091505b505090508091505092915050565b6000611fbf611fba84612960565b61293b565b905082815260208101848484011115611fdb57611fda612ce3565b5b611fe6848285612bde565b509392505050565b600081359050611ffd81612fd9565b92915050565b60008151905061201281612ff0565b92915050565b600082601f83011261202d5761202c612cde565b5b813561203d848260208601611fac565b91505092915050565b60008135905061205581613007565b92915050565b60008135905061206a8161301e565b92915050565b60008151905061207f8161301e565b92915050565b60008135905061209481613035565b92915050565b6000602082840312156120b0576120af612ced565b5b60006120be84828501611fee565b91505092915050565b600080600080608085870312156120e1576120e0612ced565b5b60006120ef87828801611fee565b945050602061210087828801611fee565b93505060406121118782880161205b565b925050606085013567ffffffffffffffff81111561213257612131612ce8565b5b61213e87828801612018565b91505092959194509250565b6000602082840312156121605761215f612ced565b5b600061216e84828501612003565b91505092915050565b600080600080600080600060e0888a03121561219657612195612ced565b5b60006121a48a828b01612046565b97505060206121b58a828b01611fee565b96505060406121c68a828b01611fee565b95505060606121d78a828b0161205b565b94505060806121e88a828b0161205b565b93505060a06121f98a828b01612085565b92505060c061220a8a828b0161205b565b91505092959891949750929550565b60006020828403121561222f5761222e612ced565b5b600061223d8482850161205b565b91505092915050565b60006020828403121561225c5761225b612ced565b5b600061226a84828501612070565b91505092915050565b60006020828403121561228957612288612ced565b5b600061229784828501612085565b91505092915050565b6122a981612b72565b82525050565b6122b881612adf565b82525050565b6122c781612acd565b82525050565b6122d681612af1565b82525050565b6122e581612afd565b82525050565b60006122f682612991565b612300818561299c565b9350612310818560208601612bed565b80840191505092915050565b61232581612b84565b82525050565b61233481612b96565b82525050565b60006123476018836129a7565b915061235282612d03565b602082019050919050565b600061236a6026836129a7565b915061237582612d2c565b604082019050919050565b600061238d6011836129a7565b915061239882612d7b565b602082019050919050565b60006123b06014836129a7565b91506123bb82612da4565b602082019050919050565b60006123d3601f836129a7565b91506123de82612dcd565b602082019050919050565b60006123f6600d836129a7565b915061240182612df6565b602082019050919050565b6000612419602e836129a7565b915061242482612e1f565b604082019050919050565b600061243c6040836129a7565b915061244782612e6e565b604082019050919050565b600061245f6020836129a7565b915061246a82612ebd565b602082019050919050565b60006124826020836129a7565b915061248d82612ee6565b602082019050919050565b60006124a5602b836129a7565b91506124b082612f0f565b604082019050919050565b60006124c86018836129a7565b91506124d382612f5e565b602082019050919050565b60006124eb601f836129a7565b91506124f682612f87565b602082019050919050565b600061250e600f836129a7565b915061251982612fb0565b602082019050919050565b61252d81612b5b565b82525050565b61253c81612bcc565b82525050565b61254b81612b65565b82525050565b600061255d82846122eb565b915081905092915050565b600060208201905061257d60008301846122be565b92915050565b600060208201905061259860008301846122af565b92915050565b60006040820190506125b360008301856122a0565b6125c06020830184612524565b9392505050565b60006060820190506125dc60008301866122be565b6125e960208301856122a0565b6125f66040830184612524565b949350505050565b600060608201905061261360008301866122be565b61262060208301856122be565b61262d6040830184612524565b949350505050565b600060408201905061264a60008301856122be565b6126576020830184612524565b9392505050565b600060608201905061267360008301866122be565b6126806020830185612524565b61268d60408301846122cd565b949350505050565b60006020820190506126aa60008301846122cd565b92915050565b60006020820190506126c560008301846122dc565b92915050565b60006020820190506126e0600083018461231c565b92915050565b60006020820190506126fb600083018461232b565b92915050565b6000602082019050818103600083015261271a8161233a565b9050919050565b6000602082019050818103600083015261273a8161235d565b9050919050565b6000602082019050818103600083015261275a81612380565b9050919050565b6000602082019050818103600083015261277a816123a3565b9050919050565b6000602082019050818103600083015261279a816123c6565b9050919050565b600060208201905081810360008301526127ba816123e9565b9050919050565b600060208201905081810360008301526127da8161240c565b9050919050565b600060208201905081810360008301526127fa8161242f565b9050919050565b6000602082019050818103600083015261281a81612452565b9050919050565b6000602082019050818103600083015261283a81612475565b9050919050565b6000602082019050818103600083015261285a81612498565b9050919050565b6000602082019050818103600083015261287a816124bb565b9050919050565b6000602082019050818103600083015261289a816124de565b9050919050565b600060208201905081810360008301526128ba81612501565b9050919050565b60006020820190506128d66000830184612524565b92915050565b60006040820190506128f16000830185612524565b6128fe6020830184612524565b9392505050565b600060208201905061291a6000830184612533565b92915050565b60006020820190506129356000830184612542565b92915050565b6000612945612956565b90506129518282612c20565b919050565b6000604051905090565b600067ffffffffffffffff82111561297b5761297a612caf565b5b61298482612cf2565b9050602081019050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006129c382612b5b565b91506129ce83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a0357612a02612c51565b5b828201905092915050565b6000612a1982612b5b565b9150612a2483612b5b565b925082612a3457612a33612c80565b5b828204905092915050565b6000612a4a82612b5b565b9150612a5583612b5b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8e57612a8d612c51565b5b828202905092915050565b6000612aa482612b5b565b9150612aaf83612b5b565b925082821015612ac257612ac1612c51565b5b828203905092915050565b6000612ad882612b3b565b9050919050565b6000612aea82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612b3482612acd565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612b7d82612ba8565b9050919050565b6000612b8f82612ba8565b9050919050565b6000612ba182612b65565b9050919050565b6000612bb382612bba565b9050919050565b6000612bc582612b3b565b9050919050565b6000612bd782612b65565b9050919050565b82818337600083830152505050565b60005b83811015612c0b578082015181840152602081019050612bf0565b83811115612c1a576000848401525b50505050565b612c2982612cf2565b810181811067ffffffffffffffff82111715612c4857612c47612caf565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e206e6f7420757020666f722061756374696f6e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206f6e000000000000000000000000000000600082015250565b7f41756374696f6e206861736e277420626567756e000000000000000000000000600082015250565b7f4d7573742073656e64206174206c656173742072657365727665507269636500600082015250565b7f41756374696f6e206973206f6e00000000000000000000000000000000000000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060008201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e74602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41756374696f6e2068617320616c7265616479206265656e20736574746c6564600082015250565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206861736e277420636f6d706c657465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f41756374696f6e20657870697265640000000000000000000000000000000000600082015250565b612fe281612acd565b8114612fed57600080fd5b50565b612ff981612af1565b811461300457600080fd5b50565b61301081612b29565b811461301b57600080fd5b50565b61302781612b5b565b811461303257600080fd5b50565b61303e81612b65565b811461304957600080fd5b5056fea2646970667358221220e610af27a81e5c365a17276f057ef8d3b81a667519ee60b79f0ca3c7a658ce8564736f6c63430008070033
Deployed Bytecode Sourcemap
33159:9751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33949:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1612:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34512:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41239:133;;;;;;;;;;;;;:::i;:::-;;34260:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42421:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33540:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42648:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33473:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38033:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34820:622;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35682:1181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41598:156;;;;;;;;;;;;;:::i;:::-;;41862:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26905:101;;;;;;;;;;;;;:::i;:::-;;34174:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34029:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33324:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26271:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34629:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34427:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33399:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37120:149;;;;;;;;;;;;;:::i;:::-;;34103:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33862:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38615:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38251:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42140:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33737:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33655:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38445:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37770:187;;;;;;;;;;;;;:::i;:::-;;27157:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34337:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37418:170;;;;;;;;;;;;;:::i;:::-;;33949:23;;;;:::o;1612:200::-;1750:6;1775:30;;;1768:37;;1612:200;;;;;;:::o;34512:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;41239:133::-;26162:13;:11;:13::i;:::-;41299::::1;;;;;;;;;;;41291:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41360:5;41344:13;;:21;;;;;;;;;;;;;;;;;;41239:133::o:0;34260:22::-;;;;:::o;42421:98::-;26162:13;:11;:13::i;:::-;42505:7:::1;42491:11;;:21;;;;;;;;;;;;;;;;;;42421:98:::0;:::o;33540:26::-;;;;;;;;;;;;;:::o;42648:256::-;26162:13;:11;:13::i;:::-;42786:26:::1;42758:25;;:54;;;;;;;;;;;;;;;;;;42830:67;42870:26;42830:67;;;;;;:::i;:::-;;;;;;;;42648:256:::0;:::o;33473:19::-;;;;;;;;;;;;;:::o;38033:106::-;38082:7;38108:10;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38101:31;;38033:106;:::o;34820:622::-;20901:19;20924:13;;;;;;;;;;;20923:14;20901:36;;20969:14;:34;;;;;21002:1;20987:12;;;;;;;;;;:16;;;20969:34;20968:108;;;;21010:44;21048:4;21010:29;:44::i;:::-;21009:45;:66;;;;;21074:1;21058:12;;;;;;;;;;:17;;;21009:66;20968:108;20947:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;21173:1;21158:12;;:16;;;;;;;;;;;;;;;;;;21188:14;21184:65;;;21234:4;21218:13;;:20;;;;;;;;;;;;;;;;;;21184:65;35096:24:::1;:22;:24::i;:::-;35130:16;:14;:16::i;:::-;35172:5;35156:13;;:21;;;;;;;;;;;;;;;;;;35200:11;35187:10;;:24;;;;;;;;;;;;;;;;;;35228:5;35221:4;;:12;;;;;;;;;;;;;;;;;;35257;35243:11;;:26;;;;;;;;;;;;;;;;;;35292:11;35279:10;:24;;;;35328:13;35313:12;:28;;;;35379:26;35351:25;;:54;;;;;;;;;;;;;;;;;;35426:9;35415:8;:20;;;;21273:14:::0;21269:99;;;21319:5;21303:13;;:21;;;;;;;;;;;;;;;;;;21343:14;21355:1;21343:14;;;;;;:::i;:::-;;;;;;;;21269:99;20891:483;34820:622;;;;;;;:::o;35682:1181::-;29843:1;30605:7;;:19;;30597:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:1;30737:7;:18;;;;35792:5:::1;35776:12;;:21;35768:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35862:7;;35844:15;:25;35836:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35920:12;;35907:9;:25;;35899:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;36061:3;36032:25;;;;;;;;;;;36023:34;;:6;;:34;;;;:::i;:::-;36022:42;;;;:::i;:::-;36012:6;;:53;;;;:::i;:::-;35999:9;:66;;35978:177;;;;;;;;;;;;:::i;:::-;;;;;;;;;36168:26;36197:6;;;;;;;;;;;36168:35;;36291:1;36269:24;;:10;:24;;;36265:103;;36309:48;36338:10;36350:6;;36309:28;:48::i;:::-;36265:103;36389:9;36380:6;:18;;;;36425:10;36408:6;;:28;;;;;;;;;;;;;;;;;;36547:13;36591:10;;36573:15;36563:7;;:25;;;;:::i;:::-;:38;36547:54;;36615:8;36611:77;;;36667:10;;36649:15;:28;;;;:::i;:::-;36639:7;:38;;;;36611:77;36716:12;;36705:57;36730:10;36742:9;36753:8;36705:57;;;;;;;;:::i;:::-;;;;;;;;36779:8;36775:82;;;36824:12;;36808:38;36838:7;;36808:38;;;;;;:::i;:::-;;;;;;;;36775:82;35755:1108;;29800:1:::0;30914:7;:22;;;;35682:1181;:::o;41598:156::-;26162:13;:11;:13::i;:::-;41660::::1;;;;;;;;;;;41659:14;41651:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;41701:16;:14;:16::i;:::-;41743:4;41727:13;;:20;;;;;;;;;;;;;;;;;;41598:156::o:0;41862:168::-;26162:13;:11;:13::i;:::-;41957:11:::1;41944:10;:24;;;;41986:37;42011:11;41986:37;;;;;;:::i;:::-;;;;;;;;41862:168:::0;:::o;26905:101::-;26162:13;:11;:13::i;:::-;26969:30:::1;26996:1;26969:18;:30::i;:::-;26905:101::o:0;34174:24::-;;;;:::o;34029:27::-;;;;:::o;33324:33::-;;;;;;;;;;;;;:::o;26271:85::-;26317:7;26343:6;;;;;;;;;;;26336:13;;26271:85;:::o;34629:51::-;;;;;;;;;;;;;;;;;:::o;34427:19::-;;;;;;;;;;;;;:::o;33399:25::-;;;;;;;;;;;;;:::o;37120:149::-;29843:1;30605:7;;:19;;30597:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:1;30737:7;:18;;;;26162:13:::1;:11;:13::i;:::-;37205::::2;;;;;;;;;;;37204:14;37196:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;37246:16;:14;:16::i;:::-;29800:1:::0;30914:7;:22;;;;37120:149::o;34103:21::-;;;;:::o;33862:38::-;;;;;;;;;;;;;:::o;38615:99::-;38666:7;38692:15;38685:22;;38615:99;:::o;38251:113::-;38303:7;38356:1;38329:10;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;:::i;:::-;38322:35;;38251:113;:::o;42140:180::-;26162:13;:11;:13::i;:::-;42241::::1;42226:12;:28;;;;42272:41;42299:13;42272:41;;;;;;:::i;:::-;;;;;;;;42140:180:::0;:::o;33737:27::-;;;;:::o;33655:25::-;;;;:::o;38445:109::-;38496:7;38532:15;38522:7;;:25;;;;:::i;:::-;38515:32;;38445:109;:::o;37770:187::-;29843:1;30605:7;;:19;;30597:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:1;30737:7;:18;;;;37863:13:::1;;;;;;;;;;;37855:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;37908:16;:14;:16::i;:::-;37934;:14;:16::i;:::-;29800:1:::0;30914:7;:22;;;;37770:187::o;27157:198::-;26162:13;:11;:13::i;:::-;27265:1:::1;27245:22;;:8;:22;;;;27237:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27320:28;27339:8;27320:18;:28::i;:::-;27157:198:::0;:::o;34337:30::-;;;;;;;;;;;;;:::o;37418:170::-;29843:1;30605:7;;:19;;30597:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29843:1;30737:7;:18;;;;26162:13:::1;:11;:13::i;:::-;37494::::2;;;;;;;;;;;37493:14;37485:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;37535:16;:14;:16::i;:::-;37577:4;37561:13;;:20;;;;;;;;;;;;;;;;;;29800:1:::0;30914:7;:22;;;;37418:170::o;26431:130::-;26505:12;:10;:12::i;:::-;26494:23;;:7;:5;:7::i;:::-;:23;;;26486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26431:130::o;11560:322::-;11620:4;11874:1;11852:7;:19;;;:23;11845:30;;11560:322;;;:::o;29885:111::-;22704:13;;;;;;;;;;;22696:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29955:34:::1;:32;:34::i;:::-;29885:111::o:0;25827:95::-;22704:13;;;;;;;;;;;22696:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;25889:26:::1;:24;:26::i;:::-;25827:95::o:0;40301:232::-;40390:27;40407:2;40411:5;40390:16;:27::i;:::-;40385:142;;40439:4;;;;;;;;;;;40433:19;;;40461:5;40433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40491:4;;;;;;;;;;;40484:21;;;40506:2;40510:5;40484:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40385:142;40301:232;;:::o;38978:339::-;39038:10;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39023:12;:39;;;;39072:10;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39116:15;39104:9;:27;;;;39163:8;;39151:9;;:20;;;;:::i;:::-;39141:7;:30;;;;39191:1;39181:6;:11;;;;39220:1;39202:6;;:20;;;;;;;;;;;;;;;;;;39242:5;39232:7;;:15;;;;;;;;;;;;;;;;;;39277:12;;39262:48;39291:9;;39302:7;;39262:48;;;;;;;:::i;:::-;;;;;;;;38978:339::o;27511:187::-;27584:16;27603:6;;;;;;;;;;;27584:25;;27628:8;27619:6;;:17;;;;;;;;;;;;;;;;;;27682:8;27651:40;;27672:8;27651:40;;;;;;;;;;;;27574:124;27511:187;:::o;39423:760::-;39489:1;39476:9;;:14;;39468:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39534:7;;;;;;;;;;;39533:8;39525:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;39615:7;;39596:15;:26;;39588:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39674:4;39664:7;;:14;;;;;;;;;;;;;;;;;;39721:1;39703:20;;:6;;;;;;;;;;;:20;;;39699:261;;;39739:10;;;;;;;;;;;:23;;;39771:4;39778:11;;;;;;;;;;;39791:12;;39739:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39699:261;;;39835:10;;;;;;;;;;;:23;;;39867:4;39874:6;;;;;;;;;;;39882:12;;39835:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39943:6;;;;;;;;;;;39909:17;:31;39927:12;;39909:31;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;39699:261;39985:1;39976:6;;:10;39972:143;;;40002:49;40031:11;;;;;;;;;;;40044:6;;40002:28;:49::i;:::-;40098:6;;40065:16;:30;40082:12;;40065:30;;;;;;;;;;;:39;;;;39972:143;40147:12;;40132:44;40161:6;;;;;;;;;;;40169;;40132:44;;;;;;;:::i;:::-;;;;;;;;39423:760::o;24339:96::-;24392:7;24418:10;24411:17;;24339:96;:::o;30004:109::-;22704:13;;;;;;;;;;;22696:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:1:::1;30084:7:::0;:22:::1;;;;30004:109::o:0;25930:111::-;22704:13;;;;;;;;;;;22696:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26002:32:::1;26021:12;:10;:12::i;:::-;26002:18;:32::i;:::-;25930:111::o:0;40682:187::-;40753:4;40770:12;40788:2;:7;;40804:5;40816:6;40788:50;40835:1;40825:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40788:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40769:69;;;40855:7;40848:14;;;40682:187;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:137::-;622:5;653:6;647:13;638:22;;669:30;693:5;669:30;:::i;:::-;568:137;;;;:::o;724:338::-;779:5;828:3;821:4;813:6;809:17;805:27;795:122;;836:79;;:::i;:::-;795:122;953:6;940:20;978:78;1052:3;1044:6;1037:4;1029:6;1025:17;978:78;:::i;:::-;969:87;;785:277;724:338;;;;:::o;1068:185::-;1137:5;1175:6;1162:20;1153:29;;1191:56;1241:5;1191:56;:::i;:::-;1068:185;;;;:::o;1259:139::-;1305:5;1343:6;1330:20;1321:29;;1359:33;1386:5;1359:33;:::i;:::-;1259:139;;;;:::o;1404:143::-;1461:5;1492:6;1486:13;1477:22;;1508:33;1535:5;1508:33;:::i;:::-;1404:143;;;;:::o;1553:135::-;1597:5;1635:6;1622:20;1613:29;;1651:31;1676:5;1651:31;:::i;:::-;1553:135;;;;:::o;1694:329::-;1753:6;1802:2;1790:9;1781:7;1777:23;1773:32;1770:119;;;1808:79;;:::i;:::-;1770:119;1928:1;1953:53;1998:7;1989:6;1978:9;1974:22;1953:53;:::i;:::-;1943:63;;1899:117;1694:329;;;;:::o;2029:943::-;2124:6;2132;2140;2148;2197:3;2185:9;2176:7;2172:23;2168:33;2165:120;;;2204:79;;:::i;:::-;2165:120;2324:1;2349:53;2394:7;2385:6;2374:9;2370:22;2349:53;:::i;:::-;2339:63;;2295:117;2451:2;2477:53;2522:7;2513:6;2502:9;2498:22;2477:53;:::i;:::-;2467:63;;2422:118;2579:2;2605:53;2650:7;2641:6;2630:9;2626:22;2605:53;:::i;:::-;2595:63;;2550:118;2735:2;2724:9;2720:18;2707:32;2766:18;2758:6;2755:30;2752:117;;;2788:79;;:::i;:::-;2752:117;2893:62;2947:7;2938:6;2927:9;2923:22;2893:62;:::i;:::-;2883:72;;2678:287;2029:943;;;;;;;:::o;2978:345::-;3045:6;3094:2;3082:9;3073:7;3069:23;3065:32;3062:119;;;3100:79;;:::i;:::-;3062:119;3220:1;3245:61;3298:7;3289:6;3278:9;3274:22;3245:61;:::i;:::-;3235:71;;3191:125;2978:345;;;;:::o;3329:1245::-;3463:6;3471;3479;3487;3495;3503;3511;3560:3;3548:9;3539:7;3535:23;3531:33;3528:120;;;3567:79;;:::i;:::-;3528:120;3687:1;3712:76;3780:7;3771:6;3760:9;3756:22;3712:76;:::i;:::-;3702:86;;3658:140;3837:2;3863:53;3908:7;3899:6;3888:9;3884:22;3863:53;:::i;:::-;3853:63;;3808:118;3965:2;3991:53;4036:7;4027:6;4016:9;4012:22;3991:53;:::i;:::-;3981:63;;3936:118;4093:2;4119:53;4164:7;4155:6;4144:9;4140:22;4119:53;:::i;:::-;4109:63;;4064:118;4221:3;4248:53;4293:7;4284:6;4273:9;4269:22;4248:53;:::i;:::-;4238:63;;4192:119;4350:3;4377:51;4420:7;4411:6;4400:9;4396:22;4377:51;:::i;:::-;4367:61;;4321:117;4477:3;4504:53;4549:7;4540:6;4529:9;4525:22;4504:53;:::i;:::-;4494:63;;4448:119;3329:1245;;;;;;;;;;:::o;4580:329::-;4639:6;4688:2;4676:9;4667:7;4663:23;4659:32;4656:119;;;4694:79;;:::i;:::-;4656:119;4814:1;4839:53;4884:7;4875:6;4864:9;4860:22;4839:53;:::i;:::-;4829:63;;4785:117;4580:329;;;;:::o;4915:351::-;4985:6;5034:2;5022:9;5013:7;5009:23;5005:32;5002:119;;;5040:79;;:::i;:::-;5002:119;5160:1;5185:64;5241:7;5232:6;5221:9;5217:22;5185:64;:::i;:::-;5175:74;;5131:128;4915:351;;;;:::o;5272:325::-;5329:6;5378:2;5366:9;5357:7;5353:23;5349:32;5346:119;;;5384:79;;:::i;:::-;5346:119;5504:1;5529:51;5572:7;5563:6;5552:9;5548:22;5529:51;:::i;:::-;5519:61;;5475:115;5272:325;;;;:::o;5603:147::-;5698:45;5737:5;5698:45;:::i;:::-;5693:3;5686:58;5603:147;;:::o;5756:142::-;5859:32;5885:5;5859:32;:::i;:::-;5854:3;5847:45;5756:142;;:::o;5904:118::-;5991:24;6009:5;5991:24;:::i;:::-;5986:3;5979:37;5904:118;;:::o;6028:109::-;6109:21;6124:5;6109:21;:::i;:::-;6104:3;6097:34;6028:109;;:::o;6143:115::-;6228:23;6245:5;6228:23;:::i;:::-;6223:3;6216:36;6143:115;;:::o;6264:373::-;6368:3;6396:38;6428:5;6396:38;:::i;:::-;6450:88;6531:6;6526:3;6450:88;:::i;:::-;6443:95;;6547:52;6592:6;6587:3;6580:4;6573:5;6569:16;6547:52;:::i;:::-;6624:6;6619:3;6615:16;6608:23;;6372:265;6264:373;;;;:::o;6643:177::-;6753:60;6807:5;6753:60;:::i;:::-;6748:3;6741:73;6643:177;;:::o;6826:143::-;6919:43;6956:5;6919:43;:::i;:::-;6914:3;6907:56;6826:143;;:::o;6975:366::-;7117:3;7138:67;7202:2;7197:3;7138:67;:::i;:::-;7131:74;;7214:93;7303:3;7214:93;:::i;:::-;7332:2;7327:3;7323:12;7316:19;;6975:366;;;:::o;7347:::-;7489:3;7510:67;7574:2;7569:3;7510:67;:::i;:::-;7503:74;;7586:93;7675:3;7586:93;:::i;:::-;7704:2;7699:3;7695:12;7688:19;;7347:366;;;:::o;7719:::-;7861:3;7882:67;7946:2;7941:3;7882:67;:::i;:::-;7875:74;;7958:93;8047:3;7958:93;:::i;:::-;8076:2;8071:3;8067:12;8060:19;;7719:366;;;:::o;8091:::-;8233:3;8254:67;8318:2;8313:3;8254:67;:::i;:::-;8247:74;;8330:93;8419:3;8330:93;:::i;:::-;8448:2;8443:3;8439:12;8432:19;;8091:366;;;:::o;8463:::-;8605:3;8626:67;8690:2;8685:3;8626:67;:::i;:::-;8619:74;;8702:93;8791:3;8702:93;:::i;:::-;8820:2;8815:3;8811:12;8804:19;;8463:366;;;:::o;8835:::-;8977:3;8998:67;9062:2;9057:3;8998:67;:::i;:::-;8991:74;;9074:93;9163:3;9074:93;:::i;:::-;9192:2;9187:3;9183:12;9176:19;;8835:366;;;:::o;9207:::-;9349:3;9370:67;9434:2;9429:3;9370:67;:::i;:::-;9363:74;;9446:93;9535:3;9446:93;:::i;:::-;9564:2;9559:3;9555:12;9548:19;;9207:366;;;:::o;9579:::-;9721:3;9742:67;9806:2;9801:3;9742:67;:::i;:::-;9735:74;;9818:93;9907:3;9818:93;:::i;:::-;9936:2;9931:3;9927:12;9920:19;;9579:366;;;:::o;9951:::-;10093:3;10114:67;10178:2;10173:3;10114:67;:::i;:::-;10107:74;;10190:93;10279:3;10190:93;:::i;:::-;10308:2;10303:3;10299:12;10292:19;;9951:366;;;:::o;10323:::-;10465:3;10486:67;10550:2;10545:3;10486:67;:::i;:::-;10479:74;;10562:93;10651:3;10562:93;:::i;:::-;10680:2;10675:3;10671:12;10664:19;;10323:366;;;:::o;10695:::-;10837:3;10858:67;10922:2;10917:3;10858:67;:::i;:::-;10851:74;;10934:93;11023:3;10934:93;:::i;:::-;11052:2;11047:3;11043:12;11036:19;;10695:366;;;:::o;11067:::-;11209:3;11230:67;11294:2;11289:3;11230:67;:::i;:::-;11223:74;;11306:93;11395:3;11306:93;:::i;:::-;11424:2;11419:3;11415:12;11408:19;;11067:366;;;:::o;11439:::-;11581:3;11602:67;11666:2;11661:3;11602:67;:::i;:::-;11595:74;;11678:93;11767:3;11678:93;:::i;:::-;11796:2;11791:3;11787:12;11780:19;;11439:366;;;:::o;11811:::-;11953:3;11974:67;12038:2;12033:3;11974:67;:::i;:::-;11967:74;;12050:93;12139:3;12050:93;:::i;:::-;12168:2;12163:3;12159:12;12152:19;;11811:366;;;:::o;12183:118::-;12270:24;12288:5;12270:24;:::i;:::-;12265:3;12258:37;12183:118;;:::o;12307:127::-;12392:35;12421:5;12392:35;:::i;:::-;12387:3;12380:48;12307:127;;:::o;12440:112::-;12523:22;12539:5;12523:22;:::i;:::-;12518:3;12511:35;12440:112;;:::o;12558:271::-;12688:3;12710:93;12799:3;12790:6;12710:93;:::i;:::-;12703:100;;12820:3;12813:10;;12558:271;;;;:::o;12835:222::-;12928:4;12966:2;12955:9;12951:18;12943:26;;12979:71;13047:1;13036:9;13032:17;13023:6;12979:71;:::i;:::-;12835:222;;;;:::o;13063:254::-;13172:4;13210:2;13199:9;13195:18;13187:26;;13223:87;13307:1;13296:9;13292:17;13283:6;13223:87;:::i;:::-;13063:254;;;;:::o;13323:348::-;13452:4;13490:2;13479:9;13475:18;13467:26;;13503:79;13579:1;13568:9;13564:17;13555:6;13503:79;:::i;:::-;13592:72;13660:2;13649:9;13645:18;13636:6;13592:72;:::i;:::-;13323:348;;;;;:::o;13677:458::-;13834:4;13872:2;13861:9;13857:18;13849:26;;13885:71;13953:1;13942:9;13938:17;13929:6;13885:71;:::i;:::-;13966:80;14042:2;14031:9;14027:18;14018:6;13966:80;:::i;:::-;14056:72;14124:2;14113:9;14109:18;14100:6;14056:72;:::i;:::-;13677:458;;;;;;:::o;14141:442::-;14290:4;14328:2;14317:9;14313:18;14305:26;;14341:71;14409:1;14398:9;14394:17;14385:6;14341:71;:::i;:::-;14422:72;14490:2;14479:9;14475:18;14466:6;14422:72;:::i;:::-;14504;14572:2;14561:9;14557:18;14548:6;14504:72;:::i;:::-;14141:442;;;;;;:::o;14589:332::-;14710:4;14748:2;14737:9;14733:18;14725:26;;14761:71;14829:1;14818:9;14814:17;14805:6;14761:71;:::i;:::-;14842:72;14910:2;14899:9;14895:18;14886:6;14842:72;:::i;:::-;14589:332;;;;;:::o;14927:430::-;15070:4;15108:2;15097:9;15093:18;15085:26;;15121:71;15189:1;15178:9;15174:17;15165:6;15121:71;:::i;:::-;15202:72;15270:2;15259:9;15255:18;15246:6;15202:72;:::i;:::-;15284:66;15346:2;15335:9;15331:18;15322:6;15284:66;:::i;:::-;14927:430;;;;;;:::o;15363:210::-;15450:4;15488:2;15477:9;15473:18;15465:26;;15501:65;15563:1;15552:9;15548:17;15539:6;15501:65;:::i;:::-;15363:210;;;;:::o;15579:218::-;15670:4;15708:2;15697:9;15693:18;15685:26;;15721:69;15787:1;15776:9;15772:17;15763:6;15721:69;:::i;:::-;15579:218;;;;:::o;15803:268::-;15919:4;15957:2;15946:9;15942:18;15934:26;;15970:94;16061:1;16050:9;16046:17;16037:6;15970:94;:::i;:::-;15803:268;;;;:::o;16077:234::-;16176:4;16214:2;16203:9;16199:18;16191:26;;16227:77;16301:1;16290:9;16286:17;16277:6;16227:77;:::i;:::-;16077:234;;;;:::o;16317:419::-;16483:4;16521:2;16510:9;16506:18;16498:26;;16570:9;16564:4;16560:20;16556:1;16545:9;16541:17;16534:47;16598:131;16724:4;16598:131;:::i;:::-;16590:139;;16317:419;;;:::o;16742:::-;16908:4;16946:2;16935:9;16931:18;16923:26;;16995:9;16989:4;16985:20;16981:1;16970:9;16966:17;16959:47;17023:131;17149:4;17023:131;:::i;:::-;17015:139;;16742:419;;;:::o;17167:::-;17333:4;17371:2;17360:9;17356:18;17348:26;;17420:9;17414:4;17410:20;17406:1;17395:9;17391:17;17384:47;17448:131;17574:4;17448:131;:::i;:::-;17440:139;;17167:419;;;:::o;17592:::-;17758:4;17796:2;17785:9;17781:18;17773:26;;17845:9;17839:4;17835:20;17831:1;17820:9;17816:17;17809:47;17873:131;17999:4;17873:131;:::i;:::-;17865:139;;17592:419;;;:::o;18017:::-;18183:4;18221:2;18210:9;18206:18;18198:26;;18270:9;18264:4;18260:20;18256:1;18245:9;18241:17;18234:47;18298:131;18424:4;18298:131;:::i;:::-;18290:139;;18017:419;;;:::o;18442:::-;18608:4;18646:2;18635:9;18631:18;18623:26;;18695:9;18689:4;18685:20;18681:1;18670:9;18666:17;18659:47;18723:131;18849:4;18723:131;:::i;:::-;18715:139;;18442:419;;;:::o;18867:::-;19033:4;19071:2;19060:9;19056:18;19048:26;;19120:9;19114:4;19110:20;19106:1;19095:9;19091:17;19084:47;19148:131;19274:4;19148:131;:::i;:::-;19140:139;;18867:419;;;:::o;19292:::-;19458:4;19496:2;19485:9;19481:18;19473:26;;19545:9;19539:4;19535:20;19531:1;19520:9;19516:17;19509:47;19573:131;19699:4;19573:131;:::i;:::-;19565:139;;19292:419;;;:::o;19717:::-;19883:4;19921:2;19910:9;19906:18;19898:26;;19970:9;19964:4;19960:20;19956:1;19945:9;19941:17;19934:47;19998:131;20124:4;19998:131;:::i;:::-;19990:139;;19717:419;;;:::o;20142:::-;20308:4;20346:2;20335:9;20331:18;20323:26;;20395:9;20389:4;20385:20;20381:1;20370:9;20366:17;20359:47;20423:131;20549:4;20423:131;:::i;:::-;20415:139;;20142:419;;;:::o;20567:::-;20733:4;20771:2;20760:9;20756:18;20748:26;;20820:9;20814:4;20810:20;20806:1;20795:9;20791:17;20784:47;20848:131;20974:4;20848:131;:::i;:::-;20840:139;;20567:419;;;:::o;20992:::-;21158:4;21196:2;21185:9;21181:18;21173:26;;21245:9;21239:4;21235:20;21231:1;21220:9;21216:17;21209:47;21273:131;21399:4;21273:131;:::i;:::-;21265:139;;20992:419;;;:::o;21417:::-;21583:4;21621:2;21610:9;21606:18;21598:26;;21670:9;21664:4;21660:20;21656:1;21645:9;21641:17;21634:47;21698:131;21824:4;21698:131;:::i;:::-;21690:139;;21417:419;;;:::o;21842:::-;22008:4;22046:2;22035:9;22031:18;22023:26;;22095:9;22089:4;22085:20;22081:1;22070:9;22066:17;22059:47;22123:131;22249:4;22123:131;:::i;:::-;22115:139;;21842:419;;;:::o;22267:222::-;22360:4;22398:2;22387:9;22383:18;22375:26;;22411:71;22479:1;22468:9;22464:17;22455:6;22411:71;:::i;:::-;22267:222;;;;:::o;22495:332::-;22616:4;22654:2;22643:9;22639:18;22631:26;;22667:71;22735:1;22724:9;22720:17;22711:6;22667:71;:::i;:::-;22748:72;22816:2;22805:9;22801:18;22792:6;22748:72;:::i;:::-;22495:332;;;;;:::o;22833:218::-;22924:4;22962:2;22951:9;22947:18;22939:26;;22975:69;23041:1;23030:9;23026:17;23017:6;22975:69;:::i;:::-;22833:218;;;;:::o;23057:214::-;23146:4;23184:2;23173:9;23169:18;23161:26;;23197:67;23261:1;23250:9;23246:17;23237:6;23197:67;:::i;:::-;23057:214;;;;:::o;23277:129::-;23311:6;23338:20;;:::i;:::-;23328:30;;23367:33;23395:4;23387:6;23367:33;:::i;:::-;23277:129;;;:::o;23412:75::-;23445:6;23478:2;23472:9;23462:19;;23412:75;:::o;23493:307::-;23554:4;23644:18;23636:6;23633:30;23630:56;;;23666:18;;:::i;:::-;23630:56;23704:29;23726:6;23704:29;:::i;:::-;23696:37;;23788:4;23782;23778:15;23770:23;;23493:307;;;:::o;23806:98::-;23857:6;23891:5;23885:12;23875:22;;23806:98;;;:::o;23910:147::-;24011:11;24048:3;24033:18;;23910:147;;;;:::o;24063:169::-;24147:11;24181:6;24176:3;24169:19;24221:4;24216:3;24212:14;24197:29;;24063:169;;;;:::o;24238:305::-;24278:3;24297:20;24315:1;24297:20;:::i;:::-;24292:25;;24331:20;24349:1;24331:20;:::i;:::-;24326:25;;24485:1;24417:66;24413:74;24410:1;24407:81;24404:107;;;24491:18;;:::i;:::-;24404:107;24535:1;24532;24528:9;24521:16;;24238:305;;;;:::o;24549:185::-;24589:1;24606:20;24624:1;24606:20;:::i;:::-;24601:25;;24640:20;24658:1;24640:20;:::i;:::-;24635:25;;24679:1;24669:35;;24684:18;;:::i;:::-;24669:35;24726:1;24723;24719:9;24714:14;;24549:185;;;;:::o;24740:348::-;24780:7;24803:20;24821:1;24803:20;:::i;:::-;24798:25;;24837:20;24855:1;24837:20;:::i;:::-;24832:25;;25025:1;24957:66;24953:74;24950:1;24947:81;24942:1;24935:9;24928:17;24924:105;24921:131;;;25032:18;;:::i;:::-;24921:131;25080:1;25077;25073:9;25062:20;;24740:348;;;;:::o;25094:191::-;25134:4;25154:20;25172:1;25154:20;:::i;:::-;25149:25;;25188:20;25206:1;25188:20;:::i;:::-;25183:25;;25227:1;25224;25221:8;25218:34;;;25232:18;;:::i;:::-;25218:34;25277:1;25274;25270:9;25262:17;;25094:191;;;;:::o;25291:96::-;25328:7;25357:24;25375:5;25357:24;:::i;:::-;25346:35;;25291:96;;;:::o;25393:104::-;25438:7;25467:24;25485:5;25467:24;:::i;:::-;25456:35;;25393:104;;;:::o;25503:90::-;25537:7;25580:5;25573:13;25566:21;25555:32;;25503:90;;;:::o;25599:149::-;25635:7;25675:66;25668:5;25664:78;25653:89;;25599:149;;;:::o;25754:119::-;25814:7;25843:24;25861:5;25843:24;:::i;:::-;25832:35;;25754:119;;;:::o;25879:126::-;25916:7;25956:42;25949:5;25945:54;25934:65;;25879:126;;;:::o;26011:77::-;26048:7;26077:5;26066:16;;26011:77;;;:::o;26094:86::-;26129:7;26169:4;26162:5;26158:16;26147:27;;26094:86;;;:::o;26186:134::-;26244:9;26277:37;26308:5;26277:37;:::i;:::-;26264:50;;26186:134;;;:::o;26326:149::-;26399:9;26432:37;26463:5;26432:37;:::i;:::-;26419:50;;26326:149;;;:::o;26481:117::-;26537:9;26570:22;26586:5;26570:22;:::i;:::-;26557:35;;26481:117;;;:::o;26604:126::-;26654:9;26687:37;26718:5;26687:37;:::i;:::-;26674:50;;26604:126;;;:::o;26736:113::-;26786:9;26819:24;26837:5;26819:24;:::i;:::-;26806:37;;26736:113;;;:::o;26855:109::-;26903:9;26936:22;26952:5;26936:22;:::i;:::-;26923:35;;26855:109;;;:::o;26970:154::-;27054:6;27049:3;27044;27031:30;27116:1;27107:6;27102:3;27098:16;27091:27;26970:154;;;:::o;27130:307::-;27198:1;27208:113;27222:6;27219:1;27216:13;27208:113;;;27307:1;27302:3;27298:11;27292:18;27288:1;27283:3;27279:11;27272:39;27244:2;27241:1;27237:10;27232:15;;27208:113;;;27339:6;27336:1;27333:13;27330:101;;;27419:1;27410:6;27405:3;27401:16;27394:27;27330:101;27179:258;27130:307;;;:::o;27443:281::-;27526:27;27548:4;27526:27;:::i;:::-;27518:6;27514:40;27656:6;27644:10;27641:22;27620:18;27608:10;27605:34;27602:62;27599:88;;;27667:18;;:::i;:::-;27599:88;27707:10;27703:2;27696:22;27486:238;27443:281;;:::o;27730:180::-;27778:77;27775:1;27768:88;27875:4;27872:1;27865:15;27899:4;27896:1;27889:15;27916:180;27964:77;27961:1;27954:88;28061:4;28058:1;28051:15;28085:4;28082:1;28075:15;28102:180;28150:77;28147:1;28140:88;28247:4;28244:1;28237:15;28271:4;28268:1;28261:15;28288:117;28397:1;28394;28387:12;28411:117;28520:1;28517;28510:12;28534:117;28643:1;28640;28633:12;28657:117;28766:1;28763;28756:12;28780:102;28821:6;28872:2;28868:7;28863:2;28856:5;28852:14;28848:28;28838:38;;28780:102;;;:::o;28888:174::-;29028:26;29024:1;29016:6;29012:14;29005:50;28888:174;:::o;29068:225::-;29208:34;29204:1;29196:6;29192:14;29185:58;29277:8;29272:2;29264:6;29260:15;29253:33;29068:225;:::o;29299:167::-;29439:19;29435:1;29427:6;29423:14;29416:43;29299:167;:::o;29472:170::-;29612:22;29608:1;29600:6;29596:14;29589:46;29472:170;:::o;29648:181::-;29788:33;29784:1;29776:6;29772:14;29765:57;29648:181;:::o;29835:163::-;29975:15;29971:1;29963:6;29959:14;29952:39;29835:163;:::o;30004:233::-;30144:34;30140:1;30132:6;30128:14;30121:58;30213:16;30208:2;30200:6;30196:15;30189:41;30004:233;:::o;30243:251::-;30383:34;30379:1;30371:6;30367:14;30360:58;30452:34;30447:2;30439:6;30435:15;30428:59;30243:251;:::o;30500:182::-;30640:34;30636:1;30628:6;30624:14;30617:58;30500:182;:::o;30688:::-;30828:34;30824:1;30816:6;30812:14;30805:58;30688:182;:::o;30876:230::-;31016:34;31012:1;31004:6;31000:14;30993:58;31085:13;31080:2;31072:6;31068:15;31061:38;30876:230;:::o;31112:174::-;31252:26;31248:1;31240:6;31236:14;31229:50;31112:174;:::o;31292:181::-;31432:33;31428:1;31420:6;31416:14;31409:57;31292:181;:::o;31479:165::-;31619:17;31615:1;31607:6;31603:14;31596:41;31479:165;:::o;31650:122::-;31723:24;31741:5;31723:24;:::i;:::-;31716:5;31713:35;31703:63;;31762:1;31759;31752:12;31703:63;31650:122;:::o;31778:116::-;31848:21;31863:5;31848:21;:::i;:::-;31841:5;31838:32;31828:60;;31884:1;31881;31874:12;31828:60;31778:116;:::o;31900:168::-;31996:47;32037:5;31996:47;:::i;:::-;31989:5;31986:58;31976:86;;32058:1;32055;32048:12;31976:86;31900:168;:::o;32074:122::-;32147:24;32165:5;32147:24;:::i;:::-;32140:5;32137:35;32127:63;;32186:1;32183;32176:12;32127:63;32074:122;:::o;32202:118::-;32273:22;32289:5;32273:22;:::i;:::-;32266:5;32263:33;32253:61;;32310:1;32307;32300:12;32253:61;32202:118;:::o
Swarm Source
ipfs://e610af27a81e5c365a17276f057ef8d3b81a667519ee60b79f0ca3c7a658ce85
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.