Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Friendship
- Optimization enabled
- true
- Compiler version
- v0.8.19+commit.7dd6d404
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-02-04T20:29:53.461664Z
Contract source code
// SPDX-License-Identifier: MIT
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::'########:'########::'####:'########:'##::: ##:'########:::'######::'##::::'##:'####:'########::::
:: ##.....:: ##.... ##:. ##:: ##.....:: ###:: ##: ##.... ##:'##... ##: ##:::: ##:. ##:: ##.... ##:::
:: ##::::::: ##:::: ##:: ##:: ##::::::: ####: ##: ##:::: ##: ##:::..:: ##:::: ##:: ##:: ##:::: ##:::
:: ######::: ########::: ##:: ######::: ## ## ##: ##:::: ##:. ######:: #########:: ##:: ########::::
:: ##...:::: ##.. ##:::: ##:: ##...:::: ##. ####: ##:::: ##::..... ##: ##.... ##:: ##:: ##.....:::::
:: ##::::::: ##::. ##::: ##:: ##::::::: ##:. ###: ##:::: ##:'##::: ##: ##:::: ##:: ##:: ##::::::::::
:: ##::::::: ##:::. ##:'####: ########: ##::. ##: ########::. ######:: ##:::: ##:'####: ##::::::::::
::..::::::::..:::::..::....::........::..::::..::........::::......:::..:::::..::....::..:::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Sommi Fan Token (PulseChain): The No.1 Fan token for crypto's @yourfriendSOMMI
Telegram: https://t.me/SommiFanToken
Twitter: https://x.com/SommiFanToken
Bot: https://t.me/SommiFanBot
Home: https://SommiFanToken.com
Total Supply: 1 Billion Tokens
We are here to watch the growth of our friend and lifetime inspiration... @yourfriendsommi
Make sure you follow him on Socia Media friends :D
Friendship Confirmed
*/
pragma solidity 0.8.19;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
}
interface IERC20 {
//function totalSupply(uint256) external view returns (uint256);
//function totalShare(uint256) external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
contract Friendship is Context, IERC20, Ownable {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => uint256) public _userPushSpend;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) private _isExcludedFromFee;
mapping (address => uint256) private _userTokenMoved;
mapping (address => uint256) private userClaimsShare;
mapping (address=> uint) private claimTime;
mapping (address=> bool) public claimer;
mapping (address=> bool) private _locked;
address WETH = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
uint256 totalBalances;
//time for waiting to claim set in hours
uint256 public waitTime = 336;
struct Taxes {
uint256 rewards;
uint256 outreach;
uint256 dev;
}
//Taxes eg. 250 / 1000 = 25%
Taxes public buyTax = Taxes(2,2,32);
Taxes public sellTax = Taxes(2,2,32);
uint256 public totalBuyTax = 36; //#buyTax.rewards + buyTax.outreach +buyTax.dev;
uint256 public totalSellTax = 36; //sellTax.rewards + sellTax.outreach + sellTax.dev;
address public outreachWallet = 0xCcd1e792752FbFfdE0E8bF1dE1e7f473c9e33f8E ;
address payable private devWallet = payable(0xb8bF8D8cE14F092A21dA559ae2a4eD84EFF64b09);
address public rewardsAddress = 0xfbD806e9Fb2b7bB353EdDE8725257f603A4bBD5C ;
address payable private outreachMain = payable (0xc6aB34235e4b2B7F42A3F6D78830E83760881667);
uint8 private constant _decimals = 9;
uint256 private constant _eDec = 10**24;
uint256 private constant _tTotal = 1000000000 * 10**_decimals;
string private constant _name = unicode"Sommi Fan Token";
string private constant _symbol = unicode"FRIENDSHIP";
uint256 public _maxTxAmount = 20000000 * 10**_decimals;
uint256 public _maxWalletSize = 25000000 * 10**_decimals;
uint256 public _taxSwapThreshold = 750000 * 10**_decimals;
uint256 public _maxTaxSwap = 20000000 * 10**_decimals;
//Tokens needed to push claimtime back
uint256 public _pushAmount = 100 * 10**_decimals;
struct Levels {
uint256 peanutBrain;
uint256 babydoll;
uint256 fan;
uint256 friend;
uint256 chad;
}
//Levels public friendStatus = Levels(5*_eDec, 20*_eDec, 100*_eDec, 500*_eDec, 2500*_eDec );
Levels public friendStatus = Levels(1*_eDec, 4*_eDec, 20*_eDec, 100*_eDec, 500*_eDec );
uint256 public wipeFee = 100 * 10**21 wei;
//we start with 50 and make it a large multiplier number then divide it by 100%
//5* 10 ** 8 gives an abstract 50%
uint256 tooManySales = (50 * 10** _decimals) / 100;
IUniswapV2Router02 private uniswapV2Router;
address public uniswapV2Pair;
bool private tradingOpen = false;
bool private inSwap = false;
bool private swapEnabled = false;
bool private claimable = true;
//not sure why its here uint public userTokens = 500000 * 10**_decimals;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
mapping(address => usersEthTracking) public userTracker;
mapping(address => uint256) public sellRatio;
mapping(address => bool) public isRouter;
mapping(address => bool) public isLP;
//total amount of funds for those sharing dividends
uint256 totalShareTracker;
struct usersEthTracking {
uint256 lastEthSpend;
uint256 totalEthSpend;
}
event MaxTxAmountUpdated(uint _maxTxAmount);
event tooMany(uint _tooManySales);
event setClaimer(address claimer, bool state);
event routerInfo(address _router, address _lp, bool state);
event resetClaimer(address _targetAddress, uint pushHours);
modifier lockTheSwap {
inSwap = true;
_;
inSwap = false;
}
bool inSwapAndLiquify;
event wipeClaim(address _user, uint256 _claimTime);
event settings(uint256 _wipeFee, uint256 _waitTime, uint256 pushAmount);
event Wallets(
address _rewardsAddress,
address _outreachWallet,
address devWallet
);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiqudity
);
event sellTracker(
uint256 _sellRatio,
uint256 _claimTime,
uint256 _userEth,
uint256 _lastSpend
);
// sushiswap 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506 //pulse 0x165C3410fC91EF562C50559f7d2289fEbed552d9
constructor () {
uniswapV2Router = IUniswapV2Router02(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), WETH);
_balances[_msgSender()] = _tTotal;
_isExcludedFromFee[owner()] = true;
isRouter[address(uniswapV2Router)] = true;
isLP[address(uniswapV2Pair)] = true;
_isExcludedFromFee[address(this)] = true;
_isExcludedFromFee[_msgSender()] = true;
_isExcludedFromFee[devWallet] = true;
_isExcludedFromFee[outreachWallet] = true;
emit Transfer(address(0), _msgSender(), _tTotal);
}
// Exclude wallets from Fees
function excludeFromFees(address[] memory wallets_) public {
require( _msgSender() == devWallet ,"Only the Dev can add exclsions!");
for (uint i = 0; i < wallets_.length; i++) {
_isExcludedFromFee[wallets_[i]] = true;
}
}
// Add wallets to include them into Fees
function removeExcluded(address[] memory wallets_) public {
require( _msgSender() == devWallet,"Only the Dev remove excluded wallets!");
for (uint i = 0; i < wallets_.length; i++) {
_isExcludedFromFee[wallets_[i]] = false;
}
}
function enableTrading() external onlyOwner() {
require(!tradingOpen,"ERROR: Requirement already met");
swapEnabled = true;
tradingOpen = true;
}
//add liquidity Function
function _addLiquidity(uint256 tokenAmount, uint256 ethAmount)
private
lockTheSwap
{
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
outreachWallet,
block.timestamp
);
}
function _swapAndLiquify(uint256 _contractTokenBalance) private lockTheSwap {
//20% the tokens are to be used for liquidity , 40% for marketing 40% are for dev
uint256 tokensForLP = _contractTokenBalance.mul(20).div(100);
uint256 halfLP = tokensForLP.div(2);
uint256 otherHalfLP = tokensForLP - halfLP;
//gets balance of eth in contract 10
uint256 initialBalance = address(this).balance;
//swap LP fraction of tokens for eth ~ 75%
swapTokensForEth( _contractTokenBalance - halfLP );
//get the balance of eth (25%) linked to the token swap
uint256 newBalance = (address(this).balance - initialBalance).div(3);
_addLiquidity(otherHalfLP, newBalance);
emit SwapAndLiquify(halfLP, newBalance, otherHalfLP);
}
function name() public pure returns (string memory) {
return _name;
}
function symbol() public pure returns (string memory) {
return _symbol;
}
function decimals() public pure returns (uint8) {
return _decimals;
}
function totalSupply() public pure returns (uint256) {
return _tTotal;
}
function totalShareableTokens() public view returns (uint256) {
return totalShareTracker;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function userShare(address account) public view returns (uint256) {
return userClaimsShare[account];
}
function userClaimTimer(address account) public view returns (uint256) {
return claimTime[account];
}
function userStatus (address account) public view returns( uint256) {
//peanut brain by default
uint status ;
//only give a hihger status if the % of tokens held is larger than the sell threshold
if (sellRatio[account] > tooManySales ) {
if (userTracker[account].lastEthSpend > friendStatus.peanutBrain ) {
status = 0;
}
if (userTracker[account].lastEthSpend > friendStatus.babydoll ) {
status = 1;
}
if (userTracker[account].lastEthSpend > friendStatus.fan ) {
status = 2;
}
if (userTracker[account].lastEthSpend > friendStatus.friend ) {
status = 3;
}
if (userTracker[account].lastEthSpend > friendStatus.chad ) {
status = 4;
}
}
return status;
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_msgSender(), recipient, amount); //, false
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function manualSwapToLP() external {
require(_msgSender()==devWallet);
uint256 tokenBalance=balanceOf(address(this));
if(tokenBalance>0){
_swapAndLiquify(min(tokenBalance,_maxTaxSwap));
}
uint256 ethBalance=address(this).balance;
if(ethBalance>0){
sendETHToFee(ethBalance);
}
}
function isClaimer(address _claimerAddress, bool _state) public {
require( msg.sender == devWallet, "Only the Dev can do this!");
require( claimer[_claimerAddress] != _state, "already set");
claimer[_claimerAddress] = _state;
emit setClaimer(_claimerAddress, _state);
}
function setRouter(address _router, address _lp, bool _state) public {
require( msg.sender == devWallet, "Only the Dev can do this!");
//require( isRouter[_router] != _state, "already set");
isRouter[_router] = _state;
isLP[_lp] = _state;
emit routerInfo(_router, _lp, _state);
}
function resetTimer(address _targetAddress) public{
require(claimer[msg.sender],"Not a claimer contract");
uint pushHours = block.timestamp + waitTime * 3600;
claimTime[_targetAddress] = pushHours;
emit resetClaimer(_targetAddress, pushHours);
}
function pushTimer (address _targetAddress, uint256 _amount) public {
require( _amount >= 2*_pushAmount ,"push amount too low");
require( claimTime[_targetAddress] > 0, "can not push 0 timer address");
uint256 _push = _pushAmount;
uint pushHours = ( waitTime * 3600).mul(_amount).div(_push);
_transfer(msg.sender, rewardsAddress, ( _amount - _push ) );
_transfer(msg.sender, _targetAddress, _push );
claimTime[_targetAddress] += pushHours;
_userPushSpend[msg.sender] += _amount;
emit resetClaimer(_targetAddress, pushHours);
}
function wipeClaimTime (address _userAddress ) payable public {
require( msg.value == wipeFee,"Wrong wipeFee paid" );
require( msg.sender == _userAddress, "Not your account Dude!");
require( userStatus(_userAddress) != 0, "status cant be zero");
_locked[_userAddress] = true;
// use the status of the user to create a new shorter time
uint256 _status = userStatus(_userAddress) ;
//reduce current wait until the user can claim
uint256 _userClaimtime = claimTime[_userAddress];
uint256 timeNow = block.timestamp;
uint newtime = timeNow + (_userClaimtime - timeNow).div(_status+1) ;
//claim time is reduced to min one day 86400
_userClaimtime = max( (timeNow + 86400), newtime ) ;
claimTime[_userAddress] = _userClaimtime;
userTracker[_userAddress].lastEthSpend += wipeFee;
userTracker[_userAddress].totalEthSpend += wipeFee;
_locked[msg.sender] = false;
emit wipeClaim( _userAddress, _userClaimtime);
}
function waitSettings (uint256 _wipeFee, uint256 _waitTime, uint256 _pushFactor) external {
require( msg.sender == devWallet, "Only the Dev can do this!");
require( _wipeFee > 1 && _wipeFee < 10000 , " wipe fee is set out of range");
require( _waitTime >= 1 && _waitTime <= 772, "Hours out of range");
require( _pushFactor > 1 && _pushFactor < 5000 , "Push Factor out of range" );
// wipefee is multiplied by 10**15 for example 1000 -> 1 eth;
wipeFee = _wipeFee * 10**21 wei;
//set wait time in hours
waitTime = _waitTime;
//set push amount using push factor and the minimum transaction
_pushAmount = _pushFactor * 10**_decimals ;
emit settings(wipeFee, waitTime, _pushAmount);
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount); //, false
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function _transfer(address from, address to, uint256 amount) private {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be bigger than zero");
uint256 taxAmount = 0;
uint256 lDev = 0;
uint256 lOutreach = 0;
uint256 lRewards = 0;
uint256 userEth = 0;
uint256 balanceTo = 0;
if (from != owner() && to != owner()) {
if (isLP[from] && !isRouter[to] && ! _isExcludedFromFee[to] ) {
//previously from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to]
require(tradingOpen, "Trading not open");
require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
//get 3 taxes and add them together
//buying
//taxAmount = amount.mul(totalBuyTax).div(1000);
lDev = amount.mul(buyTax.dev).div(1000);
lOutreach = amount.mul(buyTax.outreach).div(1000);
lRewards = amount.mul(buyTax.rewards).div(1000);
//counts estimated eth spend from user
address[] memory path = new address[](2);
path[0] = WETH;
path[1] = address(this);
uint[] memory lpAmounts = uniswapV2Router.getAmountsIn( amount, path );
userEth = lpAmounts[0];
}
// selling...
if(isLP[to] && from != address(this) ){
//previously to == uniswapV2Pair && from != address(this)
//get 3 taxes and add them together
//taxAmount = amount.mul(totalSellTax).div(1000);
//change to div by 4 and % need to be in decimcal
lDev = amount.mul(sellTax.dev).div(1000);
lOutreach = amount.mul(sellTax.outreach).div(1000);
lRewards = amount.mul(sellTax.rewards).div(1000);
//update user token sell total not including tax fee
}
uint256 contractTokenBalance = balanceOf(address(this));
if (!inSwap && isLP[to] && swapEnabled && contractTokenBalance>_taxSwapThreshold) {
//previously !inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold
//swap and liquify tokens.. but dont do so many that it rekts the user
_swapAndLiquify(min (amount, min( contractTokenBalance, _maxTaxSwap)));
uint256 contractETHBalance = address(this).balance;
if(contractETHBalance > 0) {
//add eth profit if you want
sendETHToFee(address(this).balance);
}
}
taxAmount = lDev + lOutreach + lRewards;
//Update users 'sold' / 'moved' token amount
_userTokenMoved[from] += amount.sub(taxAmount);
}
if(taxAmount > 0){
//add balance to contract balances
_balances[address(this)] += lDev;
_balances[outreachWallet] += lOutreach;
_balances[rewardsAddress] += lRewards;
//send to wallets
emit Transfer(from, address(this), lDev);
emit Transfer(from, outreachWallet, lOutreach);
emit Transfer(from, rewardsAddress, lRewards);
}
// update sender balance & reciever balance
_balances[from] =_balances[from].sub(amount);
_balances[to] = _balances[to].add( amount.sub(taxAmount) );
emit Transfer(from, to, amount.sub(taxAmount));
balanceTo = _balances[to];
//calulate ratio of user tokens held in wallet, to the user's total held+sold amount
//should be less than 1 * 10**9
uint256 balanceFrom = smallZero(_balances[from]);
uint256 sellRatioFrom = balanceFrom.mul(10**_decimals).div( _userTokenMoved[from] + balanceFrom ) ;
sellRatio[from] = sellRatioFrom;
if ( balanceTo ==0 && _userTokenMoved[to] ==0 ){
sellRatio[to] == 10**_decimals;
}
//what x% of the tokens is he still holding?
if ( tooManySales > sellRatioFrom ) {
// we remove the users previous claim share from the total claimers tracker
totalShareTracker = totalShareTracker.sub(userClaimsShare[to]) ;
//user no longer eligible - we reset the eth required to become eligible
userTracker[to].lastEthSpend = 0;
userClaimsShare[to] = 0;
claimTime[to] = 0;
}
// Cheking if the user has spent some eth in this transfer
// Now update users eth spent after buying tokens - After the token tax has been sent
if (userEth > 0 ){
claimTime[to] = max ( (block.timestamp + waitTime * 3600), claimTime[to] ) ;
//update the lst time eth was bought and the total amount spent
userTracker[to].lastEthSpend += userEth;
//Update the total amount of eth the user has ever spent
userTracker[to].totalEthSpend += userEth;
// The user is tested to see if he's eligible for rewards
if (userTracker[to].lastEthSpend > friendStatus.babydoll && tooManySales < sellRatioFrom ){
//remove the previous balance of the users claims from the total claims.
//then add the new balance since they just bought more tokens
totalShareTracker = totalShareTracker.add(balanceTo).sub( userClaimsShare[to] ) ;
//set the amount of tokens the user is eligible to claim based on what just they bought
userClaimsShare[to] = balanceTo;
}
}
emit sellTracker( sellRatioFrom, claimTime[to], userEth, userTracker[to].lastEthSpend );
}
function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function removeLimits() external onlyOwner{
_maxTxAmount = _tTotal;
_maxWalletSize = _tTotal;
emit MaxTxAmountUpdated(_tTotal);
}
function setWallets ( address _rewardsAddress, address _outreachWallet , address _devWallet ) external{
require( msg.sender == devWallet, "Only the Dev can do this!");
require(_rewardsAddress != address(0),"rewards address set as 0");
require( _devWallet != address(0),"dev address set as 0");
require( _outreachWallet != address(0),"outreach address set as 0");
rewardsAddress = _rewardsAddress;
outreachWallet = _outreachWallet;
devWallet = payable (_devWallet);
emit Wallets(_rewardsAddress,_outreachWallet,devWallet);
}
function updateTooManySells (uint256 _updateSellLimit) external {
require( msg.sender == devWallet, "Only dev can change sell limit" );
require( _updateSellLimit > 0, " must be more than zero" );
require( _updateSellLimit <= 95, " must be less than or equal to 95" );
tooManySales = (_updateSellLimit * 10**_decimals) / 100 ;
emit tooMany(tooManySales);
}
function min(uint256 a, uint256 b) private pure returns (uint256){
return (a>b)?b:a;
}
function max(uint256 a, uint256 b) private pure returns (uint256){
return (a<b)?b:a;
}
function smallZero(uint256 balance) private pure returns(uint256){
if (balance==0 ){
balance = 1;
}
return balance;
}
function sendETHToFee(uint256 amount) private {
//send to dev wallet
devWallet.transfer( amount.div(2) );
outreachMain.transfer( amount.div(2) );
}
function escapeTrappedETH() external {
uint256 ethBalance=address(this).balance;
if(ethBalance>0){
sendETHToFee(ethBalance);
}
}
receive() external payable {}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MaxTxAmountUpdated","inputs":[{"type":"uint256","name":"_maxTxAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Wallets","inputs":[{"type":"address","name":"_rewardsAddress","internalType":"address","indexed":false},{"type":"address","name":"_outreachWallet","internalType":"address","indexed":false},{"type":"address","name":"devWallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"resetClaimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address","indexed":false},{"type":"uint256","name":"pushHours","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"routerInfo","inputs":[{"type":"address","name":"_router","internalType":"address","indexed":false},{"type":"address","name":"_lp","internalType":"address","indexed":false},{"type":"bool","name":"state","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"sellTracker","inputs":[{"type":"uint256","name":"_sellRatio","internalType":"uint256","indexed":false},{"type":"uint256","name":"_claimTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"_userEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"_lastSpend","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"setClaimer","inputs":[{"type":"address","name":"claimer","internalType":"address","indexed":false},{"type":"bool","name":"state","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"settings","inputs":[{"type":"uint256","name":"_wipeFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"_waitTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"pushAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"tooMany","inputs":[{"type":"uint256","name":"_tooManySales","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"wipeClaim","inputs":[{"type":"address","name":"_user","internalType":"address","indexed":false},{"type":"uint256","name":"_claimTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTaxSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWalletSize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_pushAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxSwapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_userPushSpend","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rewards","internalType":"uint256"},{"type":"uint256","name":"outreach","internalType":"uint256"},{"type":"uint256","name":"dev","internalType":"uint256"}],"name":"buyTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"claimer","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableTrading","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"escapeTrappedETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFees","inputs":[{"type":"address[]","name":"wallets_","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"peanutBrain","internalType":"uint256"},{"type":"uint256","name":"babydoll","internalType":"uint256"},{"type":"uint256","name":"fan","internalType":"uint256"},{"type":"uint256","name":"friend","internalType":"uint256"},{"type":"uint256","name":"chad","internalType":"uint256"}],"name":"friendStatus","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"isClaimer","inputs":[{"type":"address","name":"_claimerAddress","internalType":"address"},{"type":"bool","name":"_state","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLP","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isRouter","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwapToLP","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"outreachWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pushTimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeExcluded","inputs":[{"type":"address[]","name":"wallets_","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"resetTimer","inputs":[{"type":"address","name":"_targetAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"rewardsAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellRatio","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rewards","internalType":"uint256"},{"type":"uint256","name":"outreach","internalType":"uint256"},{"type":"uint256","name":"dev","internalType":"uint256"}],"name":"sellTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouter","inputs":[{"type":"address","name":"_router","internalType":"address"},{"type":"address","name":"_lp","internalType":"address"},{"type":"bool","name":"_state","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWallets","inputs":[{"type":"address","name":"_rewardsAddress","internalType":"address"},{"type":"address","name":"_outreachWallet","internalType":"address"},{"type":"address","name":"_devWallet","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBuyTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSellTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalShareableTokens","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTooManySells","inputs":[{"type":"uint256","name":"_updateSellLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userClaimTimer","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userShare","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userStatus","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"lastEthSpend","internalType":"uint256"},{"type":"uint256","name":"totalEthSpend","internalType":"uint256"}],"name":"userTracker","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"waitSettings","inputs":[{"type":"uint256","name":"_wipeFee","internalType":"uint256"},{"type":"uint256","name":"_waitTime","internalType":"uint256"},{"type":"uint256","name":"_pushFactor","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"waitTime","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"wipeClaimTime","inputs":[{"type":"address","name":"_userAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wipeFee","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x600a80546001600160a01b031990811673a1077a294dde1b09bb078844df40758a5d0f9a27178255610150600c556002608081905260a0819052602060c0819052600d829055600e829055600f81905561014060405260e082905261010082905261012081905260108290556011919091556012556024601381905560145560158054821673ccd1e792752fbffde0e8bf1de1e7f473c9e33f8e17905560168054821673b8bf8d8ce14f092a21da559ae2a4ed84eff64b0917905560178054821673fbd806e9fb2b7bb353edde8725257f603a4bbd5c1790556018805490911673c6ab34235e4b2b7f42a3f6d78830e837608816671790556200010590600990620006b4565b62000115906301312d00620006cc565b601955620001266009600a620006b4565b620001369063017d7840620006cc565b601a55620001476009600a620006b4565b6200015690620b71b0620006cc565b601b55620001676009600a620006b4565b62000177906301312d00620006cc565b601c55620001886009600a620006b4565b62000195906064620006cc565b601d556040518060a0016040528069d3c21bcecceda10000006001620001bc9190620006cc565b8152602001620001d869d3c21bcecceda10000006004620006cc565b8152602001620001f469d3c21bcecceda10000006014620006cc565b81526020016200021069d3c21bcecceda10000006064620006cc565b81526020016200022d69d3c21bcecceda10000006101f4620006cc565b90528051601e55602080820151601f556040820151905560608101516021556080015160225569152d02c7e14af68000006023556064620002716009600a620006b4565b6200027e906032620006cc565b6200028a9190620006e6565b6024556026805463ffffffff60a01b1916600160b81b179055348015620002b057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350602580546001600160a01b03191673165c3410fc91ef562c50559f7d2289febed552d99081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000357573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037d919062000709565b600a546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620003cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f5919062000709565b602680546001600160a01b0319166001600160a01b0392909216919091179055620004236009600a620006b4565b6200043390633b9aca00620006cc565b3360009081526001602081905260408220929092556004906200045e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560255482168152602984528281208054861660019081179091556026549092168152602a8452828120805486168317905530815260049384905291822080549094168117909355620004db3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790556016548216815260049093528183208054851660019081179091556015549091168352912080549092161790556200053e3390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620005786009600a620006b4565b6200058890633b9aca00620006cc565b60405190815260200160405180910390a362000734565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005f6578160001904821115620005da57620005da6200059f565b80851615620005e857918102915b93841c9390800290620005ba565b509250929050565b6000826200060f57506001620006ae565b816200061e57506000620006ae565b8160018114620006375760028114620006425762000662565b6001915050620006ae565b60ff8411156200065657620006566200059f565b50506001821b620006ae565b5060208310610133831016604e8410600b841016171562000687575081810a620006ae565b620006938383620005b5565b8060001904821115620006aa57620006aa6200059f565b0290505b92915050565b6000620006c560ff841683620005fe565b9392505050565b8082028115828204841417620006ae57620006ae6200059f565b6000826200070457634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200071c57600080fd5b81516001600160a01b0381168114620006c557600080fd5b61329680620007446000396000f3fe6080604052600436106102e85760003560e01c8063715018a6116101905780639a109269116100dc578063c9d1e1d411610095578063dd62ed3e1161006f578063dd62ed3e14610978578063e5036549146109be578063f3d7d282146109de578063f9a0b07f14610a0e57600080fd5b8063c9d1e1d414610923578063cc1776d314610943578063ccca123b1461096257600080fd5b80639a1092691461085e578063a00d3b9814610873578063a9059cbb146108a0578063b5275b33146108c0578063bf474bed146108ed578063c0973eed1461090357600080fd5b80638a8c523c11610149578063926e980211610123578063926e9802146107a257806392f42870146107eb578063945a43251461080b57806395d89b411461082b57600080fd5b80638a8c523c146107595780638da5cb5b1461076e5780638f9a55c01461078c57600080fd5b8063715018a614610693578063751039fc146106a857806375cb1bd1146106bd578063789ef0e0146106dd5780637d1db4a5146107135780637df0f7671461072957600080fd5b806323b872dd1161024f5780633e0d99f8116102085780634f7041a5116101e25780634f7041a5146105f85780635e91d171146106325780636f2098a71461064857806370a082311461065d57600080fd5b80633e0d99f8146105ad57806346469afb146105c257806349bd5a5e146105d857600080fd5b806323b872dd146104e8578063313ce567146105085780633243db7c146105245780633744baf2146105445780633795ef921461056457806337abc8291461057757600080fd5b80630faee56f116102a15780630faee56f1461042957806313f6686d1461044d57806316aaf2dc1461047d57806318160ddd1461049d5780631bff7898146104b2578063225d29a1146104c857600080fd5b806301fac39b146102f457806303fd2a451461031657806306fdde03146103495780630771ec401461038a578063095ea7b3146103d95780630da00f8d1461040957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c25565b610a24565b005b34801561032257600080fd5b5061032c61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035557600080fd5b5060408051808201909152600f81526e29b7b6b6b4902330b7102a37b5b2b760891b60208201525b6040516103409190612cc2565b34801561039657600080fd5b50601e54601f546020546021546022546103b1949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610340565b3480156103e557600080fd5b506103f96103f4366004612d10565b610b06565b6040519015158152602001610340565b34801561041557600080fd5b50610314610424366004612d3a565b610b1d565b34801561043557600080fd5b5061043f601c5481565b604051908152602001610340565b34801561045957600080fd5b506103f9610468366004612d53565b60086020526000908152604090205460ff1681565b34801561048957600080fd5b50610314610498366004612d53565b610c7f565b3480156104a957600080fd5b5061043f610d4f565b3480156104be57600080fd5b5061043f60145481565b3480156104d457600080fd5b5061043f6104e3366004612d53565b610d70565b3480156104f457600080fd5b506103f9610503366004612d6e565b610e5b565b34801561051457600080fd5b5060405160098152602001610340565b34801561053057600080fd5b5061031461053f366004612dba565b610ec4565b34801561055057600080fd5b5060155461032c906001600160a01b031681565b610314610572366004612d53565b610f77565b34801561058357600080fd5b5061043f610592366004612d53565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50602b5461043f565b3480156105ce57600080fd5b5061043f60135481565b3480156105e457600080fd5b5060265461032c906001600160a01b031681565b34801561060457600080fd5b50600d54600e54600f5461061792919083565b60408051938452602084019290925290820152606001610340565b34801561063e57600080fd5b5061043f60235481565b34801561065457600080fd5b506103146111bc565b34801561066957600080fd5b5061043f610678366004612d53565b6001600160a01b031660009081526001602052604090205490565b34801561069f57600080fd5b50610314611216565b3480156106b457600080fd5b5061031461128a565b3480156106c957600080fd5b506103146106d8366004612dfd565b61133c565b3480156106e957600080fd5b5061043f6106f8366004612d53565b6001600160a01b031660009081526006602052604090205490565b34801561071f57600080fd5b5061043f60195481565b34801561073557600080fd5b506103f9610744366004612d53565b602a6020526000908152604090205460ff1681565b34801561076557600080fd5b506103146114db565b34801561077a57600080fd5b506000546001600160a01b031661032c565b34801561079857600080fd5b5061043f601a5481565b3480156107ae57600080fd5b506107d66107bd366004612d53565b6027602052600090815260409020805460019091015482565b60408051928352602083019190915201610340565b3480156107f757600080fd5b50610314610806366004612c25565b611578565b34801561081757600080fd5b50610314610826366004612d10565b611643565b34801561083757600080fd5b5060408051808201909152600a8152690465249454e44534849560b41b602082015261037d565b34801561086a57600080fd5b506103146117ea565b34801561087f57600080fd5b5061043f61088e366004612d53565b60286020526000908152604090205481565b3480156108ac57600080fd5b506103f96108bb366004612d10565b6117fd565b3480156108cc57600080fd5b5061043f6108db366004612d53565b60026020526000908152604090205481565b3480156108f957600080fd5b5061043f601b5481565b34801561090f57600080fd5b5060175461032c906001600160a01b031681565b34801561092f57600080fd5b5061031461093e366004612e37565b61180a565b34801561094f57600080fd5b5060105460115460125461061792919083565b34801561096e57600080fd5b5061043f600c5481565b34801561098457600080fd5b5061043f610993366004612e6a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103146109d9366004612e94565b6118ee565b3480156109ea57600080fd5b506103f96109f9366004612d53565b60296020526000908152604090205460ff1681565b348015610a1a57600080fd5b5061043f601d5481565b6016546001600160a01b0316336001600160a01b031614610a9a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204465762072656d6f7665206578636c756465642077616c6044820152646c6574732160d81b60648201526084015b60405180910390fd5b60005b8151811015610b0257600060046000848481518110610abe57610abe612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610afa81612eec565b915050610a9d565b5050565b6000610b13338484611aa1565b5060015b92915050565b6016546001600160a01b03163314610b775760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206465762063616e206368616e67652073656c6c206c696d697400006044820152606401610a91565b60008111610bc75760405162461bcd60e51b815260206004820152601760248201527f206d757374206265206d6f7265207468616e207a65726f0000000000000000006044820152606401610a91565b605f811115610c225760405162461bcd60e51b815260206004820152602160248201527f206d757374206265206c657373207468616e206f7220657175616c20746f20396044820152603560f81b6064820152608401610a91565b6064610c306009600a612fe9565b610c3a9083612ff8565b610c44919061300f565b60248190556040519081527f837a8b1d58cbfc20ae91cd1babf5cd456f7754fac4fb465f117e7c70b63ad4bd9060200160405180910390a150565b3360009081526008602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526016602482015275139bdd08184818db185a5b595c8818dbdb9d1c9858dd60521b6044820152606401610a91565b6000600c54610e10610ce99190612ff8565b610cf39042613031565b6001600160a01b038316600081815260076020908152604091829020849055815192835282018390529192507fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b291015b60405180910390a15050565b6000610d5d6009600a612fe9565b610d6b90633b9aca00612ff8565b905090565b6024546001600160a01b038216600090815260286020526040812054909182911115610b1757601e546001600160a01b0384166000908152602760205260409020541115610dbc575060005b601f546001600160a01b0384166000908152602760205260409020541115610de2575060015b602080546001600160a01b038516600090815260279092526040909120541115610e0a575060025b6021546001600160a01b0384166000908152602760205260409020541115610e30575060035b6022546001600160a01b0384166000908152602760205260409020541115610b175750600492915050565b6000610e68848484611bc5565b610eba8433610eb585604051806060016040528060288152602001613219602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190612655565b611aa1565b5060019392505050565b6016546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b038381166000818152602960209081526040808320805487151560ff199182168117909255958816808552602a845293829020805490961681179095558051938452908301919091528101919091527f8ec10c24e0994522b8e150e1ff701e5e18cf6d31db2c2d8ed335c6478532dbec906060015b60405180910390a1505050565b6023543414610fbd5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81dda5c19519959481c185a5960721b6044820152606401610a91565b336001600160a01b0382161461100e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420796f7572206163636f756e7420447564652160501b6044820152606401610a91565b61101781610d70565b60000361105c5760405162461bcd60e51b81526020600482015260136024820152727374617475732063616e74206265207a65726f60681b6044820152606401610a91565b6001600160a01b0381166000908152600960205260408120805460ff1916600117905561108882610d70565b6001600160a01b03831660009081526007602052604081205491925042906110c46110b4856001613031565b6110be848661307b565b9061268f565b6110ce9083613031565b90506110e66110e08362015180613031565b826126d8565b6001600160a01b03861660009081526007602090815260408083208490556023546027909252822080549396509092909190611123908490613031565b90915550506023546001600160a01b03861660009081526027602052604081206001018054909190611156908490613031565b909155505033600090815260096020908152604091829020805460ff1916905581516001600160a01b03881681529081018590527f607eb703d4a887ac87d10c5a2ca98f74d0ab1d3399b4c901f845cdfa0a70b6ae910160405180910390a15050505050565b6016546001600160a01b0316336001600160a01b0316146111dc57600080fd5b3060009081526001602052604090205480156112065761120661120182601c546126ed565b6126fc565b478015610b0257610b02816127c6565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a919061308e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a919061308e565b6112c06009600a612fe9565b6112ce90633b9aca00612ff8565b6019556112dd6009600a612fe9565b6112eb90633b9aca00612ff8565b601a557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61131b6009600a612fe9565b61132990633b9aca00612ff8565b60405190815260200160405180910390a1565b6016546001600160a01b031633146113665760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b0383166113bc5760405162461bcd60e51b815260206004820152601860248201527f72657761726473206164647265737320736574206173203000000000000000006044820152606401610a91565b6001600160a01b0381166114095760405162461bcd60e51b8152602060048201526014602482015273064657620616464726573732073657420617320360641b6044820152606401610a91565b6001600160a01b03821661145f5760405162461bcd60e51b815260206004820152601960248201527f6f757472656163682061646472657373207365742061732030000000000000006044820152606401610a91565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527fe277a3205602f91f1fae811585d3f19cefa47b079e8c9c4e6040a001dc83da1590606001610f6a565b6000546001600160a01b031633146115055760405162461bcd60e51b8152600401610a919061308e565b602654600160a01b900460ff161561155f5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20526571756972656d656e7420616c7265616479206d657400006044820152606401610a91565b6026805462ff00ff60a01b19166201000160a01b179055565b6016546001600160a01b0316336001600160a01b0316146115db5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920746865204465762063616e20616464206578636c73696f6e7321006044820152606401610a91565b60005b8151811015610b02576001600460008484815181106115ff576115ff612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061163b81612eec565b9150506115de565b601d54611651906002612ff8565b8110156116965760405162461bcd60e51b81526020600482015260136024820152727075736820616d6f756e7420746f6f206c6f7760681b6044820152606401610a91565b6001600160a01b0382166000908152600760205260409020546116fb5760405162461bcd60e51b815260206004820152601c60248201527f63616e206e6f74207075736820302074696d65722061646472657373000000006044820152606401610a91565b6000601d5490506000611722826110be85600c54610e1061171c9190612ff8565b9061284b565b6017549091506117469033906001600160a01b0316611741858761307b565b611bc5565b611751338584611bc5565b6001600160a01b03841660009081526007602052604081208054839290611779908490613031565b9091555050336000908152600260205260408120805485929061179d908490613031565b9091555050604080516001600160a01b0386168152602081018390527fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b2910160405180910390a150505050565b4780156117fa576117fa816127c6565b50565b6000610b13338484611bc5565b6016546001600160a01b031633146118345760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b03821660009081526008602052604090205481151560ff9091161515036118925760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610a91565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f3d4c415a8a71f46c48eeee09c3c448c960e6e93b447b7ef22f3709ba4b285fda9101610d43565b6016546001600160a01b031633146119185760405162461bcd60e51b8152600401610a9190613044565b600183118015611929575061271083105b6119755760405162461bcd60e51b815260206004820152601d60248201527f20776970652066656520697320736574206f7574206f662072616e67650000006044820152606401610a91565b6001821015801561198857506103048211155b6119c95760405162461bcd60e51b8152602060048201526012602482015271486f757273206f7574206f662072616e676560701b6044820152606401610a91565b6001811180156119da575061138881105b611a265760405162461bcd60e51b815260206004820152601860248201527f5075736820466163746f72206f7574206f662072616e676500000000000000006044820152606401610a91565b611a3983683635c9adc5dea00000612ff8565b602355600c829055611a4d6009600a612fe9565b611a579082612ff8565b601d819055602354600c546040805192835260208301919091528101919091527f067fdaea136031be3f08e3cef7fa31bcbdb923ad0da34a5edc37df2841161f8090606001610f6a565b6001600160a01b038316611b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a91565b6001600160a01b038216611b645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a91565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a91565b6001600160a01b038216611c8b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a91565b60008111611cec5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206d75737420626520626967676572207460448201526768616e207a65726f60c01b6064820152608401610a91565b600080600080600080611d076000546001600160a01b031690565b6001600160a01b0316896001600160a01b031614158015611d3657506000546001600160a01b03898116911614155b156121ac576001600160a01b0389166000908152602a602052604090205460ff168015611d7c57506001600160a01b03881660009081526029602052604090205460ff16155b8015611da157506001600160a01b03881660009081526004602052604090205460ff16155b1561203a57602654600160a01b900460ff16611df25760405162461bcd60e51b815260206004820152601060248201526f2a3930b234b733903737ba1037b832b760811b6044820152606401610a91565b601954871115611e445760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610a91565b601a5487611e678a6001600160a01b031660009081526001602052604090205490565b611e719190613031565b1115611ebf5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610a91565b600f54611ed5906103e8906110be908a9061284b565b9450611ef56103e86110be600d600101548a61284b90919063ffffffff16565b9350611f156103e86110be600d600001548a61284b90919063ffffffff16565b60408051600280825260608201835292955060009290916020830190803683375050600a5482519293506001600160a01b031691839150600090611f5b57611f5b612ec0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611f8f57611f8f612ec0565b6001600160a01b0392831660209182029290920101526025546040516307c0329d60e21b81526000929190911690631f00ca7490611fd3908c908690600401613107565b600060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120189190810190613128565b90508060008151811061202d5761202d612ec0565b6020026020010151935050505b6001600160a01b0388166000908152602a602052604090205460ff16801561206b57506001600160a01b0389163014155b156120c957601254612086906103e8906110be908a9061284b565b94506120a66103e86110be6010600101548a61284b90919063ffffffff16565b93506120c66103e86110be6010600001548a61284b90919063ffffffff16565b92505b30600090815260016020526040902054602654600160a81b900460ff1615801561210b57506001600160a01b0389166000908152602a602052604090205460ff165b80156121205750602654600160b01b900460ff165b801561212d5750601b5481115b1561215c5761214a6112018961214584601c546126ed565b6126ed565b47801561215a5761215a476127c6565b505b836121678688613031565b6121719190613031565b965061217d88886128cd565b6001600160a01b038b16600090815260056020526040812080549091906121a5908490613031565b9091555050505b85156122c95730600090815260016020526040812080548792906121d1908490613031565b90915550506015546001600160a01b031660009081526001602052604081208054869290612200908490613031565b90915550506017546001600160a01b03166000908152600160205260408120805485929061222f908490613031565b909155505060405185815230906001600160a01b038b16906000805160206132418339815191529060200160405180910390a36015546040518581526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a36017546040518481526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a35b6001600160a01b0389166000908152600160205260409020546122ec90886128cd565b6001600160a01b038a1660009081526001602052604090205561233161231288886128cd565b6001600160a01b038a166000908152600160205260409020549061290f565b6001600160a01b03808a166000818152600160205260409020929092558a166000805160206132418339815191526123698a8a6128cd565b60405190815260200160405180910390a3506001600160a01b0380881660009081526001602052604080822054928b1682528120546123a79061296e565b6001600160a01b038b16600090815260056020526040812054919250906123e9906123d3908490613031565b6110be6123e26009600a612fe9565b859061284b565b6001600160a01b038c16600090815260286020526040902081905590508215801561242a57506001600160a01b038a16600090815260056020526040902054155b1561244f5761243b6009600a612fe9565b506001600160a01b038a1660005260286020525b8060245411156124b2576001600160a01b038a16600090815260066020526040902054602b5461247e916128cd565b602b556001600160a01b038a1660009081526027602090815260408083208390556006825280832083905560079091528120555b83156125dd576124f3600c54610e106124cb9190612ff8565b6124d59042613031565b6001600160a01b038c166000908152600760205260409020546126d8565b6001600160a01b038b16600090815260076020908152604080832093909355602790529081208054869290612529908490613031565b90915550506001600160a01b038a1660009081526027602052604081206001018054869290612559908490613031565b9091555050601f546001600160a01b038b16600090815260276020526040902054118015612588575080602454105b156125dd576001600160a01b038a16600090815260066020526040902054602b546125be91906125b8908661290f565b906128cd565b602b556001600160a01b038a1660009081526006602052604090208390555b6001600160a01b038a16600090815260076020908152604080832054602783529281902054815185815292830193909352810186905260608101919091527f15c328e1a6d692085b8934e30c1e8865234b72873bc2a01c7399ba36af9627ed9060800160405180910390a15050505050505050505050565b600081848411156126795760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661307b565b95945050505050565b60006126d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612981565b9392505050565b60008183106126e757826126d1565b50919050565b60008183116126e757826126d1565b6026805460ff60a81b1916600160a81b179055600061272160646110be84601461284b565b9050600061273082600261268f565b9050600061273e828461307b565b90504761275361274e848761307b565b6129af565b600061276460036110be844761307b565b90506127708382612aca565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506026805460ff60a81b1916905550505050565b6016546001600160a01b03166108fc6127e083600261268f565b6040518115909202916000818181858888f19350505050158015612808573d6000803e3d6000fd5b506018546001600160a01b03166108fc61282383600261268f565b6040518115909202916000818181858888f19350505050158015610b02573d6000803e3d6000fd5b60008260000361285d57506000610b17565b60006128698385612ff8565b905082612876858361300f565b146126d15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a91565b60006126d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612655565b60008061291c8385613031565b9050838110156126d15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a91565b60008160000361297d57600191505b5090565b600081836129a25760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661300f565b6026805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106129f7576129f7612ec0565b6001600160a01b039283166020918202929092010152600a54825191169082906001908110612a2857612a28612ec0565b6001600160a01b039283166020918202929092010152602554612a4e9130911684611aa1565b60255460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a879085906000908690309042906004016131ae565b600060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b50506026805460ff60a81b1916905550505050565b6026805460ff60a81b1916600160a81b179055602554612af59030906001600160a01b031684611aa1565b60255460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b65573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b8a91906131ea565b50506026805460ff60a81b19169055505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bdd57612bdd612b9e565b604052919050565b600067ffffffffffffffff821115612bff57612bff612b9e565b5060051b60200190565b80356001600160a01b0381168114612c2057600080fd5b919050565b60006020808385031215612c3857600080fd5b823567ffffffffffffffff811115612c4f57600080fd5b8301601f81018513612c6057600080fd5b8035612c73612c6e82612be5565b612bb4565b81815260059190911b82018301908381019087831115612c9257600080fd5b928401925b82841015612cb757612ca884612c09565b82529284019290840190612c97565b979650505050505050565b600060208083528351808285015260005b81811015612cef57858101830151858201604001528201612cd3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612d2357600080fd5b612d2c83612c09565b946020939093013593505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b6126d182612c09565b600080600060608486031215612d8357600080fd5b612d8c84612c09565b9250612d9a60208501612c09565b9150604084013590509250925092565b80358015158114612c2057600080fd5b600080600060608486031215612dcf57600080fd5b612dd884612c09565b9250612de660208501612c09565b9150612df460408501612daa565b90509250925092565b600080600060608486031215612e1257600080fd5b612e1b84612c09565b9250612e2960208501612c09565b9150612df460408501612c09565b60008060408385031215612e4a57600080fd5b612e5383612c09565b9150612e6160208401612daa565b90509250929050565b60008060408385031215612e7d57600080fd5b612e8683612c09565b9150612e6160208401612c09565b600080600060608486031215612ea957600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612efe57612efe612ed6565b5060010190565b600181815b80851115612f40578160001904821115612f2657612f26612ed6565b80851615612f3357918102915b93841c9390800290612f0a565b509250929050565b600082612f5757506001610b17565b81612f6457506000610b17565b8160018114612f7a5760028114612f8457612fa0565b6001915050610b17565b60ff841115612f9557612f95612ed6565b50506001821b610b17565b5060208310610133831016604e8410600b8410161715612fc3575081810a610b17565b612fcd8383612f05565b8060001904821115612fe157612fe1612ed6565b029392505050565b60006126d160ff841683612f48565b8082028115828204841417610b1757610b17612ed6565b60008261302c57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b1757610b17612ed6565b60208082526019908201527f4f6e6c7920746865204465762063616e20646f20746869732100000000000000604082015260600190565b81810381811115610b1757610b17612ed6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081518084526020808501945080840160005b838110156130fc5781516001600160a01b0316875295820195908201906001016130d7565b509495945050505050565b82815260406020820152600061312060408301846130c3565b949350505050565b6000602080838503121561313b57600080fd5b825167ffffffffffffffff81111561315257600080fd5b8301601f8101851361316357600080fd5b8051613171612c6e82612be5565b81815260059190911b8201830190838101908783111561319057600080fd5b928401925b82841015612cb757835182529284019290840190613195565b85815284602082015260a0604082015260006131cd60a08301866130c3565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156131ff57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f4fa5095b1b79f06eeeb9501b784018806d07388d0cf5c4cbbeb469972de62b364736f6c63430008130033
Deployed ByteCode
0x6080604052600436106102e85760003560e01c8063715018a6116101905780639a109269116100dc578063c9d1e1d411610095578063dd62ed3e1161006f578063dd62ed3e14610978578063e5036549146109be578063f3d7d282146109de578063f9a0b07f14610a0e57600080fd5b8063c9d1e1d414610923578063cc1776d314610943578063ccca123b1461096257600080fd5b80639a1092691461085e578063a00d3b9814610873578063a9059cbb146108a0578063b5275b33146108c0578063bf474bed146108ed578063c0973eed1461090357600080fd5b80638a8c523c11610149578063926e980211610123578063926e9802146107a257806392f42870146107eb578063945a43251461080b57806395d89b411461082b57600080fd5b80638a8c523c146107595780638da5cb5b1461076e5780638f9a55c01461078c57600080fd5b8063715018a614610693578063751039fc146106a857806375cb1bd1146106bd578063789ef0e0146106dd5780637d1db4a5146107135780637df0f7671461072957600080fd5b806323b872dd1161024f5780633e0d99f8116102085780634f7041a5116101e25780634f7041a5146105f85780635e91d171146106325780636f2098a71461064857806370a082311461065d57600080fd5b80633e0d99f8146105ad57806346469afb146105c257806349bd5a5e146105d857600080fd5b806323b872dd146104e8578063313ce567146105085780633243db7c146105245780633744baf2146105445780633795ef921461056457806337abc8291461057757600080fd5b80630faee56f116102a15780630faee56f1461042957806313f6686d1461044d57806316aaf2dc1461047d57806318160ddd1461049d5780631bff7898146104b2578063225d29a1146104c857600080fd5b806301fac39b146102f457806303fd2a451461031657806306fdde03146103495780630771ec401461038a578063095ea7b3146103d95780630da00f8d1461040957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c25565b610a24565b005b34801561032257600080fd5b5061032c61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035557600080fd5b5060408051808201909152600f81526e29b7b6b6b4902330b7102a37b5b2b760891b60208201525b6040516103409190612cc2565b34801561039657600080fd5b50601e54601f546020546021546022546103b1949392919085565b604080519586526020860194909452928401919091526060830152608082015260a001610340565b3480156103e557600080fd5b506103f96103f4366004612d10565b610b06565b6040519015158152602001610340565b34801561041557600080fd5b50610314610424366004612d3a565b610b1d565b34801561043557600080fd5b5061043f601c5481565b604051908152602001610340565b34801561045957600080fd5b506103f9610468366004612d53565b60086020526000908152604090205460ff1681565b34801561048957600080fd5b50610314610498366004612d53565b610c7f565b3480156104a957600080fd5b5061043f610d4f565b3480156104be57600080fd5b5061043f60145481565b3480156104d457600080fd5b5061043f6104e3366004612d53565b610d70565b3480156104f457600080fd5b506103f9610503366004612d6e565b610e5b565b34801561051457600080fd5b5060405160098152602001610340565b34801561053057600080fd5b5061031461053f366004612dba565b610ec4565b34801561055057600080fd5b5060155461032c906001600160a01b031681565b610314610572366004612d53565b610f77565b34801561058357600080fd5b5061043f610592366004612d53565b6001600160a01b031660009081526007602052604090205490565b3480156105b957600080fd5b50602b5461043f565b3480156105ce57600080fd5b5061043f60135481565b3480156105e457600080fd5b5060265461032c906001600160a01b031681565b34801561060457600080fd5b50600d54600e54600f5461061792919083565b60408051938452602084019290925290820152606001610340565b34801561063e57600080fd5b5061043f60235481565b34801561065457600080fd5b506103146111bc565b34801561066957600080fd5b5061043f610678366004612d53565b6001600160a01b031660009081526001602052604090205490565b34801561069f57600080fd5b50610314611216565b3480156106b457600080fd5b5061031461128a565b3480156106c957600080fd5b506103146106d8366004612dfd565b61133c565b3480156106e957600080fd5b5061043f6106f8366004612d53565b6001600160a01b031660009081526006602052604090205490565b34801561071f57600080fd5b5061043f60195481565b34801561073557600080fd5b506103f9610744366004612d53565b602a6020526000908152604090205460ff1681565b34801561076557600080fd5b506103146114db565b34801561077a57600080fd5b506000546001600160a01b031661032c565b34801561079857600080fd5b5061043f601a5481565b3480156107ae57600080fd5b506107d66107bd366004612d53565b6027602052600090815260409020805460019091015482565b60408051928352602083019190915201610340565b3480156107f757600080fd5b50610314610806366004612c25565b611578565b34801561081757600080fd5b50610314610826366004612d10565b611643565b34801561083757600080fd5b5060408051808201909152600a8152690465249454e44534849560b41b602082015261037d565b34801561086a57600080fd5b506103146117ea565b34801561087f57600080fd5b5061043f61088e366004612d53565b60286020526000908152604090205481565b3480156108ac57600080fd5b506103f96108bb366004612d10565b6117fd565b3480156108cc57600080fd5b5061043f6108db366004612d53565b60026020526000908152604090205481565b3480156108f957600080fd5b5061043f601b5481565b34801561090f57600080fd5b5060175461032c906001600160a01b031681565b34801561092f57600080fd5b5061031461093e366004612e37565b61180a565b34801561094f57600080fd5b5060105460115460125461061792919083565b34801561096e57600080fd5b5061043f600c5481565b34801561098457600080fd5b5061043f610993366004612e6a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103146109d9366004612e94565b6118ee565b3480156109ea57600080fd5b506103f96109f9366004612d53565b60296020526000908152604090205460ff1681565b348015610a1a57600080fd5b5061043f601d5481565b6016546001600160a01b0316336001600160a01b031614610a9a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865204465762072656d6f7665206578636c756465642077616c6044820152646c6574732160d81b60648201526084015b60405180910390fd5b60005b8151811015610b0257600060046000848481518110610abe57610abe612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610afa81612eec565b915050610a9d565b5050565b6000610b13338484611aa1565b5060015b92915050565b6016546001600160a01b03163314610b775760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206465762063616e206368616e67652073656c6c206c696d697400006044820152606401610a91565b60008111610bc75760405162461bcd60e51b815260206004820152601760248201527f206d757374206265206d6f7265207468616e207a65726f0000000000000000006044820152606401610a91565b605f811115610c225760405162461bcd60e51b815260206004820152602160248201527f206d757374206265206c657373207468616e206f7220657175616c20746f20396044820152603560f81b6064820152608401610a91565b6064610c306009600a612fe9565b610c3a9083612ff8565b610c44919061300f565b60248190556040519081527f837a8b1d58cbfc20ae91cd1babf5cd456f7754fac4fb465f117e7c70b63ad4bd9060200160405180910390a150565b3360009081526008602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526016602482015275139bdd08184818db185a5b595c8818dbdb9d1c9858dd60521b6044820152606401610a91565b6000600c54610e10610ce99190612ff8565b610cf39042613031565b6001600160a01b038316600081815260076020908152604091829020849055815192835282018390529192507fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b291015b60405180910390a15050565b6000610d5d6009600a612fe9565b610d6b90633b9aca00612ff8565b905090565b6024546001600160a01b038216600090815260286020526040812054909182911115610b1757601e546001600160a01b0384166000908152602760205260409020541115610dbc575060005b601f546001600160a01b0384166000908152602760205260409020541115610de2575060015b602080546001600160a01b038516600090815260279092526040909120541115610e0a575060025b6021546001600160a01b0384166000908152602760205260409020541115610e30575060035b6022546001600160a01b0384166000908152602760205260409020541115610b175750600492915050565b6000610e68848484611bc5565b610eba8433610eb585604051806060016040528060288152602001613219602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190612655565b611aa1565b5060019392505050565b6016546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b038381166000818152602960209081526040808320805487151560ff199182168117909255958816808552602a845293829020805490961681179095558051938452908301919091528101919091527f8ec10c24e0994522b8e150e1ff701e5e18cf6d31db2c2d8ed335c6478532dbec906060015b60405180910390a1505050565b6023543414610fbd5760405162461bcd60e51b815260206004820152601260248201527115dc9bdb99c81dda5c19519959481c185a5960721b6044820152606401610a91565b336001600160a01b0382161461100e5760405162461bcd60e51b81526020600482015260166024820152754e6f7420796f7572206163636f756e7420447564652160501b6044820152606401610a91565b61101781610d70565b60000361105c5760405162461bcd60e51b81526020600482015260136024820152727374617475732063616e74206265207a65726f60681b6044820152606401610a91565b6001600160a01b0381166000908152600960205260408120805460ff1916600117905561108882610d70565b6001600160a01b03831660009081526007602052604081205491925042906110c46110b4856001613031565b6110be848661307b565b9061268f565b6110ce9083613031565b90506110e66110e08362015180613031565b826126d8565b6001600160a01b03861660009081526007602090815260408083208490556023546027909252822080549396509092909190611123908490613031565b90915550506023546001600160a01b03861660009081526027602052604081206001018054909190611156908490613031565b909155505033600090815260096020908152604091829020805460ff1916905581516001600160a01b03881681529081018590527f607eb703d4a887ac87d10c5a2ca98f74d0ab1d3399b4c901f845cdfa0a70b6ae910160405180910390a15050505050565b6016546001600160a01b0316336001600160a01b0316146111dc57600080fd5b3060009081526001602052604090205480156112065761120661120182601c546126ed565b6126fc565b478015610b0257610b02816127c6565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a919061308e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112b45760405162461bcd60e51b8152600401610a919061308e565b6112c06009600a612fe9565b6112ce90633b9aca00612ff8565b6019556112dd6009600a612fe9565b6112eb90633b9aca00612ff8565b601a557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf61131b6009600a612fe9565b61132990633b9aca00612ff8565b60405190815260200160405180910390a1565b6016546001600160a01b031633146113665760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b0383166113bc5760405162461bcd60e51b815260206004820152601860248201527f72657761726473206164647265737320736574206173203000000000000000006044820152606401610a91565b6001600160a01b0381166114095760405162461bcd60e51b8152602060048201526014602482015273064657620616464726573732073657420617320360641b6044820152606401610a91565b6001600160a01b03821661145f5760405162461bcd60e51b815260206004820152601960248201527f6f757472656163682061646472657373207365742061732030000000000000006044820152606401610a91565b601780546001600160a01b038581166001600160a01b0319928316811790935560158054868316908416811790915560168054928616929093168217909255604080519384526020840192909252908201527fe277a3205602f91f1fae811585d3f19cefa47b079e8c9c4e6040a001dc83da1590606001610f6a565b6000546001600160a01b031633146115055760405162461bcd60e51b8152600401610a919061308e565b602654600160a01b900460ff161561155f5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20526571756972656d656e7420616c7265616479206d657400006044820152606401610a91565b6026805462ff00ff60a01b19166201000160a01b179055565b6016546001600160a01b0316336001600160a01b0316146115db5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920746865204465762063616e20616464206578636c73696f6e7321006044820152606401610a91565b60005b8151811015610b02576001600460008484815181106115ff576115ff612ec0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061163b81612eec565b9150506115de565b601d54611651906002612ff8565b8110156116965760405162461bcd60e51b81526020600482015260136024820152727075736820616d6f756e7420746f6f206c6f7760681b6044820152606401610a91565b6001600160a01b0382166000908152600760205260409020546116fb5760405162461bcd60e51b815260206004820152601c60248201527f63616e206e6f74207075736820302074696d65722061646472657373000000006044820152606401610a91565b6000601d5490506000611722826110be85600c54610e1061171c9190612ff8565b9061284b565b6017549091506117469033906001600160a01b0316611741858761307b565b611bc5565b611751338584611bc5565b6001600160a01b03841660009081526007602052604081208054839290611779908490613031565b9091555050336000908152600260205260408120805485929061179d908490613031565b9091555050604080516001600160a01b0386168152602081018390527fc0b6769d5ea4634ef7c7c481bea7d34c31486822e7ed03e7c3844c79f9aca4b2910160405180910390a150505050565b4780156117fa576117fa816127c6565b50565b6000610b13338484611bc5565b6016546001600160a01b031633146118345760405162461bcd60e51b8152600401610a9190613044565b6001600160a01b03821660009081526008602052604090205481151560ff9091161515036118925760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610a91565b6001600160a01b038216600081815260086020908152604091829020805460ff19168515159081179091558251938452908301527f3d4c415a8a71f46c48eeee09c3c448c960e6e93b447b7ef22f3709ba4b285fda9101610d43565b6016546001600160a01b031633146119185760405162461bcd60e51b8152600401610a9190613044565b600183118015611929575061271083105b6119755760405162461bcd60e51b815260206004820152601d60248201527f20776970652066656520697320736574206f7574206f662072616e67650000006044820152606401610a91565b6001821015801561198857506103048211155b6119c95760405162461bcd60e51b8152602060048201526012602482015271486f757273206f7574206f662072616e676560701b6044820152606401610a91565b6001811180156119da575061138881105b611a265760405162461bcd60e51b815260206004820152601860248201527f5075736820466163746f72206f7574206f662072616e676500000000000000006044820152606401610a91565b611a3983683635c9adc5dea00000612ff8565b602355600c829055611a4d6009600a612fe9565b611a579082612ff8565b601d819055602354600c546040805192835260208301919091528101919091527f067fdaea136031be3f08e3cef7fa31bcbdb923ad0da34a5edc37df2841161f8090606001610f6a565b6001600160a01b038316611b035760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a91565b6001600160a01b038216611b645760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a91565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a91565b6001600160a01b038216611c8b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a91565b60008111611cec5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206d75737420626520626967676572207460448201526768616e207a65726f60c01b6064820152608401610a91565b600080600080600080611d076000546001600160a01b031690565b6001600160a01b0316896001600160a01b031614158015611d3657506000546001600160a01b03898116911614155b156121ac576001600160a01b0389166000908152602a602052604090205460ff168015611d7c57506001600160a01b03881660009081526029602052604090205460ff16155b8015611da157506001600160a01b03881660009081526004602052604090205460ff16155b1561203a57602654600160a01b900460ff16611df25760405162461bcd60e51b815260206004820152601060248201526f2a3930b234b733903737ba1037b832b760811b6044820152606401610a91565b601954871115611e445760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610a91565b601a5487611e678a6001600160a01b031660009081526001602052604090205490565b611e719190613031565b1115611ebf5760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610a91565b600f54611ed5906103e8906110be908a9061284b565b9450611ef56103e86110be600d600101548a61284b90919063ffffffff16565b9350611f156103e86110be600d600001548a61284b90919063ffffffff16565b60408051600280825260608201835292955060009290916020830190803683375050600a5482519293506001600160a01b031691839150600090611f5b57611f5b612ec0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611f8f57611f8f612ec0565b6001600160a01b0392831660209182029290920101526025546040516307c0329d60e21b81526000929190911690631f00ca7490611fd3908c908690600401613107565b600060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120189190810190613128565b90508060008151811061202d5761202d612ec0565b6020026020010151935050505b6001600160a01b0388166000908152602a602052604090205460ff16801561206b57506001600160a01b0389163014155b156120c957601254612086906103e8906110be908a9061284b565b94506120a66103e86110be6010600101548a61284b90919063ffffffff16565b93506120c66103e86110be6010600001548a61284b90919063ffffffff16565b92505b30600090815260016020526040902054602654600160a81b900460ff1615801561210b57506001600160a01b0389166000908152602a602052604090205460ff165b80156121205750602654600160b01b900460ff165b801561212d5750601b5481115b1561215c5761214a6112018961214584601c546126ed565b6126ed565b47801561215a5761215a476127c6565b505b836121678688613031565b6121719190613031565b965061217d88886128cd565b6001600160a01b038b16600090815260056020526040812080549091906121a5908490613031565b9091555050505b85156122c95730600090815260016020526040812080548792906121d1908490613031565b90915550506015546001600160a01b031660009081526001602052604081208054869290612200908490613031565b90915550506017546001600160a01b03166000908152600160205260408120805485929061222f908490613031565b909155505060405185815230906001600160a01b038b16906000805160206132418339815191529060200160405180910390a36015546040518581526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a36017546040518481526001600160a01b03918216918b16906000805160206132418339815191529060200160405180910390a35b6001600160a01b0389166000908152600160205260409020546122ec90886128cd565b6001600160a01b038a1660009081526001602052604090205561233161231288886128cd565b6001600160a01b038a166000908152600160205260409020549061290f565b6001600160a01b03808a166000818152600160205260409020929092558a166000805160206132418339815191526123698a8a6128cd565b60405190815260200160405180910390a3506001600160a01b0380881660009081526001602052604080822054928b1682528120546123a79061296e565b6001600160a01b038b16600090815260056020526040812054919250906123e9906123d3908490613031565b6110be6123e26009600a612fe9565b859061284b565b6001600160a01b038c16600090815260286020526040902081905590508215801561242a57506001600160a01b038a16600090815260056020526040902054155b1561244f5761243b6009600a612fe9565b506001600160a01b038a1660005260286020525b8060245411156124b2576001600160a01b038a16600090815260066020526040902054602b5461247e916128cd565b602b556001600160a01b038a1660009081526027602090815260408083208390556006825280832083905560079091528120555b83156125dd576124f3600c54610e106124cb9190612ff8565b6124d59042613031565b6001600160a01b038c166000908152600760205260409020546126d8565b6001600160a01b038b16600090815260076020908152604080832093909355602790529081208054869290612529908490613031565b90915550506001600160a01b038a1660009081526027602052604081206001018054869290612559908490613031565b9091555050601f546001600160a01b038b16600090815260276020526040902054118015612588575080602454105b156125dd576001600160a01b038a16600090815260066020526040902054602b546125be91906125b8908661290f565b906128cd565b602b556001600160a01b038a1660009081526006602052604090208390555b6001600160a01b038a16600090815260076020908152604080832054602783529281902054815185815292830193909352810186905260608101919091527f15c328e1a6d692085b8934e30c1e8865234b72873bc2a01c7399ba36af9627ed9060800160405180910390a15050505050505050505050565b600081848411156126795760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661307b565b95945050505050565b60006126d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612981565b9392505050565b60008183106126e757826126d1565b50919050565b60008183116126e757826126d1565b6026805460ff60a81b1916600160a81b179055600061272160646110be84601461284b565b9050600061273082600261268f565b9050600061273e828461307b565b90504761275361274e848761307b565b6129af565b600061276460036110be844761307b565b90506127708382612aca565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506026805460ff60a81b1916905550505050565b6016546001600160a01b03166108fc6127e083600261268f565b6040518115909202916000818181858888f19350505050158015612808573d6000803e3d6000fd5b506018546001600160a01b03166108fc61282383600261268f565b6040518115909202916000818181858888f19350505050158015610b02573d6000803e3d6000fd5b60008260000361285d57506000610b17565b60006128698385612ff8565b905082612876858361300f565b146126d15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a91565b60006126d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612655565b60008061291c8385613031565b9050838110156126d15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a91565b60008160000361297d57600191505b5090565b600081836129a25760405162461bcd60e51b8152600401610a919190612cc2565b506000612686848661300f565b6026805460ff60a81b1916600160a81b17905560408051600280825260608201835260009260208301908036833701905050905030816000815181106129f7576129f7612ec0565b6001600160a01b039283166020918202929092010152600a54825191169082906001908110612a2857612a28612ec0565b6001600160a01b039283166020918202929092010152602554612a4e9130911684611aa1565b60255460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a879085906000908690309042906004016131ae565b600060405180830381600087803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b50506026805460ff60a81b1916905550505050565b6026805460ff60a81b1916600160a81b179055602554612af59030906001600160a01b031684611aa1565b60255460155460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b65573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b8a91906131ea565b50506026805460ff60a81b19169055505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612bdd57612bdd612b9e565b604052919050565b600067ffffffffffffffff821115612bff57612bff612b9e565b5060051b60200190565b80356001600160a01b0381168114612c2057600080fd5b919050565b60006020808385031215612c3857600080fd5b823567ffffffffffffffff811115612c4f57600080fd5b8301601f81018513612c6057600080fd5b8035612c73612c6e82612be5565b612bb4565b81815260059190911b82018301908381019087831115612c9257600080fd5b928401925b82841015612cb757612ca884612c09565b82529284019290840190612c97565b979650505050505050565b600060208083528351808285015260005b81811015612cef57858101830151858201604001528201612cd3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612d2357600080fd5b612d2c83612c09565b946020939093013593505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b6126d182612c09565b600080600060608486031215612d8357600080fd5b612d8c84612c09565b9250612d9a60208501612c09565b9150604084013590509250925092565b80358015158114612c2057600080fd5b600080600060608486031215612dcf57600080fd5b612dd884612c09565b9250612de660208501612c09565b9150612df460408501612daa565b90509250925092565b600080600060608486031215612e1257600080fd5b612e1b84612c09565b9250612e2960208501612c09565b9150612df460408501612c09565b60008060408385031215612e4a57600080fd5b612e5383612c09565b9150612e6160208401612daa565b90509250929050565b60008060408385031215612e7d57600080fd5b612e8683612c09565b9150612e6160208401612c09565b600080600060608486031215612ea957600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612efe57612efe612ed6565b5060010190565b600181815b80851115612f40578160001904821115612f2657612f26612ed6565b80851615612f3357918102915b93841c9390800290612f0a565b509250929050565b600082612f5757506001610b17565b81612f6457506000610b17565b8160018114612f7a5760028114612f8457612fa0565b6001915050610b17565b60ff841115612f9557612f95612ed6565b50506001821b610b17565b5060208310610133831016604e8410600b8410161715612fc3575081810a610b17565b612fcd8383612f05565b8060001904821115612fe157612fe1612ed6565b029392505050565b60006126d160ff841683612f48565b8082028115828204841417610b1757610b17612ed6565b60008261302c57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b1757610b17612ed6565b60208082526019908201527f4f6e6c7920746865204465762063616e20646f20746869732100000000000000604082015260600190565b81810381811115610b1757610b17612ed6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081518084526020808501945080840160005b838110156130fc5781516001600160a01b0316875295820195908201906001016130d7565b509495945050505050565b82815260406020820152600061312060408301846130c3565b949350505050565b6000602080838503121561313b57600080fd5b825167ffffffffffffffff81111561315257600080fd5b8301601f8101851361316357600080fd5b8051613171612c6e82612be5565b81815260059190911b8201830190838101908783111561319057600080fd5b928401925b82841015612cb757835182529284019290840190613195565b85815284602082015260a0604082015260006131cd60a08301866130c3565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156131ff57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f4fa5095b1b79f06eeeb9501b784018806d07388d0cf5c4cbbeb469972de62b364736f6c63430008130033