Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18269585 | 421 days ago | IN | 0 ETH | 0.04262227 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PresaleV6
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; interface Aggregator { function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface StakingManager { function depositByPresale(address _user, uint256 _amount) external; } interface IRouter { function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) external pure returns (uint amountOut); function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) external pure returns (uint amountIn); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function getAmountsIn( uint amountOut, address[] calldata path ) external view returns (uint[] memory amounts); } contract PresaleV6 is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold; uint256 public startTime; uint256 public endTime; uint256 public claimStart; address public saleToken; uint256 public baseDecimals; uint256 public maxTokensToBuy; uint256 public currentStep; uint256[][3] public rounds; uint256 public checkPoint; uint256 public usdRaised; uint256[] public prevCheckpoints; uint256[] public remainingTokensTracker; uint256 public timeConstant; address public paymentWallet; bool public dynamicTimeFlag; bool public whitelistClaimOnly; IERC20Upgradeable public USDTInterface; Aggregator public aggregatorInterface; mapping(address => uint256) public userDeposits; mapping(address => bool) public hasClaimed; mapping(address => bool) public isBlacklisted; mapping(address => bool) public isWhitelisted; mapping(address => bool) public wertWhitelisted; address public admin; StakingManager public stakingManagerInterface; bool public stakeingWhitelistStatus; uint256 public totalBoughtAndStaked; uint256 public directTotalTokensSold; uint256 public directUsdPrice; bool public dynamicSaleState; uint256 public percent; uint256 public maxTokensToSell; IRouter public router; event SaleTimeSet(uint256 _start, uint256 _end, uint256 timestamp); event SaleTimeUpdated( bytes32 indexed key, uint256 prevValue, uint256 newValue, uint256 timestamp ); event TokensBought( address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp ); event TokensAdded( address indexed token, uint256 noOfTokens, uint256 timestamp ); event TokensClaimed( address indexed user, uint256 amount, uint256 timestamp ); event ClaimStartUpdated( uint256 prevValue, uint256 newValue, uint256 timestamp ); event MaxTokensUpdated( uint256 prevValue, uint256 newValue, uint256 timestamp ); event TokensBoughtAndStaked( address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp ); event TokensClaimedAndStaked( address indexed user, uint256 amount, uint256 timestamp ); /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} /** * @dev To pause the presale */ function pause() external onlyOwner { _pause(); } /** * @dev To unpause the presale */ function unpause() external onlyOwner { _unpause(); } /** * @dev To get latest ETH price in 10**18 format */ function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = aggregatorInterface.latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Low balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "ETH Payment failed"); } /** * @dev To claim tokens after claiming starts */ function claim() external whenNotPaused returns (bool) { require(saleToken != address(0), "Sale token not added"); require(!isBlacklisted[_msgSender()], "This Address is Blacklisted"); if (whitelistClaimOnly) { require( isWhitelisted[_msgSender()], "User not whitelisted for claim" ); } require(block.timestamp >= claimStart, "Claim has not started yet"); require(!hasClaimed[_msgSender()], "Already claimed"); hasClaimed[_msgSender()] = true; uint256 amount = userDeposits[_msgSender()]; require(amount > 0, "Nothing to claim"); delete userDeposits[_msgSender()]; bool success = IERC20Upgradeable(saleToken).transfer( _msgSender(), amount ); require(success, "Token transfer failed"); emit TokensClaimed(_msgSender(), amount, block.timestamp); return true; } function claimAndStake() external whenNotPaused returns (bool) { require(saleToken != address(0), "Sale token not added"); require(!isBlacklisted[_msgSender()], "This Address is Blacklisted"); if (stakeingWhitelistStatus) { require( isWhitelisted[_msgSender()], "User not whitelisted for stake" ); } uint256 amount = userDeposits[_msgSender()]; require(amount > 0, "Nothing to stake"); stakingManagerInterface.depositByPresale(_msgSender(), amount); delete userDeposits[_msgSender()]; emit TokensClaimedAndStaked(_msgSender(), amount, block.timestamp); return true; } /** * @dev funtion to set price for direct buy token * @param price price of token in WEI */ function setTokenPrice(uint256 price) external onlyOwner { directUsdPrice = price; } function setDynamicSaleState( bool state, address _router ) external onlyOwner { dynamicSaleState = state; router = IRouter(_router); } function fetchPrice(uint256 amountOut) public view returns (uint256) { address[] memory path = new address[](2); path[0] = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; path[1] = 0xB62E45c3Df611dcE236A6Ddc7A493d79F9DFadEf; uint256[] memory amounts = router.getAmountsIn(amountOut, path); return amounts[0] + ((amounts[0] * percent) / 100); } function setPercent(uint256 _percent) external onlyOwner { percent = _percent; } function setMaxTokensToSell(uint256 _maxTokensToSell) external onlyOwner { maxTokensToSell = _maxTokensToSell; } function buyWithEthDynamic( uint256 amount ) external payable whenNotPaused nonReentrant returns (bool) { require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; sendValue(payable(paymentWallet), ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); stakingManagerInterface.depositByPresale( _msgSender(), amount * baseDecimals ); emit TokensBought( _msgSender(), amount, address(0), ethAmount, 0, block.timestamp ); return true; } function buyWithEth( uint256 amount ) external payable whenNotPaused nonReentrant returns (bool) { require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; sendValue(payable(paymentWallet), ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); bool success = IERC20Upgradeable(saleToken).transfer(_msgSender(), (amount * baseDecimals)); require(success, "Token transfer failed"); emit TokensBought( _msgSender(), amount, address(0), ethAmount, 0, block.timestamp ); return true; } function buyWithEthWertDynamic( address user, uint256 amount ) external payable whenNotPaused nonReentrant returns (bool) { require( wertWhitelisted[_msgSender()], "Caller not whitelisted for wert" ); require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; sendValue(payable(paymentWallet), ethAmount); if (excess > 0) sendValue(payable(user), excess); stakingManagerInterface.depositByPresale(user, amount * baseDecimals); emit TokensBought( user, amount, address(0), ethAmount, 0, block.timestamp ); return true; } function buyWithEthWert( address user, uint256 amount ) external payable whenNotPaused nonReentrant returns (bool) { require( wertWhitelisted[_msgSender()], "Caller not whitelisted for wert" ); require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); require(msg.value >= ethAmount, "Less payment"); uint256 excess = msg.value - ethAmount; sendValue(payable(paymentWallet), ethAmount); if (excess > 0) sendValue(payable(user), excess); bool success = IERC20Upgradeable(saleToken).transfer(user, (amount * baseDecimals)); require(success, "Token transfer failed"); emit TokensBought( user, amount, address(0), ethAmount, 0, block.timestamp ); return true; } function buyWithUSDTDynamic( uint256 amount ) external whenNotPaused returns (bool) { require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); uint256 usdPrice = (ethAmount * getLatestPrice()) / baseDecimals; uint256 price = usdPrice / (10 ** 12); (bool success, ) = address(USDTInterface).call( abi.encodeWithSignature( "transferFrom(address,address,uint256)", _msgSender(), paymentWallet, price ) ); require(success, "Token payment failed"); stakingManagerInterface.depositByPresale( _msgSender(), amount * baseDecimals ); emit TokensBought( _msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp ); return true; } function buyWithUSDT( uint256 amount ) external whenNotPaused returns (bool) { require(dynamicSaleState, "dynamic sale not active"); require( amount <= maxTokensToSell - directTotalTokensSold, "amount exceeds max tokens to be sold" ); directTotalTokensSold += amount; uint256 ethAmount = fetchPrice(amount * baseDecimals); uint256 usdPrice = (ethAmount * getLatestPrice()) / baseDecimals; uint256 price = usdPrice / (10 ** 12); (bool success, ) = address(USDTInterface).call( abi.encodeWithSignature( "transferFrom(address,address,uint256)", _msgSender(), paymentWallet, price ) ); require(success, "Token payment failed"); success = IERC20Upgradeable(saleToken).transfer(_msgSender(), (amount * baseDecimals)); require(success, "Token transfer failed"); emit TokensBought( _msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp ); return true; } /** * @dev Helper funtion to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) external view returns (uint256) { uint256 usdPrice = amount * directUsdPrice; uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); return (ethAmount); } /** * @dev To add wert contract addresses to whitelist * @param _addressesToWhitelist addresses of the contract */ function whitelistUsersForWERT( address[] calldata _addressesToWhitelist ) external onlyOwner { for (uint256 i = 0; i < _addressesToWhitelist.length; i++) { wertWhitelisted[_addressesToWhitelist[i]] = true; } } /** * @dev To remove wert contract addresses to whitelist * @param _addressesToRemoveFromWhitelist addresses of the contracts */ function removeFromWhitelistForWERT( address[] calldata _addressesToRemoveFromWhitelist ) external onlyOwner { for (uint256 i = 0; i < _addressesToRemoveFromWhitelist.length; i++) { wertWhitelisted[_addressesToRemoveFromWhitelist[i]] = false; } } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _usersToBlacklist addresses of the users */ function blacklistUsers( address[] calldata _usersToBlacklist ) external onlyOwner { for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = true; } } /** * @dev To remove users from blacklist which restricts blacklisted users from claiming * @param _userToRemoveFromBlacklist addresses of the users */ function removeFromBlacklist( address[] calldata _userToRemoveFromBlacklist ) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromBlacklist.length; i++) { isBlacklisted[_userToRemoveFromBlacklist[i]] = false; } } /** * @dev To add users to whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _usersToWhitelist addresses of the users */ function whitelistUsers( address[] calldata _usersToWhitelist ) external onlyOwner { for (uint256 i = 0; i < _usersToWhitelist.length; i++) { isWhitelisted[_usersToWhitelist[i]] = true; } } /** * @dev To remove users from whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _userToRemoveFromWhitelist addresses of the users */ function removeFromWhitelist( address[] calldata _userToRemoveFromWhitelist ) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromWhitelist.length; i++) { isWhitelisted[_userToRemoveFromWhitelist[i]] = false; } } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setClaimWhitelistStatus(bool _status) external onlyOwner { whitelistClaimOnly = _status; } /** * @dev To set payment wallet address * @param _newPaymentWallet new payment wallet address */ function changePaymentWallet(address _newPaymentWallet) external onlyOwner { require(_newPaymentWallet != address(0), "address cannot be zero"); paymentWallet = _newPaymentWallet; } /** * @dev To get array of round details at once * @param _no array index */ function roundDetails( uint256 _no ) external view returns (uint256[] memory) { return rounds[_no]; } /** * @dev to update userDeposits for purchases made on BSC * @param _users array of users * @param _userDeposits array of userDeposits associated with users */ function updateFromBSC( address[] calldata _users, uint256[] calldata _userDeposits ) external onlyOwner { require(_users.length == _userDeposits.length, "Length mismatch"); for (uint256 i = 0; i < _users.length; i++) { userDeposits[_users[i]] += _userDeposits[i]; } } /** * @dev to initialize staking manager with new addredd * @param _stakingManagerAddress address of the staking smartcontract */ function setStakingManager( address _stakingManagerAddress ) external onlyOwner { require( _stakingManagerAddress != address(0), "staking manager cannot be inatialized with zero address" ); stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20Upgradeable(saleToken).approve( _stakingManagerAddress, type(uint256).max ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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] * ```solidity * 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. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ 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. * * 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. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * 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. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ 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. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MaxTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBoughtAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimedAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"USDTInterface","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorInterface","outputs":[{"internalType":"contract Aggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToBlacklist","type":"address[]"}],"name":"blacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithEthDynamic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithEthWert","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithEthWertDynamic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithUSDT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithUSDTDynamic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentWallet","type":"address"}],"name":"changePaymentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"directTotalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"directUsdPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTimeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ethBuyHelper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"fetchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensToSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prevCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"remainingTokensTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromBlacklist","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelistForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_no","type":"uint256"}],"name":"roundDetails","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setClaimWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"},{"internalType":"address","name":"_router","type":"address"}],"name":"setDynamicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensToSell","type":"uint256"}],"name":"setMaxTokensToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingManagerAddress","type":"address"}],"name":"setStakingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeingWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingManagerInterface","outputs":[{"internalType":"contract StakingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBoughtAndStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_userDeposits","type":"uint256[]"}],"name":"updateFromBSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wertWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistClaimOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToWhitelist","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToWhitelist","type":"address[]"}],"name":"whitelistUsersForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060008060019054906101000a900460ff16159050808015620000445750600160008054906101000a900460ff1660ff16105b8062000080575062000061306200016360201b62003c9c1760201c565b1580156200007f5750600160008054906101000a900460ff1660ff16145b5b620000c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000b9906200020d565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801562000100576001600060016101000a81548160ff0219169083151502179055505b80156200015c5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405162000153919062000289565b60405180910390a15b50620002a6565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000620001f5602e8362000186565b9150620002028262000197565b604082019050919050565b600060208201905081810360008301526200022881620001e6565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000620002716200026b62000265846200022f565b62000246565b62000239565b9050919050565b620002838162000250565b82525050565b6000602082019050620002a0600083018462000278565b92915050565b615a9680620002b66000396000f3fe6080604052600436106103d95760003560e01c80638456cb59116101fd578063dad80e8611610118578063f04d688f116100ab578063f851a4401161007a578063f851a44014610eac578063f887ea4014610ed7578063fb9a4acd14610f02578063fe4cf22e14610f2b578063fe575a8714610f5b576103d9565b8063f04d688f14610e04578063f2fde38b14610e2f578063f446374314610e58578063f597573f14610e81576103d9565b8063e985e367116100e7578063e985e36714610d55578063eadd94ec14610d80578063eb9d4ef714610dab578063edec5f2714610ddb576103d9565b8063dad80e8614610c85578063e19648db14610cb0578063e32204dd14610ced578063e6da921314610d18576103d9565b8063ba166a3911610190578063cad005561161015f578063cad0055614610bdd578063cb1a4fc014610c06578063cff805ab14610c31578063d76abb9d14610c5c576103d9565b8063ba166a3914610b0f578063bb3d676a14610b4c578063c23326f314610b75578063c49cc64514610bb2576103d9565b80639cfa0f7c116101cc5780639cfa0f7c14610a4e578063a7c6016014610a79578063b0068efb14610ab6578063b00bba6a14610ae6576103d9565b80638456cb59146109b857806389daf799146109cf5780638da5cb5b146109f85780638e15f47314610a23576103d9565b80634e00ed50116102f857806363b201171161028b5780637154b8b51161025a5780637154b8b5146108cc57806373b2e80e146108f55780637649b9571461093257806378e97925146109625780637f6fb2531461098d576103d9565b806363b20117146108365780636a61e5fc1461086157806370ba11131461088a578063715018a6146108b5576103d9565b80635a03d679116102c75780635a03d679146107785780635bc34f71146107a35780635c975abb146107ce5780635df4f353146107f9576103d9565b80634e00ed50146106ce5780634e71d92d146106f957806353d9920714610724578063548db1741461074f576103d9565b806329a5a0b6116103705780633af32abf1161033f5780633af32abf146106245780633dd31df2146106615780633f4ba83a1461068c57806343568eae146106a3576103d9565b806329a5a0b6146105665780633197cbb6146105a357806333f76178146105ce57806338646608146105f9576103d9565b80631c3b7df9116103ac5780631c3b7df9146104ac5780631ddc6091146104e95780631fa2bc921461051257806328de18591461053d576103d9565b806303b9c5ad146103de5780630ba36dcd146104075780631199193d146104445780631559f7821461046f575b600080fd5b3480156103ea57600080fd5b506104056004803603810190610400919061412a565b610f98565b005b34801561041357600080fd5b5061042e600480360381019061042991906141d5565b611045565b60405161043b919061421b565b60405180910390f35b34801561045057600080fd5b5061045961105d565b604051610466919061421b565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614262565b611063565b6040516104a3919061421b565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190614262565b611292565b6040516104e091906142aa565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906142f1565b611675565b005b34801561051e57600080fd5b5061052761169a565b60405161053491906142aa565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f919061431e565b6116ad565b005b34801561057257600080fd5b5061058d60048036038101906105889190614262565b611714565b60405161059a919061421b565b60405180910390f35b3480156105af57600080fd5b506105b8611755565b6040516105c5919061421b565b60405180910390f35b3480156105da57600080fd5b506105e361175b565b6040516105f0919061421b565b60405180910390f35b34801561060557600080fd5b5061060e611761565b60405161061b91906143bd565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906141d5565b611787565b60405161065891906142aa565b60405180910390f35b34801561066d57600080fd5b506106766117a7565b60405161068391906142aa565b60405180910390f35b34801561069857600080fd5b506106a16117ba565b005b3480156106af57600080fd5b506106b86117cc565b6040516106c5919061421b565b60405180910390f35b3480156106da57600080fd5b506106e36117d2565b6040516106f0919061421b565b60405180910390f35b34801561070557600080fd5b5061070e6117d8565b60405161071b91906142aa565b60405180910390f35b34801561073057600080fd5b50610739611d1b565b60405161074691906142aa565b60405180910390f35b34801561075b57600080fd5b506107766004803603810190610771919061412a565b611d2e565b005b34801561078457600080fd5b5061078d611ddb565b60405161079a919061421b565b60405180910390f35b3480156107af57600080fd5b506107b8611de1565b6040516107c5919061421b565b60405180910390f35b3480156107da57600080fd5b506107e3611de7565b6040516107f091906142aa565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906141d5565b611dfe565b60405161082d91906142aa565b60405180910390f35b34801561084257600080fd5b5061084b611e1e565b604051610858919061421b565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190614262565b611e24565b005b34801561089657600080fd5b5061089f611e36565b6040516108ac919061421b565b60405180910390f35b3480156108c157600080fd5b506108ca611e3c565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190614262565b611e50565b005b34801561090157600080fd5b5061091c600480360381019061091791906141d5565b611e62565b60405161092991906142aa565b60405180910390f35b61094c60048036038101906109479190614262565b611e82565b60405161095991906142aa565b60405180910390f35b34801561096e57600080fd5b50610977612190565b604051610984919061421b565b60405180910390f35b34801561099957600080fd5b506109a2612196565b6040516109af919061421b565b60405180910390f35b3480156109c457600080fd5b506109cd61219c565b005b3480156109db57600080fd5b506109f660048036038101906109f1919061412a565b6121ae565b005b348015610a0457600080fd5b50610a0d61225b565b604051610a1a91906143e7565b60405180910390f35b348015610a2f57600080fd5b50610a38612285565b604051610a45919061421b565b60405180910390f35b348015610a5a57600080fd5b50610a63612348565b604051610a70919061421b565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b9190614262565b61234e565b604051610aad91906142aa565b60405180910390f35b610ad06004803603810190610acb9190614402565b612793565b604051610add91906142aa565b60405180910390f35b348015610af257600080fd5b50610b0d6004803603810190610b0891906141d5565b612abb565b005b348015610b1b57600080fd5b50610b366004803603810190610b319190614262565b612c47565b604051610b439190614500565b60405180910390f35b348015610b5857600080fd5b50610b736004803603810190610b6e919061412a565b612cb4565b005b348015610b8157600080fd5b50610b9c6004803603810190610b979190614262565b612d61565b604051610ba9919061421b565b60405180910390f35b348015610bbe57600080fd5b50610bc7612d85565b604051610bd49190614543565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff91906141d5565b612dab565b005b348015610c1257600080fd5b50610c1b612e67565b604051610c2891906142aa565b60405180910390f35b348015610c3d57600080fd5b50610c4661320d565b604051610c53919061421b565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e9190614262565b613213565b005b348015610c9157600080fd5b50610c9a613225565b604051610ca791906142aa565b60405180910390f35b348015610cbc57600080fd5b50610cd76004803603810190610cd29190614262565b613238565b604051610ce4919061421b565b60405180910390f35b348015610cf957600080fd5b50610d0261325c565b604051610d0f91906143e7565b60405180910390f35b348015610d2457600080fd5b50610d3f6004803603810190610d3a919061455e565b613282565b604051610d4c919061421b565b60405180910390f35b348015610d6157600080fd5b50610d6a6132b6565b604051610d7791906143e7565b60405180910390f35b348015610d8c57600080fd5b50610d956132dc565b604051610da2919061421b565b60405180910390f35b610dc56004803603810190610dc09190614402565b6132e2565b604051610dd291906142aa565b60405180910390f35b348015610de757600080fd5b50610e026004803603810190610dfd919061412a565b61366f565b005b348015610e1057600080fd5b50610e1961371c565b604051610e26919061421b565b60405180910390f35b348015610e3b57600080fd5b50610e566004803603810190610e5191906141d5565b613722565b005b348015610e6457600080fd5b50610e7f6004803603810190610e7a919061412a565b6137a6565b005b348015610e8d57600080fd5b50610e96613853565b604051610ea391906145bf565b60405180910390f35b348015610eb857600080fd5b50610ec1613879565b604051610ece91906143e7565b60405180910390f35b348015610ee357600080fd5b50610eec61389f565b604051610ef991906145fb565b60405180910390f35b348015610f0e57600080fd5b50610f296004803603810190610f24919061466c565b6138c5565b005b610f456004803603810190610f409190614262565b6139d3565b604051610f5291906142aa565b60405180910390f35b348015610f6757600080fd5b50610f826004803603810190610f7d91906141d5565b613c7c565b604051610f8f91906142aa565b60405180910390f35b610fa0613cbf565b60005b8282905081101561104057600160e06000858585818110610fc757610fc66146ed565b5b9050602002016020810190610fdc91906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110389061474b565b915050610fa3565b505050565b60dc6020528060005260406000206000915090505481565b60e45481565b600080600267ffffffffffffffff81111561108157611080614794565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b50905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106110db576110da6146ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b62e45c3df611dce236a6ddc7a493d79f9dfadef8160018151811061113e5761113d6146ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600060e960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7485846040518363ffffffff1660e01b81526004016111d7929190614881565b60006040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061122c91906149e6565b9050606460e75482600081518110611247576112466146ed565b5b60200260200101516112599190614a2f565b6112639190614ab8565b81600081518110611277576112766146ed565b5b60200260200101516112899190614ae9565b92505050919050565b600061129c613d3d565b60e660009054906101000a900460ff166112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290614b9c565b60405180910390fd5b60e45460e8546112fb9190614bbc565b82111561133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490614c62565b60405180910390fd5b8160e4600082825461134f9190614ae9565b92505081905550600061136e60ce54846113699190614a2f565b611063565b9050600060ce5461137d612285565b836113889190614a2f565b6113929190614ab8565b9050600064e8d4a51000826113a79190614ab8565b9050600060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166113ec613d87565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460405160240161142293929190614c82565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516114ac9190614d33565b6000604051808303816000865af19150503d80600081146114e9576040519150601f19603f3d011682016040523d82523d6000602084013e6114ee565b606091505b5050905080611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614d96565b60405180910390fd5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966611578613d87565b60ce54896115869190614a2f565b6040518363ffffffff1660e01b81526004016115a3929190614db6565b600060405180830381600087803b1580156115bd57600080fd5b505af11580156115d1573d6000803e3d6000fd5b5050505060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686611617613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685874260405161166093929190614ddf565b60405180910390a46001945050505050919050565b61167d613cbf565b8060d960156101000a81548160ff02191690831515021790555050565b60d960149054906101000a900460ff1681565b6116b5613cbf565b8160e660006101000a81548160ff0219169083151502179055508060e960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060e554836117259190614a2f565b90506000611731612285565b60ce548361173f9190614a2f565b6117499190614ab8565b90508092505050919050565b60cb5481565b60ce5481565b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60df6020528060005260406000206000915054906101000a900460ff1681565b60e660009054906101000a900460ff1681565b6117c2613cbf565b6117ca613d8f565b565b60d85481565b60e55481565b60006117e2613d3d565b600073ffffffffffffffffffffffffffffffffffffffff1660cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614e62565b60405180910390fd5b60de6000611880613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614ece565b60405180910390fd5b60d960159054906101000a900460ff16156119b15760df6000611929613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790614f3a565b60405180910390fd5b5b60cc544210156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90614fa6565b60405180910390fd5b60dd6000611a02613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190615012565b60405180910390fd5b600160dd6000611a98613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060dc6000611af7613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e9061507e565b60405180910390fd5b60dc6000611b83613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c09613d87565b846040518363ffffffff1660e01b8152600401611c27929190614db6565b602060405180830381600087803b158015611c4157600080fd5b505af1158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906150b3565b905080611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb29061512c565b60405180910390fd5b611cc3613d87565b73ffffffffffffffffffffffffffffffffffffffff167f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b8342604051611d0a92919061514c565b60405180910390a260019250505090565b60d960159054906101000a900460ff1681565b611d36613cbf565b60005b82829050811015611dd657600060df6000858585818110611d5d57611d5c6146ed565b5b9050602002016020810190611d7291906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611dce9061474b565b915050611d39565b505050565b60e85481565b60d05481565b6000609760009054906101000a900460ff16905090565b60e06020528060005260406000206000915054906101000a900460ff1681565b60c95481565b611e2c613cbf565b8060e58190555050565b60e75481565b611e44613cbf565b611e4e6000613df2565b565b611e58613cbf565b8060e78190555050565b60dd6020528060005260406000206000915054906101000a900460ff1681565b6000611e8c613d3d565b611e94613eb8565b60e660009054906101000a900460ff16611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90614b9c565b60405180910390fd5b60e45460e854611ef39190614bbc565b821115611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90614c62565b60405180910390fd5b8160e46000828254611f479190614ae9565b925050819055506000611f6660ce5484611f619190614a2f565b611063565b905080341015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa2906151c1565b60405180910390fd5b60008134611fb99190614bbc565b9050611fe760d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b600081111561200257612001611ffb613d87565b82613f08565b5b600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61204a613d87565b60ce54886120589190614a2f565b6040518363ffffffff1660e01b8152600401612075929190614db6565b602060405180830381600087803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c791906150b3565b905080612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061512c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168561212a613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36866000426040516121749392919061521c565b60405180910390a46001935050505061218b613ffc565b919050565b60ca5481565b60e35481565b6121a4613cbf565b6121ac614005565b565b6121b6613cbf565b60005b8282905081101561225657600060de60008585858181106121dd576121dc6146ed565b5b90506020020160208101906121f291906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061224e9061474b565b9150506121b9565b505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156122f057600080fd5b505afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232891906152cb565b5050509150506402540be4008161233f9190615346565b90508091505090565b60cf5481565b6000612358613d3d565b60e660009054906101000a900460ff166123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e90614b9c565b60405180910390fd5b60e45460e8546123b79190614bbc565b8211156123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614c62565b60405180910390fd5b8160e4600082825461240b9190614ae9565b92505081905550600061242a60ce54846124259190614a2f565b611063565b9050600060ce54612439612285565b836124449190614a2f565b61244e9190614ab8565b9050600064e8d4a51000826124639190614ab8565b9050600060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124a8613d87565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516024016124de93929190614c82565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125689190614d33565b6000604051808303816000865af19150503d80600081146125a5576040519150601f19603f3d011682016040523d82523d6000602084013e6125aa565b606091505b50509050806125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590614d96565b60405180910390fd5b60cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612634613d87565b60ce54896126429190614a2f565b6040518363ffffffff1660e01b815260040161265f929190614db6565b602060405180830381600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906150b3565b9050806126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea9061512c565b60405180910390fd5b60da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686612735613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685874260405161277e93929190614ddf565b60405180910390a46001945050505050919050565b600061279d613d3d565b6127a5613eb8565b60e060006127b1613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282f906154a9565b60405180910390fd5b60e660009054906101000a900460ff16612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90614b9c565b60405180910390fd5b60e45460e8546128979190614bbc565b8211156128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d090614c62565b60405180910390fd5b8160e460008282546128eb9190614ae9565b92505081905550600061290a60ce54846129059190614a2f565b611063565b90508034101561294f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612946906151c1565b60405180910390fd5b6000813461295d9190614bbc565b905061298b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b600081111561299f5761299e8582613f08565b5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c619668660ce54876129ec9190614a2f565b6040518363ffffffff1660e01b8152600401612a09929190614db6565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff16848673ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685600042604051612a9f9392919061521c565b60405180910390a4600192505050612ab5613ffc565b92915050565b612ac3613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a9061553b565b60405180910390fd5b8060e260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612bf1929190614db6565b602060405180830381600087803b158015612c0b57600080fd5b505af1158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4391906150b3565b5050565b606060d18260038110612c5d57612c5c6146ed565b5b01805480602002602001604051908101604052809291908181526020018280548015612ca857602002820191906000526020600020905b815481526020019060010190808311612c94575b50505050509050919050565b612cbc613cbf565b60005b82829050811015612d5c57600160de6000858585818110612ce357612ce26146ed565b5b9050602002016020810190612cf891906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612d549061474b565b915050612cbf565b505050565b60d78181548110612d7157600080fd5b906000526020600020016000915090505481565b60db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612db3613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a906155a7565b60405180910390fd5b8060d960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612e71613d3d565b600073ffffffffffffffffffffffffffffffffffffffff1660cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90614e62565b60405180910390fd5b60de6000612f0f613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614ece565b60405180910390fd5b60e260149054906101000a900460ff16156130405760df6000612fb8613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690615613565b60405180910390fd5b5b600060dc600061304e613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116130ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c59061567f565b60405180910390fd5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966613114613d87565b836040518363ffffffff1660e01b8152600401613132929190614db6565b600060405180830381600087803b15801561314c57600080fd5b505af1158015613160573d6000803e3d6000fd5b5050505060dc6000613170613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090556131b6613d87565b73ffffffffffffffffffffffffffffffffffffffff167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b82426040516131fd92919061514c565b60405180910390a2600191505090565b60d45481565b61321b613cbf565b8060e88190555050565b60e260149054906101000a900460ff1681565b60d6818154811061324857600080fd5b906000526020600020016000915090505481565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60d1826003811061329257600080fd5b0181815481106132a157600080fd5b90600052602060002001600091509150505481565b60cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60d55481565b60006132ec613d3d565b6132f4613eb8565b60e06000613300613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337e906154a9565b60405180910390fd5b60e660009054906101000a900460ff166133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd90614b9c565b60405180910390fd5b60e45460e8546133e69190614bbc565b821115613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f90614c62565b60405180910390fd5b8160e4600082825461343a9190614ae9565b92505081905550600061345960ce54846134549190614a2f565b611063565b90508034101561349e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613495906151c1565b60405180910390fd5b600081346134ac9190614bbc565b90506134da60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b60008111156134ee576134ed8582613f08565b5b600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8760ce548861353d9190614a2f565b6040518363ffffffff1660e01b815260040161355a929190614db6565b602060405180830381600087803b15801561357457600080fd5b505af1158015613588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ac91906150b3565b9050806135ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e59061512c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16858773ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36866000426040516136529392919061521c565b60405180910390a460019350505050613669613ffc565b92915050565b613677613cbf565b60005b8282905081101561371757600160df600085858581811061369e5761369d6146ed565b5b90506020020160208101906136b391906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061370f9061474b565b91505061367a565b505050565b60cc5481565b61372a613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561379a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379190615711565b60405180910390fd5b6137a381613df2565b50565b6137ae613cbf565b60005b8282905081101561384e57600060e060008585858181106137d5576137d46146ed565b5b90506020020160208101906137ea91906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806138469061474b565b9150506137b1565b505050565b60da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60e160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60e960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6138cd613cbf565b818190508484905014613915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390c9061577d565b60405180910390fd5b60005b848490508110156139cc57828282818110613936576139356146ed565b5b9050602002013560dc6000878785818110613954576139536146ed565b5b905060200201602081019061396991906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139b29190614ae9565b9250508190555080806139c49061474b565b915050613918565b5050505050565b60006139dd613d3d565b6139e5613eb8565b60e660009054906101000a900460ff16613a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2b90614b9c565b60405180910390fd5b60e45460e854613a449190614bbc565b821115613a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7d90614c62565b60405180910390fd5b8160e46000828254613a989190614ae9565b925050819055506000613ab760ce5484613ab29190614a2f565b611063565b905080341015613afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af3906151c1565b60405180910390fd5b60008134613b0a9190614bbc565b9050613b3860d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b6000811115613b5357613b52613b4c613d87565b82613f08565b5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966613b99613d87565b60ce5487613ba79190614a2f565b6040518363ffffffff1660e01b8152600401613bc4929190614db6565b600060405180830381600087803b158015613bde57600080fd5b505af1158015613bf2573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff1684613c17613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685600042604051613c619392919061521c565b60405180910390a4600192505050613c77613ffc565b919050565b60de6020528060005260406000206000915054906101000a900460ff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b613cc7613d87565b73ffffffffffffffffffffffffffffffffffffffff16613ce561225b565b73ffffffffffffffffffffffffffffffffffffffff1614613d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d32906157e9565b60405180910390fd5b565b613d45611de7565b15613d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7c90615855565b60405180910390fd5b565b600033905090565b613d97614068565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613ddb613d87565b604051613de891906143e7565b60405180910390a1565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415613efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ef5906158c1565b60405180910390fd5b6002600181905550565b80471015613f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f429061592d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051613f7190615973565b60006040518083038185875af1925050503d8060008114613fae576040519150601f19603f3d011682016040523d82523d6000602084013e613fb3565b606091505b5050905080613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee906159d4565b60405180910390fd5b505050565b60018081905550565b61400d613d3d565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614051613d87565b60405161405e91906143e7565b60405180910390a1565b614070611de7565b6140af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140a690615a40565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126140ea576140e96140c5565b5b8235905067ffffffffffffffff811115614107576141066140ca565b5b602083019150836020820283011115614123576141226140cf565b5b9250929050565b60008060208385031215614141576141406140bb565b5b600083013567ffffffffffffffff81111561415f5761415e6140c0565b5b61416b858286016140d4565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141a282614177565b9050919050565b6141b281614197565b81146141bd57600080fd5b50565b6000813590506141cf816141a9565b92915050565b6000602082840312156141eb576141ea6140bb565b5b60006141f9848285016141c0565b91505092915050565b6000819050919050565b61421581614202565b82525050565b6000602082019050614230600083018461420c565b92915050565b61423f81614202565b811461424a57600080fd5b50565b60008135905061425c81614236565b92915050565b600060208284031215614278576142776140bb565b5b60006142868482850161424d565b91505092915050565b60008115159050919050565b6142a48161428f565b82525050565b60006020820190506142bf600083018461429b565b92915050565b6142ce8161428f565b81146142d957600080fd5b50565b6000813590506142eb816142c5565b92915050565b600060208284031215614307576143066140bb565b5b6000614315848285016142dc565b91505092915050565b60008060408385031215614335576143346140bb565b5b6000614343858286016142dc565b9250506020614354858286016141c0565b9150509250929050565b6000819050919050565b600061438361437e61437984614177565b61435e565b614177565b9050919050565b600061439582614368565b9050919050565b60006143a78261438a565b9050919050565b6143b78161439c565b82525050565b60006020820190506143d260008301846143ae565b92915050565b6143e181614197565b82525050565b60006020820190506143fc60008301846143d8565b92915050565b60008060408385031215614419576144186140bb565b5b6000614427858286016141c0565b92505060206144388582860161424d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61447781614202565b82525050565b6000614489838361446e565b60208301905092915050565b6000602082019050919050565b60006144ad82614442565b6144b7818561444d565b93506144c28361445e565b8060005b838110156144f35781516144da888261447d565b97506144e583614495565b9250506001810190506144c6565b5085935050505092915050565b6000602082019050818103600083015261451a81846144a2565b905092915050565b600061452d8261438a565b9050919050565b61453d81614522565b82525050565b60006020820190506145586000830184614534565b92915050565b60008060408385031215614575576145746140bb565b5b60006145838582860161424d565b92505060206145948582860161424d565b9150509250929050565b60006145a98261438a565b9050919050565b6145b98161459e565b82525050565b60006020820190506145d460008301846145b0565b92915050565b60006145e58261438a565b9050919050565b6145f5816145da565b82525050565b600060208201905061461060008301846145ec565b92915050565b60008083601f84011261462c5761462b6140c5565b5b8235905067ffffffffffffffff811115614649576146486140ca565b5b602083019150836020820283011115614665576146646140cf565b5b9250929050565b60008060008060408587031215614686576146856140bb565b5b600085013567ffffffffffffffff8111156146a4576146a36140c0565b5b6146b0878288016140d4565b9450945050602085013567ffffffffffffffff8111156146d3576146d26140c0565b5b6146df87828801614616565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475682614202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147895761478861471c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147f881614197565b82525050565b600061480a83836147ef565b60208301905092915050565b6000602082019050919050565b600061482e826147c3565b61483881856147ce565b9350614843836147df565b8060005b8381101561487457815161485b88826147fe565b975061486683614816565b925050600181019050614847565b5085935050505092915050565b6000604082019050614896600083018561420c565b81810360208301526148a88184614823565b90509392505050565b6000601f19601f8301169050919050565b6148cb826148b1565b810181811067ffffffffffffffff821117156148ea576148e9614794565b5b80604052505050565b60006148fd6140b1565b905061490982826148c2565b919050565b600067ffffffffffffffff82111561492957614928614794565b5b602082029050602081019050919050565b60008151905061494981614236565b92915050565b600061496261495d8461490e565b6148f3565b90508083825260208201905060208402830185811115614985576149846140cf565b5b835b818110156149ae578061499a888261493a565b845260208401935050602081019050614987565b5050509392505050565b600082601f8301126149cd576149cc6140c5565b5b81516149dd84826020860161494f565b91505092915050565b6000602082840312156149fc576149fb6140bb565b5b600082015167ffffffffffffffff811115614a1a57614a196140c0565b5b614a26848285016149b8565b91505092915050565b6000614a3a82614202565b9150614a4583614202565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7e57614a7d61471c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac382614202565b9150614ace83614202565b925082614ade57614add614a89565b5b828204905092915050565b6000614af482614202565b9150614aff83614202565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3457614b3361471c565b5b828201905092915050565b600082825260208201905092915050565b7f64796e616d69632073616c65206e6f7420616374697665000000000000000000600082015250565b6000614b86601783614b3f565b9150614b9182614b50565b602082019050919050565b60006020820190508181036000830152614bb581614b79565b9050919050565b6000614bc782614202565b9150614bd283614202565b925082821015614be557614be461471c565b5b828203905092915050565b7f616d6f756e742065786365656473206d617820746f6b656e7320746f2062652060008201527f736f6c6400000000000000000000000000000000000000000000000000000000602082015250565b6000614c4c602483614b3f565b9150614c5782614bf0565b604082019050919050565b60006020820190508181036000830152614c7b81614c3f565b9050919050565b6000606082019050614c9760008301866143d8565b614ca460208301856143d8565b614cb1604083018461420c565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015614ced578082015181840152602081019050614cd2565b83811115614cfc576000848401525b50505050565b6000614d0d82614cb9565b614d178185614cc4565b9350614d27818560208601614ccf565b80840191505092915050565b6000614d3f8284614d02565b915081905092915050565b7f546f6b656e207061796d656e74206661696c6564000000000000000000000000600082015250565b6000614d80601483614b3f565b9150614d8b82614d4a565b602082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b6000604082019050614dcb60008301856143d8565b614dd8602083018461420c565b9392505050565b6000606082019050614df4600083018661420c565b614e01602083018561420c565b614e0e604083018461420c565b949350505050565b7f53616c6520746f6b656e206e6f74206164646564000000000000000000000000600082015250565b6000614e4c601483614b3f565b9150614e5782614e16565b602082019050919050565b60006020820190508181036000830152614e7b81614e3f565b9050919050565b7f54686973204164647265737320697320426c61636b6c69737465640000000000600082015250565b6000614eb8601b83614b3f565b9150614ec382614e82565b602082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b7f55736572206e6f742077686974656c697374656420666f7220636c61696d0000600082015250565b6000614f24601e83614b3f565b9150614f2f82614eee565b602082019050919050565b60006020820190508181036000830152614f5381614f17565b9050919050565b7f436c61696d20686173206e6f7420737461727465642079657400000000000000600082015250565b6000614f90601983614b3f565b9150614f9b82614f5a565b602082019050919050565b60006020820190508181036000830152614fbf81614f83565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614ffc600f83614b3f565b915061500782614fc6565b602082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000615068601083614b3f565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b6000815190506150ad816142c5565b92915050565b6000602082840312156150c9576150c86140bb565b5b60006150d78482850161509e565b91505092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b6000615116601583614b3f565b9150615121826150e0565b602082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b6000604082019050615161600083018561420c565b61516e602083018461420c565b9392505050565b7f4c657373207061796d656e740000000000000000000000000000000000000000600082015250565b60006151ab600c83614b3f565b91506151b682615175565b602082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b6000819050919050565b60006152066152016151fc846151e1565b61435e565b614202565b9050919050565b615216816151eb565b82525050565b6000606082019050615231600083018661420c565b61523e602083018561520d565b61524b604083018461420c565b949350505050565b600069ffffffffffffffffffff82169050919050565b61527281615253565b811461527d57600080fd5b50565b60008151905061528f81615269565b92915050565b6000819050919050565b6152a881615295565b81146152b357600080fd5b50565b6000815190506152c58161529f565b92915050565b600080600080600060a086880312156152e7576152e66140bb565b5b60006152f588828901615280565b9550506020615306888289016152b6565b94505060406153178882890161493a565b93505060606153288882890161493a565b925050608061533988828901615280565b9150509295509295909350565b600061535182615295565b915061535c83615295565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561539b5761539a61471c565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156153d8576153d761471c565b5b827f800000000000000000000000000000000000000000000000000000000000000005821260008413600084121616156154155761541461471c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156154525761545161471c565b5b828202905092915050565b7f43616c6c6572206e6f742077686974656c697374656420666f72207765727400600082015250565b6000615493601f83614b3f565b915061549e8261545d565b602082019050919050565b600060208201905081810360008301526154c281615486565b9050919050565b7f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160008201527f6c697a65642077697468207a65726f2061646472657373000000000000000000602082015250565b6000615525603783614b3f565b9150615530826154c9565b604082019050919050565b6000602082019050818103600083015261555481615518565b9050919050565b7f616464726573732063616e6e6f74206265207a65726f00000000000000000000600082015250565b6000615591601683614b3f565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b7f55736572206e6f742077686974656c697374656420666f72207374616b650000600082015250565b60006155fd601e83614b3f565b9150615608826155c7565b602082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000615669601083614b3f565b915061567482615633565b602082019050919050565b600060208201905081810360008301526156988161565c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156fb602683614b3f565b91506157068261569f565b604082019050919050565b6000602082019050818103600083015261572a816156ee565b9050919050565b7f4c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000615767600f83614b3f565b915061577282615731565b602082019050919050565b600060208201905081810360008301526157968161575a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006157d3602083614b3f565b91506157de8261579d565b602082019050919050565b60006020820190508181036000830152615802816157c6565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061583f601083614b3f565b915061584a82615809565b602082019050919050565b6000602082019050818103600083015261586e81615832565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006158ab601f83614b3f565b91506158b682615875565b602082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f4c6f772062616c616e6365000000000000000000000000000000000000000000600082015250565b6000615917600b83614b3f565b9150615922826158e1565b602082019050919050565b600060208201905081810360008301526159468161590a565b9050919050565b50565b600061595d600083614cc4565b91506159688261594d565b600082019050919050565b600061597e82615950565b9150819050919050565b7f455448205061796d656e74206661696c65640000000000000000000000000000600082015250565b60006159be601283614b3f565b91506159c982615988565b602082019050919050565b600060208201905081810360008301526159ed816159b1565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615a2a601483614b3f565b9150615a35826159f4565b602082019050919050565b60006020820190508181036000830152615a5981615a1d565b905091905056fea2646970667358221220e258f65cda6163cd69ae657c3ce1034a712b1a2b808d08c7990f188ecf5ba9ac64736f6c63430008090033
Deployed Bytecode
0x6080604052600436106103d95760003560e01c80638456cb59116101fd578063dad80e8611610118578063f04d688f116100ab578063f851a4401161007a578063f851a44014610eac578063f887ea4014610ed7578063fb9a4acd14610f02578063fe4cf22e14610f2b578063fe575a8714610f5b576103d9565b8063f04d688f14610e04578063f2fde38b14610e2f578063f446374314610e58578063f597573f14610e81576103d9565b8063e985e367116100e7578063e985e36714610d55578063eadd94ec14610d80578063eb9d4ef714610dab578063edec5f2714610ddb576103d9565b8063dad80e8614610c85578063e19648db14610cb0578063e32204dd14610ced578063e6da921314610d18576103d9565b8063ba166a3911610190578063cad005561161015f578063cad0055614610bdd578063cb1a4fc014610c06578063cff805ab14610c31578063d76abb9d14610c5c576103d9565b8063ba166a3914610b0f578063bb3d676a14610b4c578063c23326f314610b75578063c49cc64514610bb2576103d9565b80639cfa0f7c116101cc5780639cfa0f7c14610a4e578063a7c6016014610a79578063b0068efb14610ab6578063b00bba6a14610ae6576103d9565b80638456cb59146109b857806389daf799146109cf5780638da5cb5b146109f85780638e15f47314610a23576103d9565b80634e00ed50116102f857806363b201171161028b5780637154b8b51161025a5780637154b8b5146108cc57806373b2e80e146108f55780637649b9571461093257806378e97925146109625780637f6fb2531461098d576103d9565b806363b20117146108365780636a61e5fc1461086157806370ba11131461088a578063715018a6146108b5576103d9565b80635a03d679116102c75780635a03d679146107785780635bc34f71146107a35780635c975abb146107ce5780635df4f353146107f9576103d9565b80634e00ed50146106ce5780634e71d92d146106f957806353d9920714610724578063548db1741461074f576103d9565b806329a5a0b6116103705780633af32abf1161033f5780633af32abf146106245780633dd31df2146106615780633f4ba83a1461068c57806343568eae146106a3576103d9565b806329a5a0b6146105665780633197cbb6146105a357806333f76178146105ce57806338646608146105f9576103d9565b80631c3b7df9116103ac5780631c3b7df9146104ac5780631ddc6091146104e95780631fa2bc921461051257806328de18591461053d576103d9565b806303b9c5ad146103de5780630ba36dcd146104075780631199193d146104445780631559f7821461046f575b600080fd5b3480156103ea57600080fd5b506104056004803603810190610400919061412a565b610f98565b005b34801561041357600080fd5b5061042e600480360381019061042991906141d5565b611045565b60405161043b919061421b565b60405180910390f35b34801561045057600080fd5b5061045961105d565b604051610466919061421b565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614262565b611063565b6040516104a3919061421b565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce9190614262565b611292565b6040516104e091906142aa565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906142f1565b611675565b005b34801561051e57600080fd5b5061052761169a565b60405161053491906142aa565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f919061431e565b6116ad565b005b34801561057257600080fd5b5061058d60048036038101906105889190614262565b611714565b60405161059a919061421b565b60405180910390f35b3480156105af57600080fd5b506105b8611755565b6040516105c5919061421b565b60405180910390f35b3480156105da57600080fd5b506105e361175b565b6040516105f0919061421b565b60405180910390f35b34801561060557600080fd5b5061060e611761565b60405161061b91906143bd565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906141d5565b611787565b60405161065891906142aa565b60405180910390f35b34801561066d57600080fd5b506106766117a7565b60405161068391906142aa565b60405180910390f35b34801561069857600080fd5b506106a16117ba565b005b3480156106af57600080fd5b506106b86117cc565b6040516106c5919061421b565b60405180910390f35b3480156106da57600080fd5b506106e36117d2565b6040516106f0919061421b565b60405180910390f35b34801561070557600080fd5b5061070e6117d8565b60405161071b91906142aa565b60405180910390f35b34801561073057600080fd5b50610739611d1b565b60405161074691906142aa565b60405180910390f35b34801561075b57600080fd5b506107766004803603810190610771919061412a565b611d2e565b005b34801561078457600080fd5b5061078d611ddb565b60405161079a919061421b565b60405180910390f35b3480156107af57600080fd5b506107b8611de1565b6040516107c5919061421b565b60405180910390f35b3480156107da57600080fd5b506107e3611de7565b6040516107f091906142aa565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906141d5565b611dfe565b60405161082d91906142aa565b60405180910390f35b34801561084257600080fd5b5061084b611e1e565b604051610858919061421b565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190614262565b611e24565b005b34801561089657600080fd5b5061089f611e36565b6040516108ac919061421b565b60405180910390f35b3480156108c157600080fd5b506108ca611e3c565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190614262565b611e50565b005b34801561090157600080fd5b5061091c600480360381019061091791906141d5565b611e62565b60405161092991906142aa565b60405180910390f35b61094c60048036038101906109479190614262565b611e82565b60405161095991906142aa565b60405180910390f35b34801561096e57600080fd5b50610977612190565b604051610984919061421b565b60405180910390f35b34801561099957600080fd5b506109a2612196565b6040516109af919061421b565b60405180910390f35b3480156109c457600080fd5b506109cd61219c565b005b3480156109db57600080fd5b506109f660048036038101906109f1919061412a565b6121ae565b005b348015610a0457600080fd5b50610a0d61225b565b604051610a1a91906143e7565b60405180910390f35b348015610a2f57600080fd5b50610a38612285565b604051610a45919061421b565b60405180910390f35b348015610a5a57600080fd5b50610a63612348565b604051610a70919061421b565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b9190614262565b61234e565b604051610aad91906142aa565b60405180910390f35b610ad06004803603810190610acb9190614402565b612793565b604051610add91906142aa565b60405180910390f35b348015610af257600080fd5b50610b0d6004803603810190610b0891906141d5565b612abb565b005b348015610b1b57600080fd5b50610b366004803603810190610b319190614262565b612c47565b604051610b439190614500565b60405180910390f35b348015610b5857600080fd5b50610b736004803603810190610b6e919061412a565b612cb4565b005b348015610b8157600080fd5b50610b9c6004803603810190610b979190614262565b612d61565b604051610ba9919061421b565b60405180910390f35b348015610bbe57600080fd5b50610bc7612d85565b604051610bd49190614543565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff91906141d5565b612dab565b005b348015610c1257600080fd5b50610c1b612e67565b604051610c2891906142aa565b60405180910390f35b348015610c3d57600080fd5b50610c4661320d565b604051610c53919061421b565b60405180910390f35b348015610c6857600080fd5b50610c836004803603810190610c7e9190614262565b613213565b005b348015610c9157600080fd5b50610c9a613225565b604051610ca791906142aa565b60405180910390f35b348015610cbc57600080fd5b50610cd76004803603810190610cd29190614262565b613238565b604051610ce4919061421b565b60405180910390f35b348015610cf957600080fd5b50610d0261325c565b604051610d0f91906143e7565b60405180910390f35b348015610d2457600080fd5b50610d3f6004803603810190610d3a919061455e565b613282565b604051610d4c919061421b565b60405180910390f35b348015610d6157600080fd5b50610d6a6132b6565b604051610d7791906143e7565b60405180910390f35b348015610d8c57600080fd5b50610d956132dc565b604051610da2919061421b565b60405180910390f35b610dc56004803603810190610dc09190614402565b6132e2565b604051610dd291906142aa565b60405180910390f35b348015610de757600080fd5b50610e026004803603810190610dfd919061412a565b61366f565b005b348015610e1057600080fd5b50610e1961371c565b604051610e26919061421b565b60405180910390f35b348015610e3b57600080fd5b50610e566004803603810190610e5191906141d5565b613722565b005b348015610e6457600080fd5b50610e7f6004803603810190610e7a919061412a565b6137a6565b005b348015610e8d57600080fd5b50610e96613853565b604051610ea391906145bf565b60405180910390f35b348015610eb857600080fd5b50610ec1613879565b604051610ece91906143e7565b60405180910390f35b348015610ee357600080fd5b50610eec61389f565b604051610ef991906145fb565b60405180910390f35b348015610f0e57600080fd5b50610f296004803603810190610f24919061466c565b6138c5565b005b610f456004803603810190610f409190614262565b6139d3565b604051610f5291906142aa565b60405180910390f35b348015610f6757600080fd5b50610f826004803603810190610f7d91906141d5565b613c7c565b604051610f8f91906142aa565b60405180910390f35b610fa0613cbf565b60005b8282905081101561104057600160e06000858585818110610fc757610fc66146ed565b5b9050602002016020810190610fdc91906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110389061474b565b915050610fa3565b505050565b60dc6020528060005260406000206000915090505481565b60e45481565b600080600267ffffffffffffffff81111561108157611080614794565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b50905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106110db576110da6146ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b62e45c3df611dce236a6ddc7a493d79f9dfadef8160018151811061113e5761113d6146ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600060e960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f00ca7485846040518363ffffffff1660e01b81526004016111d7929190614881565b60006040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061122c91906149e6565b9050606460e75482600081518110611247576112466146ed565b5b60200260200101516112599190614a2f565b6112639190614ab8565b81600081518110611277576112766146ed565b5b60200260200101516112899190614ae9565b92505050919050565b600061129c613d3d565b60e660009054906101000a900460ff166112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290614b9c565b60405180910390fd5b60e45460e8546112fb9190614bbc565b82111561133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490614c62565b60405180910390fd5b8160e4600082825461134f9190614ae9565b92505081905550600061136e60ce54846113699190614a2f565b611063565b9050600060ce5461137d612285565b836113889190614a2f565b6113929190614ab8565b9050600064e8d4a51000826113a79190614ab8565b9050600060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166113ec613d87565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460405160240161142293929190614c82565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516114ac9190614d33565b6000604051808303816000865af19150503d80600081146114e9576040519150601f19603f3d011682016040523d82523d6000602084013e6114ee565b606091505b5050905080611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614d96565b60405180910390fd5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966611578613d87565b60ce54896115869190614a2f565b6040518363ffffffff1660e01b81526004016115a3929190614db6565b600060405180830381600087803b1580156115bd57600080fd5b505af11580156115d1573d6000803e3d6000fd5b5050505060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686611617613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685874260405161166093929190614ddf565b60405180910390a46001945050505050919050565b61167d613cbf565b8060d960156101000a81548160ff02191690831515021790555050565b60d960149054906101000a900460ff1681565b6116b5613cbf565b8160e660006101000a81548160ff0219169083151502179055508060e960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008060e554836117259190614a2f565b90506000611731612285565b60ce548361173f9190614a2f565b6117499190614ab8565b90508092505050919050565b60cb5481565b60ce5481565b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60df6020528060005260406000206000915054906101000a900460ff1681565b60e660009054906101000a900460ff1681565b6117c2613cbf565b6117ca613d8f565b565b60d85481565b60e55481565b60006117e2613d3d565b600073ffffffffffffffffffffffffffffffffffffffff1660cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614e62565b60405180910390fd5b60de6000611880613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614ece565b60405180910390fd5b60d960159054906101000a900460ff16156119b15760df6000611929613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790614f3a565b60405180910390fd5b5b60cc544210156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90614fa6565b60405180910390fd5b60dd6000611a02613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190615012565b60405180910390fd5b600160dd6000611a98613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060dc6000611af7613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e9061507e565b60405180910390fd5b60dc6000611b83613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c09613d87565b846040518363ffffffff1660e01b8152600401611c27929190614db6565b602060405180830381600087803b158015611c4157600080fd5b505af1158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906150b3565b905080611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb29061512c565b60405180910390fd5b611cc3613d87565b73ffffffffffffffffffffffffffffffffffffffff167f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b8342604051611d0a92919061514c565b60405180910390a260019250505090565b60d960159054906101000a900460ff1681565b611d36613cbf565b60005b82829050811015611dd657600060df6000858585818110611d5d57611d5c6146ed565b5b9050602002016020810190611d7291906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611dce9061474b565b915050611d39565b505050565b60e85481565b60d05481565b6000609760009054906101000a900460ff16905090565b60e06020528060005260406000206000915054906101000a900460ff1681565b60c95481565b611e2c613cbf565b8060e58190555050565b60e75481565b611e44613cbf565b611e4e6000613df2565b565b611e58613cbf565b8060e78190555050565b60dd6020528060005260406000206000915054906101000a900460ff1681565b6000611e8c613d3d565b611e94613eb8565b60e660009054906101000a900460ff16611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90614b9c565b60405180910390fd5b60e45460e854611ef39190614bbc565b821115611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90614c62565b60405180910390fd5b8160e46000828254611f479190614ae9565b925050819055506000611f6660ce5484611f619190614a2f565b611063565b905080341015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa2906151c1565b60405180910390fd5b60008134611fb99190614bbc565b9050611fe760d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b600081111561200257612001611ffb613d87565b82613f08565b5b600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61204a613d87565b60ce54886120589190614a2f565b6040518363ffffffff1660e01b8152600401612075929190614db6565b602060405180830381600087803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c791906150b3565b905080612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061512c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168561212a613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36866000426040516121749392919061521c565b60405180910390a46001935050505061218b613ffc565b919050565b60ca5481565b60e35481565b6121a4613cbf565b6121ac614005565b565b6121b6613cbf565b60005b8282905081101561225657600060de60008585858181106121dd576121dc6146ed565b5b90506020020160208101906121f291906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061224e9061474b565b9150506121b9565b505050565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156122f057600080fd5b505afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232891906152cb565b5050509150506402540be4008161233f9190615346565b90508091505090565b60cf5481565b6000612358613d3d565b60e660009054906101000a900460ff166123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e90614b9c565b60405180910390fd5b60e45460e8546123b79190614bbc565b8211156123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f090614c62565b60405180910390fd5b8160e4600082825461240b9190614ae9565b92505081905550600061242a60ce54846124259190614a2f565b611063565b9050600060ce54612439612285565b836124449190614a2f565b61244e9190614ab8565b9050600064e8d4a51000826124639190614ab8565b9050600060da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124a8613d87565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516024016124de93929190614c82565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125689190614d33565b6000604051808303816000865af19150503d80600081146125a5576040519150601f19603f3d011682016040523d82523d6000602084013e6125aa565b606091505b50509050806125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590614d96565b60405180910390fd5b60cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612634613d87565b60ce54896126429190614a2f565b6040518363ffffffff1660e01b815260040161265f929190614db6565b602060405180830381600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906150b3565b9050806126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea9061512c565b60405180910390fd5b60da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686612735613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685874260405161277e93929190614ddf565b60405180910390a46001945050505050919050565b600061279d613d3d565b6127a5613eb8565b60e060006127b1613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282f906154a9565b60405180910390fd5b60e660009054906101000a900460ff16612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90614b9c565b60405180910390fd5b60e45460e8546128979190614bbc565b8211156128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d090614c62565b60405180910390fd5b8160e460008282546128eb9190614ae9565b92505081905550600061290a60ce54846129059190614a2f565b611063565b90508034101561294f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612946906151c1565b60405180910390fd5b6000813461295d9190614bbc565b905061298b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b600081111561299f5761299e8582613f08565b5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c619668660ce54876129ec9190614a2f565b6040518363ffffffff1660e01b8152600401612a09929190614db6565b600060405180830381600087803b158015612a2357600080fd5b505af1158015612a37573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff16848673ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685600042604051612a9f9392919061521c565b60405180910390a4600192505050612ab5613ffc565b92915050565b612ac3613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a9061553b565b60405180910390fd5b8060e260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612bf1929190614db6565b602060405180830381600087803b158015612c0b57600080fd5b505af1158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4391906150b3565b5050565b606060d18260038110612c5d57612c5c6146ed565b5b01805480602002602001604051908101604052809291908181526020018280548015612ca857602002820191906000526020600020905b815481526020019060010190808311612c94575b50505050509050919050565b612cbc613cbf565b60005b82829050811015612d5c57600160de6000858585818110612ce357612ce26146ed565b5b9050602002016020810190612cf891906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612d549061474b565b915050612cbf565b505050565b60d78181548110612d7157600080fd5b906000526020600020016000915090505481565b60db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612db3613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a906155a7565b60405180910390fd5b8060d960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612e71613d3d565b600073ffffffffffffffffffffffffffffffffffffffff1660cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90614e62565b60405180910390fd5b60de6000612f0f613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8e90614ece565b60405180910390fd5b60e260149054906101000a900460ff16156130405760df6000612fb8613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690615613565b60405180910390fd5b5b600060dc600061304e613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116130ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c59061567f565b60405180910390fd5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966613114613d87565b836040518363ffffffff1660e01b8152600401613132929190614db6565b600060405180830381600087803b15801561314c57600080fd5b505af1158015613160573d6000803e3d6000fd5b5050505060dc6000613170613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090556131b6613d87565b73ffffffffffffffffffffffffffffffffffffffff167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b82426040516131fd92919061514c565b60405180910390a2600191505090565b60d45481565b61321b613cbf565b8060e88190555050565b60e260149054906101000a900460ff1681565b60d6818154811061324857600080fd5b906000526020600020016000915090505481565b60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60d1826003811061329257600080fd5b0181815481106132a157600080fd5b90600052602060002001600091509150505481565b60cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60d55481565b60006132ec613d3d565b6132f4613eb8565b60e06000613300613d87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337e906154a9565b60405180910390fd5b60e660009054906101000a900460ff166133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd90614b9c565b60405180910390fd5b60e45460e8546133e69190614bbc565b821115613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f90614c62565b60405180910390fd5b8160e4600082825461343a9190614ae9565b92505081905550600061345960ce54846134549190614a2f565b611063565b90508034101561349e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613495906151c1565b60405180910390fd5b600081346134ac9190614bbc565b90506134da60d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b60008111156134ee576134ed8582613f08565b5b600060cd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8760ce548861353d9190614a2f565b6040518363ffffffff1660e01b815260040161355a929190614db6565b602060405180830381600087803b15801561357457600080fd5b505af1158015613588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ac91906150b3565b9050806135ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e59061512c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16858773ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36866000426040516136529392919061521c565b60405180910390a460019350505050613669613ffc565b92915050565b613677613cbf565b60005b8282905081101561371757600160df600085858581811061369e5761369d6146ed565b5b90506020020160208101906136b391906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061370f9061474b565b91505061367a565b505050565b60cc5481565b61372a613cbf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561379a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379190615711565b60405180910390fd5b6137a381613df2565b50565b6137ae613cbf565b60005b8282905081101561384e57600060e060008585858181106137d5576137d46146ed565b5b90506020020160208101906137ea91906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806138469061474b565b9150506137b1565b505050565b60da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60e160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60e960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6138cd613cbf565b818190508484905014613915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390c9061577d565b60405180910390fd5b60005b848490508110156139cc57828282818110613936576139356146ed565b5b9050602002013560dc6000878785818110613954576139536146ed565b5b905060200201602081019061396991906141d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139b29190614ae9565b9250508190555080806139c49061474b565b915050613918565b5050505050565b60006139dd613d3d565b6139e5613eb8565b60e660009054906101000a900460ff16613a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2b90614b9c565b60405180910390fd5b60e45460e854613a449190614bbc565b821115613a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7d90614c62565b60405180910390fd5b8160e46000828254613a989190614ae9565b925050819055506000613ab760ce5484613ab29190614a2f565b611063565b905080341015613afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af3906151c1565b60405180910390fd5b60008134613b0a9190614bbc565b9050613b3860d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613f08565b6000811115613b5357613b52613b4c613d87565b82613f08565b5b60e260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391c61966613b99613d87565b60ce5487613ba79190614a2f565b6040518363ffffffff1660e01b8152600401613bc4929190614db6565b600060405180830381600087803b158015613bde57600080fd5b505af1158015613bf2573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff1684613c17613d87565b73ffffffffffffffffffffffffffffffffffffffff167f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d3685600042604051613c619392919061521c565b60405180910390a4600192505050613c77613ffc565b919050565b60de6020528060005260406000206000915054906101000a900460ff1681565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b613cc7613d87565b73ffffffffffffffffffffffffffffffffffffffff16613ce561225b565b73ffffffffffffffffffffffffffffffffffffffff1614613d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d32906157e9565b60405180910390fd5b565b613d45611de7565b15613d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7c90615855565b60405180910390fd5b565b600033905090565b613d97614068565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613ddb613d87565b604051613de891906143e7565b60405180910390a1565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001541415613efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ef5906158c1565b60405180910390fd5b6002600181905550565b80471015613f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f429061592d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051613f7190615973565b60006040518083038185875af1925050503d8060008114613fae576040519150601f19603f3d011682016040523d82523d6000602084013e613fb3565b606091505b5050905080613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee906159d4565b60405180910390fd5b505050565b60018081905550565b61400d613d3d565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614051613d87565b60405161405e91906143e7565b60405180910390a1565b614070611de7565b6140af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140a690615a40565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126140ea576140e96140c5565b5b8235905067ffffffffffffffff811115614107576141066140ca565b5b602083019150836020820283011115614123576141226140cf565b5b9250929050565b60008060208385031215614141576141406140bb565b5b600083013567ffffffffffffffff81111561415f5761415e6140c0565b5b61416b858286016140d4565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006141a282614177565b9050919050565b6141b281614197565b81146141bd57600080fd5b50565b6000813590506141cf816141a9565b92915050565b6000602082840312156141eb576141ea6140bb565b5b60006141f9848285016141c0565b91505092915050565b6000819050919050565b61421581614202565b82525050565b6000602082019050614230600083018461420c565b92915050565b61423f81614202565b811461424a57600080fd5b50565b60008135905061425c81614236565b92915050565b600060208284031215614278576142776140bb565b5b60006142868482850161424d565b91505092915050565b60008115159050919050565b6142a48161428f565b82525050565b60006020820190506142bf600083018461429b565b92915050565b6142ce8161428f565b81146142d957600080fd5b50565b6000813590506142eb816142c5565b92915050565b600060208284031215614307576143066140bb565b5b6000614315848285016142dc565b91505092915050565b60008060408385031215614335576143346140bb565b5b6000614343858286016142dc565b9250506020614354858286016141c0565b9150509250929050565b6000819050919050565b600061438361437e61437984614177565b61435e565b614177565b9050919050565b600061439582614368565b9050919050565b60006143a78261438a565b9050919050565b6143b78161439c565b82525050565b60006020820190506143d260008301846143ae565b92915050565b6143e181614197565b82525050565b60006020820190506143fc60008301846143d8565b92915050565b60008060408385031215614419576144186140bb565b5b6000614427858286016141c0565b92505060206144388582860161424d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61447781614202565b82525050565b6000614489838361446e565b60208301905092915050565b6000602082019050919050565b60006144ad82614442565b6144b7818561444d565b93506144c28361445e565b8060005b838110156144f35781516144da888261447d565b97506144e583614495565b9250506001810190506144c6565b5085935050505092915050565b6000602082019050818103600083015261451a81846144a2565b905092915050565b600061452d8261438a565b9050919050565b61453d81614522565b82525050565b60006020820190506145586000830184614534565b92915050565b60008060408385031215614575576145746140bb565b5b60006145838582860161424d565b92505060206145948582860161424d565b9150509250929050565b60006145a98261438a565b9050919050565b6145b98161459e565b82525050565b60006020820190506145d460008301846145b0565b92915050565b60006145e58261438a565b9050919050565b6145f5816145da565b82525050565b600060208201905061461060008301846145ec565b92915050565b60008083601f84011261462c5761462b6140c5565b5b8235905067ffffffffffffffff811115614649576146486140ca565b5b602083019150836020820283011115614665576146646140cf565b5b9250929050565b60008060008060408587031215614686576146856140bb565b5b600085013567ffffffffffffffff8111156146a4576146a36140c0565b5b6146b0878288016140d4565b9450945050602085013567ffffffffffffffff8111156146d3576146d26140c0565b5b6146df87828801614616565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061475682614202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147895761478861471c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147f881614197565b82525050565b600061480a83836147ef565b60208301905092915050565b6000602082019050919050565b600061482e826147c3565b61483881856147ce565b9350614843836147df565b8060005b8381101561487457815161485b88826147fe565b975061486683614816565b925050600181019050614847565b5085935050505092915050565b6000604082019050614896600083018561420c565b81810360208301526148a88184614823565b90509392505050565b6000601f19601f8301169050919050565b6148cb826148b1565b810181811067ffffffffffffffff821117156148ea576148e9614794565b5b80604052505050565b60006148fd6140b1565b905061490982826148c2565b919050565b600067ffffffffffffffff82111561492957614928614794565b5b602082029050602081019050919050565b60008151905061494981614236565b92915050565b600061496261495d8461490e565b6148f3565b90508083825260208201905060208402830185811115614985576149846140cf565b5b835b818110156149ae578061499a888261493a565b845260208401935050602081019050614987565b5050509392505050565b600082601f8301126149cd576149cc6140c5565b5b81516149dd84826020860161494f565b91505092915050565b6000602082840312156149fc576149fb6140bb565b5b600082015167ffffffffffffffff811115614a1a57614a196140c0565b5b614a26848285016149b8565b91505092915050565b6000614a3a82614202565b9150614a4583614202565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7e57614a7d61471c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac382614202565b9150614ace83614202565b925082614ade57614add614a89565b5b828204905092915050565b6000614af482614202565b9150614aff83614202565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b3457614b3361471c565b5b828201905092915050565b600082825260208201905092915050565b7f64796e616d69632073616c65206e6f7420616374697665000000000000000000600082015250565b6000614b86601783614b3f565b9150614b9182614b50565b602082019050919050565b60006020820190508181036000830152614bb581614b79565b9050919050565b6000614bc782614202565b9150614bd283614202565b925082821015614be557614be461471c565b5b828203905092915050565b7f616d6f756e742065786365656473206d617820746f6b656e7320746f2062652060008201527f736f6c6400000000000000000000000000000000000000000000000000000000602082015250565b6000614c4c602483614b3f565b9150614c5782614bf0565b604082019050919050565b60006020820190508181036000830152614c7b81614c3f565b9050919050565b6000606082019050614c9760008301866143d8565b614ca460208301856143d8565b614cb1604083018461420c565b949350505050565b600081519050919050565b600081905092915050565b60005b83811015614ced578082015181840152602081019050614cd2565b83811115614cfc576000848401525b50505050565b6000614d0d82614cb9565b614d178185614cc4565b9350614d27818560208601614ccf565b80840191505092915050565b6000614d3f8284614d02565b915081905092915050565b7f546f6b656e207061796d656e74206661696c6564000000000000000000000000600082015250565b6000614d80601483614b3f565b9150614d8b82614d4a565b602082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b6000604082019050614dcb60008301856143d8565b614dd8602083018461420c565b9392505050565b6000606082019050614df4600083018661420c565b614e01602083018561420c565b614e0e604083018461420c565b949350505050565b7f53616c6520746f6b656e206e6f74206164646564000000000000000000000000600082015250565b6000614e4c601483614b3f565b9150614e5782614e16565b602082019050919050565b60006020820190508181036000830152614e7b81614e3f565b9050919050565b7f54686973204164647265737320697320426c61636b6c69737465640000000000600082015250565b6000614eb8601b83614b3f565b9150614ec382614e82565b602082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b7f55736572206e6f742077686974656c697374656420666f7220636c61696d0000600082015250565b6000614f24601e83614b3f565b9150614f2f82614eee565b602082019050919050565b60006020820190508181036000830152614f5381614f17565b9050919050565b7f436c61696d20686173206e6f7420737461727465642079657400000000000000600082015250565b6000614f90601983614b3f565b9150614f9b82614f5a565b602082019050919050565b60006020820190508181036000830152614fbf81614f83565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614ffc600f83614b3f565b915061500782614fc6565b602082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b6000615068601083614b3f565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b6000815190506150ad816142c5565b92915050565b6000602082840312156150c9576150c86140bb565b5b60006150d78482850161509e565b91505092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b6000615116601583614b3f565b9150615121826150e0565b602082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b6000604082019050615161600083018561420c565b61516e602083018461420c565b9392505050565b7f4c657373207061796d656e740000000000000000000000000000000000000000600082015250565b60006151ab600c83614b3f565b91506151b682615175565b602082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b6000819050919050565b60006152066152016151fc846151e1565b61435e565b614202565b9050919050565b615216816151eb565b82525050565b6000606082019050615231600083018661420c565b61523e602083018561520d565b61524b604083018461420c565b949350505050565b600069ffffffffffffffffffff82169050919050565b61527281615253565b811461527d57600080fd5b50565b60008151905061528f81615269565b92915050565b6000819050919050565b6152a881615295565b81146152b357600080fd5b50565b6000815190506152c58161529f565b92915050565b600080600080600060a086880312156152e7576152e66140bb565b5b60006152f588828901615280565b9550506020615306888289016152b6565b94505060406153178882890161493a565b93505060606153288882890161493a565b925050608061533988828901615280565b9150509295509295909350565b600061535182615295565b915061535c83615295565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561539b5761539a61471c565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156153d8576153d761471c565b5b827f800000000000000000000000000000000000000000000000000000000000000005821260008413600084121616156154155761541461471c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156154525761545161471c565b5b828202905092915050565b7f43616c6c6572206e6f742077686974656c697374656420666f72207765727400600082015250565b6000615493601f83614b3f565b915061549e8261545d565b602082019050919050565b600060208201905081810360008301526154c281615486565b9050919050565b7f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160008201527f6c697a65642077697468207a65726f2061646472657373000000000000000000602082015250565b6000615525603783614b3f565b9150615530826154c9565b604082019050919050565b6000602082019050818103600083015261555481615518565b9050919050565b7f616464726573732063616e6e6f74206265207a65726f00000000000000000000600082015250565b6000615591601683614b3f565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b7f55736572206e6f742077686974656c697374656420666f72207374616b650000600082015250565b60006155fd601e83614b3f565b9150615608826155c7565b602082019050919050565b6000602082019050818103600083015261562c816155f0565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000615669601083614b3f565b915061567482615633565b602082019050919050565b600060208201905081810360008301526156988161565c565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156fb602683614b3f565b91506157068261569f565b604082019050919050565b6000602082019050818103600083015261572a816156ee565b9050919050565b7f4c656e677468206d69736d617463680000000000000000000000000000000000600082015250565b6000615767600f83614b3f565b915061577282615731565b602082019050919050565b600060208201905081810360008301526157968161575a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006157d3602083614b3f565b91506157de8261579d565b602082019050919050565b60006020820190508181036000830152615802816157c6565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061583f601083614b3f565b915061584a82615809565b602082019050919050565b6000602082019050818103600083015261586e81615832565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006158ab601f83614b3f565b91506158b682615875565b602082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f4c6f772062616c616e6365000000000000000000000000000000000000000000600082015250565b6000615917600b83614b3f565b9150615922826158e1565b602082019050919050565b600060208201905081810360008301526159468161590a565b9050919050565b50565b600061595d600083614cc4565b91506159688261594d565b600082019050919050565b600061597e82615950565b9150819050919050565b7f455448205061796d656e74206661696c65640000000000000000000000000000600082015250565b60006159be601283614b3f565b91506159c982615988565b602082019050919050565b600060208201905081810360008301526159ed816159b1565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615a2a601483614b3f565b9150615a35826159f4565b602082019050919050565b60006020820190508181036000830152615a5981615a1d565b905091905056fea2646970667358221220e258f65cda6163cd69ae657c3ce1034a712b1a2b808d08c7990f188ecf5ba9ac64736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.