Contract Address Details

0x1e6e8D1CA1527Ef54dAE9b51c0B9Fc6b73D3c62C

Contract Name
ETCHODL
Creator
0x504927–4125e2 at 0x1d35e5–195e5d
Balance
0 ETC ( )
Tokens
Fetching tokens...
Transactions
131 Transactions
Transfers
0 Transfers
Gas Used
22,291,025
Last Balance Update
15442354
Contract name:
ETCHODL




Optimization enabled
false
Compiler version
v0.5.10+commit.5a6ea5b1




EVM Version
default




Verified at
2021-05-13T17:59:41.158249Z

Constructor Arguments

00000000000000000000000050492711c39cda016774ed0ebb3125633e4125e2000000000000000000000000339dc9172939dfb65def723a89478f7e929cd92a000000000000000000000000000000000000000000000000000001796b9b33a0

Arg [0] (address) : 0x50492711c39cda016774ed0ebb3125633e4125e2
Arg [1] (address) : 0x339dc9172939dfb65def723a89478f7e929cd92a
Arg [2] (uint256) : 1621008004000

              

Contract source code

/*1621008004000
 *
 *   [USAGE INSTRUCTION]
 *
 *   1) Connect browser extension Metamask
 *   2) Choose one of the tariff plans, enter the ETC amount (0.1 ETC minimum) using our website "Stake ETC" button
 *   3) Wait for your earnings
 *   4) Withdraw earnings any time using our website "Withdraw" button
 *
 *   [INVESTMENT CONDITIONS]
 *
 *   - Basic interest rate: +0.2% every 24 hours (~0.008% hourly) - only for new deposits
 *   - Minimal deposit: 0.1 ETC, no maximal limit
 *   - Total income: based on your tarrif plan (from 1% to 4% daily!!!) + Basic interest rate !!!
 *   - Earnings every moment, withdraw any time (if you use capitalization of interest you can withdraw only after end of your deposit or you can terminate their stakes and get 75% of their fund back while the remaining goes into the pool. (plan 1,2,3,4 are not allowed to terminate after withdrawing interest)
 *
 *   [AFFILIATE PROGRAM]
 *
 *   - 3-level referral commission: 4% - 2% - 1%
*/

pragma solidity >=0.4.22 <0.9.0;

contract ETCHODL {
	using SafeMath for uint256;

	uint256 constant public INVEST_MIN_AMOUNT = 0.1 ether;
	uint256[] public REFERRAL_PERCENTS = [40, 20, 10];
	uint256 constant public PERCENT_STEP = 1;
	uint256 constant public PERCENTS_DIVIDER = 1000;
	uint256 constant public TIME_STEP = 1 days;
	uint256 public constant PENALTY_STEP = 250;

	uint256 public totalStaked;
	uint256 public totalRefBonus;

    struct Plan {
        uint256 time;
        uint256 percent;
    }

    Plan[] internal plans;

	struct Deposit {
        uint8 plan;
		uint256 percent;
		uint256 amount;
		uint256 profit;
		uint256 start;
		uint256 finish;
	}

	struct User {
		Deposit[] deposits;
		uint256 checkpoint;
		address referrer;
		uint256[3] levels;
		uint256 bonus;
		uint256 totalBonus;
	}

	mapping (address => User) internal users;

	uint256 public startUNIX;
	address payable public dev;
	address payable public pro;
	
	event Newbie(address user);
	event NewDeposit(address indexed user, uint8 plan, uint256 percent, uint256 amount, uint256 profit, uint256 start, uint256 finish);
	event Withdrawn(address indexed user, uint256 amount);
	event ForceWithdrawn(address indexed user, uint256 amount, uint256 penaltyAmount);
	event RefBonus(address indexed referrer, address indexed referral, uint256 indexed level, uint256 amount);
	event FeePayed(address indexed user, uint256 totalAmount);

	constructor(address payable _dev, address payable _pro, uint256 startDate) public {
		require(!isContract(_dev));
		require(startDate > 0);
		dev = _dev;
     	pro = _pro;		
		startUNIX = startDate;

        plans.push(Plan(40, 35));
        plans.push(Plan(80, 25));
        plans.push(Plan(150, 18));
		plans.push(Plan(250, 13));
        plans.push(Plan(40, 35));
        plans.push(Plan(80, 25));
        plans.push(Plan(150, 18));
		plans.push(Plan(250, 13));
	}

	function invest(address referrer, uint8 plan) public payable {
		require(msg.value >= INVEST_MIN_AMOUNT);
        require(plan < 8, "Invalid plan");

        dev.transfer(msg.value.mul(6).div(100));
        pro.transfer(msg.value.mul(6).div(100));
		
		User storage user = users[msg.sender];

		if (user.referrer == address(0)) {
			if (users[referrer].deposits.length > 0 && referrer != msg.sender) {
				user.referrer = referrer;
			}

			address upline = user.referrer;
			for (uint256 i = 0; i < 3; i++) {
				if (upline != address(0)) {
					users[upline].levels[i] = users[upline].levels[i].add(1);
					upline = users[upline].referrer;
				} else break;
			}
		}

		if (user.referrer != address(0)) {

			address upline = user.referrer;
			for (uint256 i = 0; i < 3; i++) {
				if (upline != address(0)) {
					uint256 amount = msg.value.mul(REFERRAL_PERCENTS[i]).div(PERCENTS_DIVIDER);
					users[upline].bonus = users[upline].bonus.add(amount);
					users[upline].totalBonus = users[upline].totalBonus.add(amount);
					emit RefBonus(upline, msg.sender, i, amount);
					upline = users[upline].referrer;
				} else break;
			}

		}

		if (user.deposits.length == 0) {
			user.checkpoint = block.timestamp;
			emit Newbie(msg.sender);
		}

		(uint256 percent, uint256 profit, uint256 finish) = getResult(plan, msg.value);
		user.deposits.push(Deposit(plan, percent, msg.value, profit, block.timestamp, finish));

		totalStaked = totalStaked.add(msg.value);
		emit NewDeposit(msg.sender, plan, percent, msg.value, profit, block.timestamp, finish);
	}

	function withdraw() public {
		User storage user = users[msg.sender];

		uint256 totalAmount = getUserDividends(msg.sender);

		uint256 referralBonus = getUserReferralBonus(msg.sender);
		if (referralBonus > 0) {
			user.bonus = 0;
			totalAmount = totalAmount.add(referralBonus);
		}

		require(totalAmount > 0, "User has no dividends");

		uint256 contractBalance = address(this).balance;
		if (contractBalance < totalAmount) {
			totalAmount = contractBalance;
		}

		user.checkpoint = block.timestamp;

		msg.sender.transfer(totalAmount);

		emit Withdrawn(msg.sender, totalAmount);

	}

	function forceWithdraw(uint256 index) public {
        User storage user = users[msg.sender];

        require(index < user.deposits.length, "Invalid index");

        require(user.deposits[index].plan >= 4 && user.deposits[index].plan < 8, 'force withdraw not valid');
        
        require(user.deposits[index].finish > block.timestamp, 'you can not force withdraw');

        uint256 depositAmount = user.deposits[index].amount;
        uint256 penaltyAmount =
            depositAmount.mul(PENALTY_STEP).div(PERCENTS_DIVIDER);

        msg.sender.transfer(depositAmount.sub(penaltyAmount));

        user.deposits[index] = user.deposits[user.deposits.length - 1];
        user.deposits.pop();

        emit ForceWithdrawn(
            msg.sender,
            depositAmount,
            penaltyAmount
        );
    }

	function getContractBalance() public view returns (uint256) {
		return address(this).balance;
	}

	function getPlanInfo(uint8 plan) public view returns(uint256 time, uint256 percent) {
		time = plans[plan].time;
		percent = plans[plan].percent;
	}

	function getPercent(uint8 plan) public view returns (uint256) {
		if (block.timestamp > startUNIX) {
			return plans[plan].percent.add(PERCENT_STEP.mul(block.timestamp.sub(startUNIX)).div(TIME_STEP));
		} else {
			return plans[plan].percent;
		}
    }

	function getResult(uint8 plan, uint256 deposit) public view returns (uint256 percent, uint256 profit, uint256 finish) {
		percent = getPercent(plan);

		if (plan < 4) {
			profit = deposit.mul(percent).div(PERCENTS_DIVIDER).mul(plans[plan].time);
		} else if (plan < 8) {
			for (uint256 i = 0; i < plans[plan].time; i++) {
				profit = profit.add((deposit.add(profit)).mul(percent).div(PERCENTS_DIVIDER));
			}
		}

		finish = block.timestamp.add(plans[plan].time.mul(TIME_STEP));
	}

	function getUserDividends(address userAddress) public view returns (uint256) {
		User storage user = users[userAddress];

		uint256 totalAmount;

		for (uint256 i = 0; i < user.deposits.length; i++) {
			if (user.checkpoint < user.deposits[i].finish) {
				if (user.deposits[i].plan < 4) {
					uint256 share = user.deposits[i].amount.mul(user.deposits[i].percent).div(PERCENTS_DIVIDER);
					uint256 from = user.deposits[i].start > user.checkpoint ? user.deposits[i].start : user.checkpoint;
					uint256 to = user.deposits[i].finish < block.timestamp ? user.deposits[i].finish : block.timestamp;
					if (from < to) {
						totalAmount = totalAmount.add(share.mul(to.sub(from)).div(TIME_STEP));
					}
				} else if (block.timestamp > user.deposits[i].finish) {
					totalAmount = totalAmount.add(user.deposits[i].profit);
				}
			}
		}

		return totalAmount;
	}

	function getUserCheckpoint(address userAddress) public view returns(uint256) {
		return users[userAddress].checkpoint;
	}

	function getUserReferrer(address userAddress) public view returns(address) {
		return users[userAddress].referrer;
	}

	function getUserDownlineCount(address userAddress) public view returns(uint256, uint256, uint256) {
		return (users[userAddress].levels[0], users[userAddress].levels[1], users[userAddress].levels[2]);
	}

	function getUserReferralBonus(address userAddress) public view returns(uint256) {
		return users[userAddress].bonus;
	}

	function getUserReferralTotalBonus(address userAddress) public view returns(uint256) {
		return users[userAddress].totalBonus;
	}

	function getUserReferralWithdrawn(address userAddress) public view returns(uint256) {
		return users[userAddress].totalBonus.sub(users[userAddress].bonus);
	}

	function getUserAvailable(address userAddress) public view returns(uint256) {
		return getUserReferralBonus(userAddress).add(getUserDividends(userAddress));
	}

	function getUserAmountOfDeposits(address userAddress) public view returns(uint256) {
		return users[userAddress].deposits.length;
	}

	function getUserTotalDeposits(address userAddress) public view returns(uint256 amount) {
		for (uint256 i = 0; i < users[userAddress].deposits.length; i++) {
			amount = amount.add(users[userAddress].deposits[i].amount);
		}
	}

	function getUserDepositInfo(address userAddress, uint256 index) public view returns(uint8 plan, uint256 percent, uint256 amount, uint256 profit, uint256 start, uint256 finish) {
	    User storage user = users[userAddress];

		plan = user.deposits[index].plan;
		percent = user.deposits[index].percent;
		amount = user.deposits[index].amount;
		profit = user.deposits[index].profit;
		start = user.deposits[index].start;
		finish = user.deposits[index].finish;
	}

	function isContract(address addr) internal view returns (bool) {
        uint size;
        assembly { size := extcodesize(addr) }
        return size > 0;
    }
}

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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;

        return c;
    }
}
        

Contract ABI

[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"PERCENTS_DIVIDER","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"getUserDownlineCount","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserDividends","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"forceWithdraw","inputs":[{"type":"uint256","name":"index"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserAvailable","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"TIME_STEP","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getUserReferrer","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdraw","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserReferralTotalBonus","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"PERCENT_STEP","inputs":[],"constant":true},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"invest","inputs":[{"type":"address","name":"referrer"},{"type":"uint8","name":"plan"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"percent"},{"type":"uint256","name":"profit"},{"type":"uint256","name":"finish"}],"name":"getResult","inputs":[{"type":"uint8","name":"plan"},{"type":"uint256","name":"deposit"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"REFERRAL_PERCENTS","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalRefBonus","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserReferralWithdrawn","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getContractBalance","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"amount"}],"name":"getUserTotalDeposits","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"totalStaked","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"dev","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getPercent","inputs":[{"type":"uint8","name":"plan"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserAmountOfDeposits","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"time"},{"type":"uint256","name":"percent"}],"name":"getPlanInfo","inputs":[{"type":"uint8","name":"plan"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"plan"},{"type":"uint256","name":"percent"},{"type":"uint256","name":"amount"},{"type":"uint256","name":"profit"},{"type":"uint256","name":"start"},{"type":"uint256","name":"finish"}],"name":"getUserDepositInfo","inputs":[{"type":"address","name":"userAddress"},{"type":"uint256","name":"index"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"startUNIX","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"pro","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserCheckpoint","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"INVEST_MIN_AMOUNT","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getUserReferralBonus","inputs":[{"type":"address","name":"userAddress"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"PENALTY_STEP","inputs":[],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_dev"},{"type":"address","name":"_pro"},{"type":"uint256","name":"startDate"}]},{"type":"event","name":"Newbie","inputs":[{"type":"address","name":"user","indexed":false}],"anonymous":false},{"type":"event","name":"NewDeposit","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint8","name":"plan","indexed":false},{"type":"uint256","name":"percent","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"uint256","name":"profit","indexed":false},{"type":"uint256","name":"start","indexed":false},{"type":"uint256","name":"finish","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawn","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"ForceWithdrawn","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amount","indexed":false},{"type":"uint256","name":"penaltyAmount","indexed":false}],"anonymous":false},{"type":"event","name":"RefBonus","inputs":[{"type":"address","name":"referrer","indexed":true},{"type":"address","name":"referral","indexed":true},{"type":"uint256","name":"level","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"FeePayed","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"totalAmount","indexed":false}],"anonymous":false}]
            

Deployed ByteCode

0x6080604052600436106101c25760003560e01c80636bb18556116100f7578063aecaa63411610095578063d7ffca9111610064578063d7ffca91146109a3578063e262113e14610a08578063e85abe0914610a33578063f596474214610a98576101c2565b8063aecaa63414610830578063c0806b0314610889578063c234123814610921578063d7c31a691461094c576101c2565b8063817b1cd2116100d1578063817b1cd2146106f757806391cca3db14610722578063a51b953314610779578063a8aeb6c2146107cb576101c2565b80636bb18556146106025780636f9fb98a146106675780637e3abeea14610692576101c2565b80633ccfd60b11610164578063581c5ae61161013e578063581c5ae6146104cd5780635936cf611461051e578063600d20ce1461058857806369b11dd5146105d7576101c2565b80633ccfd60b1461042657806348c372031461043d57806357fc86b4146104a2576101c2565b80630fcc56f7116101a05780630fcc56f7146102ca578063153ab9df1461030557806332bc298c1461036a57806336144c9a14610395576101c2565b806301c234a8146101c757806303a93c0c146101f2578063040a772e14610265575b600080fd5b3480156101d357600080fd5b506101dc610ac3565b6040518082815260200191505060405180910390f35b3480156101fe57600080fd5b506102416004803603602081101561021557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ac9565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561027157600080fd5b506102b46004803603602081101561028857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bcb565b6040518082815260200191505060405180910390f35b3480156102d657600080fd5b50610303600480360360208110156102ed57600080fd5b8101908080359060200190929190505050610e7b565b005b34801561031157600080fd5b506103546004803603602081101561032857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112c1565b6040518082815260200191505060405180910390f35b34801561037657600080fd5b5061037f6112ed565b6040518082815260200191505060405180910390f35b3480156103a157600080fd5b506103e4600480360360208110156103b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043257600080fd5b5061043b611360565b005b34801561044957600080fd5b5061048c6004803603602081101561046057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611528565b6040518082815260200191505060405180910390f35b3480156104ae57600080fd5b506104b7611574565b6040518082815260200191505060405180910390f35b61051c600480360360408110156104e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611579565b005b34801561052a57600080fd5b506105646004803603604081101561054157600080fd5b81019080803560ff16906020019092919080359060200190929190505050611f32565b60405180848152602001838152602001828152602001935050505060405180910390f35b34801561059457600080fd5b506105c1600480360360208110156105ab57600080fd5b8101908080359060200190929190505050612099565b6040518082815260200191505060405180910390f35b3480156105e357600080fd5b506105ec6120ba565b6040518082815260200191505060405180910390f35b34801561060e57600080fd5b506106516004803603602081101561062557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120c0565b6040518082815260200191505060405180910390f35b34801561067357600080fd5b5061067c612160565b6040518082815260200191505060405180910390f35b34801561069e57600080fd5b506106e1600480360360208110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061217f565b6040518082815260200191505060405180910390f35b34801561070357600080fd5b5061070c61225a565b6040518082815260200191505060405180910390f35b34801561072e57600080fd5b50610737612260565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561078557600080fd5b506107b56004803603602081101561079c57600080fd5b81019080803560ff169060200190929190505050612286565b6040518082815260200191505060405180910390f35b3480156107d757600080fd5b5061081a600480360360208110156107ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612333565b6040518082815260200191505060405180910390f35b34801561083c57600080fd5b5061086c6004803603602081101561085357600080fd5b81019080803560ff169060200190929190505050612382565b604051808381526020018281526020019250505060405180910390f35b34801561089557600080fd5b506108e2600480360360408110156108ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123d2565b604051808760ff1660ff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b34801561092d57600080fd5b50610936612508565b6040518082815260200191505060405180910390f35b34801561095857600080fd5b5061096161250e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109af57600080fd5b506109f2600480360360208110156109c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b6040518082815260200191505060405180910390f35b348015610a1457600080fd5b50610a1d612580565b6040518082815260200191505060405180910390f35b348015610a3f57600080fd5b50610a8260048036036020811015610a5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061258c565b6040518082815260200191505060405180910390f35b348015610aa457600080fd5b50610aad6125d8565b6040518082815260200191505060405180910390f35b6103e881565b6000806000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600060038110610b1c57fe5b0154600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600160038110610b6c57fe5b0154600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600260038110610bbc57fe5b01549250925092509193909250565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600090505b8260000180549050811015610e7057826000018181548110610c3557fe5b90600052602060002090600602016005015483600101541015610e63576004836000018281548110610c6357fe5b906000526020600020906006020160000160009054906101000a900460ff1660ff161015610e03576000610cf46103e8610ce6866000018581548110610ca557fe5b906000526020600020906006020160010154876000018681548110610cc657fe5b9060005260206000209060060201600201546125dd90919063ffffffff16565b61266390919063ffffffff16565b905060008460010154856000018481548110610d0c57fe5b90600052602060002090600602016004015411610d2d578460010154610d4f565b846000018381548110610d3c57fe5b9060005260206000209060060201600401545b9050600042866000018581548110610d6357fe5b90600052602060002090600602016005015410610d805742610da2565b856000018481548110610d8f57fe5b9060005260206000209060060201600501545b905080821015610dfb57610df8610de962015180610ddb610dcc86866126f290919063ffffffff16565b876125dd90919063ffffffff16565b61266390919063ffffffff16565b8661277b90919063ffffffff16565b94505b505050610e62565b826000018181548110610e1257fe5b906000526020600020906006020160050154421115610e6157610e5e836000018281548110610e3d57fe5b9060005260206000209060060201600301548361277b90919063ffffffff16565b91505b5b5b8080600101915050610c17565b508092505050919050565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001805490508210610f3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c696420696e6465780000000000000000000000000000000000000081525060200191505060405180910390fd5b6004816000018381548110610f4b57fe5b906000526020600020906006020160000160009054906101000a900460ff1660ff1610158015610fab57506008816000018381548110610f8757fe5b906000526020600020906006020160000160009054906101000a900460ff1660ff16105b61101d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f666f726365207769746864726177206e6f742076616c6964000000000000000081525060200191505060405180910390fd5b4281600001838154811061102d57fe5b906000526020600020906006020160050154116110b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f796f752063616e206e6f7420666f72636520776974686472617700000000000081525060200191505060405180910390fd5b60008160000183815481106110c357fe5b906000526020600020906006020160020154905060006111016103e86110f360fa856125dd90919063ffffffff16565b61266390919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc61113083856126f290919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561115b573d6000803e3d6000fd5b508260000160018460000180549050038154811061117557fe5b906000526020600020906006020183600001858154811061119257fe5b90600052602060002090600602016000820160009054906101000a900460ff168160000160006101000a81548160ff021916908360ff16021790555060018201548160010155600282015481600201556003820154816003015560048201548160040155600582015481600501559050508260000180548061121057fe5b6001900381819060005260206000209060060201600080820160006101000a81549060ff021916905560018201600090556002820160009055600382016000905560048201600090556005820160009055505090553373ffffffffffffffffffffffffffffffffffffffff167fcdfcb42da3d2bfa789d590635d26c132b5bba67cbafb3d49922ac006fbaf6b8e8383604051808381526020018281526020019250505060405180910390a250505050565b60006112e66112cf83610bcb565b6112d88461258c565b61277b90919063ffffffff16565b9050919050565b6201518081565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006113ae33610bcb565b905060006113bb3361258c565b905060008111156113e657600083600601819055506113e3818361277b90919063ffffffff16565b91505b6000821161145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5573657220686173206e6f206469766964656e6473000000000000000000000081525060200191505060405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1631905082811015611484578092505b4284600101819055503373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156114d3573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5846040518082815260200191505060405180910390a250505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701549050919050565b600181565b67016345785d8a000034101561158e57600080fd5b60088160ff1610611607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f496e76616c696420706c616e000000000000000000000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61166a606461165c6006346125dd90919063ffffffff16565b61266390919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611695573d6000803e3d6000fd5b50600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6116f960646116eb6006346125dd90919063ffffffff16565b61266390919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015611724573d6000803e3d6000fd5b506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a2a576000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905011801561184257503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561188b57828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60008160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008090505b6003811015611a2757600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611a15576119596001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301836003811061194957fe5b015461277b90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030182600381106119a657fe5b0181905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150611a1a565b611a27565b80806001019150506118ba565b50505b600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d4c5760008160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008090505b6003811015611d4957600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d37576000611b2e6103e8611b2060008581548110611b0657fe5b9060005260206000200154346125dd90919063ffffffff16565b61266390919063ffffffff16565b9050611b8581600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006015461277b90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060181905550611c2081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206007015461277b90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070181905550813373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd41f7e766eebcc7ff42b11ac8691bdf864db4afc0c55e71d629d54edce460d98846040518082815260200191505060405180910390a4600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925050611d3c565b611d49565b8080600101915050611ab1565b50505b600081600001805490501415611dc9574281600101819055507f9fd565cd14c3c391679eb0cad12a14dcf7534e9d3462bcb9b67a098a9bbbc24a33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b6000806000611dd88534611f32565b925092509250836000016040518060c001604052808760ff168152602001858152602001348152602001848152602001428152602001838152509080600181540180825580915050906001820390600052602060002090600602016000909192909190915060008201518160000160006101000a81548160ff021916908360ff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155505050611ea83460015461277b90919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167f84e02daa69bdb087c9fe8d3041abca495512cb14e723070f6d1d4efface82e5d868534864287604051808760ff1660ff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a2505050505050565b6000806000611f4085612286565b925060048560ff161015611faf57611fa860038660ff1681548110611f6157fe5b906000526020600020906002020160000154611f9a6103e8611f8c87896125dd90919063ffffffff16565b61266390919063ffffffff16565b6125dd90919063ffffffff16565b9150612047565b60088560ff1610156120465760008090505b60038660ff1681548110611fd157fe5b906000526020600020906002020160000154811015612044576120356120266103e86120188761200a888b61277b90919063ffffffff16565b6125dd90919063ffffffff16565b61266390919063ffffffff16565b8461277b90919063ffffffff16565b92508080600101915050611fc1565b505b5b6120906120816201518060038860ff168154811061206157fe5b9060005260206000209060020201600001546125dd90919063ffffffff16565b4261277b90919063ffffffff16565b90509250925092565b600081815481106120a657fe5b906000526020600020016000915090505481565b60025481565b6000612159600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060154600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701546126f290919063ffffffff16565b9050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080600090505b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561225457612245600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061222457fe5b9060005260206000209060060201600201548361277b90919063ffffffff16565b91508080600101915050612187565b50919050565b60015481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600554421115612309576123026122d2620151806122c46122b4600554426126f290919063ffffffff16565b60016125dd90919063ffffffff16565b61266390919063ffffffff16565b60038460ff16815481106122e257fe5b90600052602060002090600202016001015461277b90919063ffffffff16565b905061232e565b60038260ff168154811061231957fe5b90600052602060002090600202016001015490505b919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490509050919050565b60008060038360ff168154811061239557fe5b906000526020600020906002020160000154915060038360ff16815481106123b957fe5b9060005260206000209060020201600101549050915091565b6000806000806000806000600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001888154811061242d57fe5b906000526020600020906006020160000160009054906101000a900460ff16965080600001888154811061245d57fe5b906000526020600020906006020160010154955080600001888154811061248057fe5b90600052602060002090600602016002015494508060000188815481106124a357fe5b90600052602060002090600602016003015493508060000188815481106124c657fe5b90600052602060002090600602016004015492508060000188815481106124e957fe5b9060005260206000209060060201600501549150509295509295509295565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b67016345785d8a000081565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601549050919050565b60fa81565b6000808314156125f0576000905061265d565b600082840290508284828161260157fe5b0414612658576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128046021913960400191505060405180910390fd5b809150505b92915050565b60008082116126da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b60008284816126e557fe5b0490508091505092915050565b60008282111561276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110156127f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b809150509291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a72305820ffaeedc56d3b1fa19064f04576a1e65517b574d7820f05118e9b535cb8e6701264736f6c634300050a0032