More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 772 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy New Level | 11410400 | 1521 days ago | IN | 0.8 ETH | 0.00348674 | ||||
Buy New Level | 11410397 | 1521 days ago | IN | 0.4 ETH | 0.0066634 | ||||
Buy New Level | 11410394 | 1521 days ago | IN | 0.2 ETH | 0.00401504 | ||||
Registration Ext | 11410389 | 1521 days ago | IN | 0.1 ETH | 0.01126242 | ||||
Buy New Level | 11410316 | 1521 days ago | IN | 0.8 ETH | 0.0075934 | ||||
Buy New Level | 11410301 | 1521 days ago | IN | 0.4 ETH | 0.0064478 | ||||
Buy New Level | 11410295 | 1521 days ago | IN | 0.2 ETH | 0.00648217 | ||||
Registration Ext | 11410286 | 1521 days ago | IN | 0.1 ETH | 0.00744934 | ||||
Buy New Level | 11371739 | 1526 days ago | IN | 0.8 ETH | 0.00413598 | ||||
Buy New Level | 11371728 | 1526 days ago | IN | 0.4 ETH | 0.00442135 | ||||
Buy New Level | 11371716 | 1526 days ago | IN | 0.2 ETH | 0.00408492 | ||||
Registration Ext | 11371709 | 1526 days ago | IN | 0.1 ETH | 0.00587083 | ||||
Buy New Level | 11359573 | 1528 days ago | IN | 0.4 ETH | 0.00484087 | ||||
Buy New Level | 11359358 | 1528 days ago | IN | 0.4 ETH | 0.00763623 | ||||
Registration Ext | 11351427 | 1530 days ago | IN | 0.1 ETH | 0.00337503 | ||||
Registration Ext | 11346685 | 1530 days ago | IN | 0.1 ETH | 0.00502393 | ||||
Registration Ext | 11340736 | 1531 days ago | IN | 0.1 ETH | 0.00644073 | ||||
Buy New Level | 11334672 | 1532 days ago | IN | 0.8 ETH | 0.01264789 | ||||
Buy New Level | 11334620 | 1532 days ago | IN | 0.4 ETH | 0.01412701 | ||||
Buy New Level | 11333938 | 1532 days ago | IN | 0.2 ETH | 0.01726924 | ||||
Registration Ext | 11333930 | 1532 days ago | IN | 0.1 ETH | 0.02517451 | ||||
Buy New Level | 11332172 | 1533 days ago | IN | 0.4 ETH | 0.03059911 | ||||
Buy New Level | 11332165 | 1533 days ago | IN | 0.2 ETH | 0.01692548 | ||||
Registration Ext | 11332128 | 1533 days ago | IN | 0.1 ETH | 0.0128319 | ||||
Buy New Level | 11319575 | 1534 days ago | IN | 1.6 ETH | 0.02011996 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11410400 | 1521 days ago | 0.24 ETH | ||||
11410400 | 1521 days ago | 0.16 ETH | ||||
11410400 | 1521 days ago | 0.4 ETH | ||||
11410397 | 1521 days ago | 0.12 ETH | ||||
11410397 | 1521 days ago | 0.08 ETH | ||||
11410397 | 1521 days ago | 0.2 ETH | ||||
11410394 | 1521 days ago | 0.06 ETH | ||||
11410394 | 1521 days ago | 0.04 ETH | ||||
11410394 | 1521 days ago | 0.1 ETH | ||||
11410389 | 1521 days ago | 0.05 ETH | ||||
11410389 | 1521 days ago | 0.03 ETH | ||||
11410389 | 1521 days ago | 0.02 ETH | ||||
11410316 | 1521 days ago | 0.24 ETH | ||||
11410316 | 1521 days ago | 0.16 ETH | ||||
11410316 | 1521 days ago | 0.4 ETH | ||||
11410301 | 1521 days ago | 0.2 ETH | ||||
11410301 | 1521 days ago | 0.12 ETH | ||||
11410301 | 1521 days ago | 0.08 ETH | ||||
11410295 | 1521 days ago | 0.06 ETH | ||||
11410295 | 1521 days ago | 0.04 ETH | ||||
11410295 | 1521 days ago | 0.1 ETH | ||||
11410286 | 1521 days ago | 0.03 ETH | ||||
11410286 | 1521 days ago | 0.02 ETH | ||||
11410286 | 1521 days ago | 0.05 ETH | ||||
11371739 | 1526 days ago | 0.24 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ETPlanV3
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-20 */ pragma solidity >=0.4.23 <0.6.0; /** * eplans.vip **/ contract ETPlanV3 { struct User { uint id; address referrer; uint partnersCount; mapping(uint8 => bool) activeQ8Levels; mapping(uint8 => bool) blocked; mapping(uint8 => uint) income; } struct Q8 { address currentReferrer; address[] firstLevelReferrals; address[] secondLevelReferrals; uint reinvestCount; } uint8 public constant LAST_LEVEL = 12; uint public lastUserId = 2; address public owner; address public pool; address public manager; address public eTPlanToken; mapping(uint8 => uint) public levelPrice; mapping(uint8 => Q8) public q8Matrix; mapping(address => User) public users; mapping(uint => address) public idToAddress; event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place); event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId); event MissedEthReceive(address indexed receiver, address indexed from, uint8 level); event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level); event NewRound(address indexed user, address indexed referrer, uint8 level); address public super; address public _this; modifier OnlySuper { require(msg.sender == super); _; } constructor() public { levelPrice[1] = 0.1 ether; for (uint8 i = 2; i <= LAST_LEVEL; i++) { levelPrice[i] = levelPrice[i - 1] * 2; } _this = address(this); super = msg.sender; } function initQ8(address _etplan) OnlySuper external { ETPlanV2 etplan = ETPlanV2(address(uint160(_etplan))); owner = etplan.owner(); manager = etplan.manager(); pool = etplan.pool(); eTPlanToken = etplan.eTPlanToken(); for (uint8 j = 1; j <= 12; j++) { (address currentReferrer, address[] memory firstLevelReferrals , address[] memory secondLevelReferrals, uint reinvestCount) = etplan.getq8Matrix(j); q8Matrix[j].currentReferrer = currentReferrer; q8Matrix[j].firstLevelReferrals = firstLevelReferrals; q8Matrix[j].secondLevelReferrals = secondLevelReferrals; q8Matrix[j].reinvestCount = reinvestCount; } } function initData(address _etplan, uint start, uint end) OnlySuper external { ETPlanV2 etplan = ETPlanV2(address(uint160(_etplan))); lastUserId = end + 1; for (uint i = start; i <= end; i++) { address currentUser = etplan.idToAddress(i); (uint id,address referrer,uint partnersCount) = etplan.users(currentUser); User memory user = User({ id : id, referrer : referrer, partnersCount : partnersCount }); users[currentUser] = user; for (uint8 j = 1; j <= 12; j++) { if (i == 3) { users[currentUser].blocked[j] = true; users[currentUser].activeQ8Levels[j] = false; } else { bool active = etplan.activeQ8Levels(currentUser, j); users[currentUser].activeQ8Levels[j] = active; users[currentUser].income[j] = etplan.income(currentUser, j); } } idToAddress[i] = currentUser; } } function() external payable { if (msg.data.length == 0) { return registration(msg.sender, owner); } registration(msg.sender, bytesToAddress(msg.data)); } function registrationExt(address referrerAddress) external payable { registration(msg.sender, referrerAddress); } function registration(address userAddress, address referrerAddress) private { require(msg.value == 0.1 ether, "registration cost 0.1"); require(!isUserExists(userAddress), "user exists"); require(isUserExists(referrerAddress), "referrer not exists"); uint32 size; assembly { size := extcodesize(userAddress) } require(size == 0, "cannot be a contract"); User memory user = User({ id : lastUserId, referrer : referrerAddress, partnersCount : 0 }); users[userAddress] = user; idToAddress[lastUserId] = userAddress; users[userAddress].activeQ8Levels[1] = true; lastUserId++; users[referrerAddress].partnersCount++; emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id); updateQ8Referrer(userAddress, referrerAddress, uint8(1)); if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[uint8(1)] * 3 / 2)) { ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]); ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2); } } function buyNewLevel(uint8 level) external payable { require(isUserExists(msg.sender), "user is not exists. Register first."); require(msg.value == levelPrice[level], "invalid price"); require(level > 1 && level <= LAST_LEVEL, "invalid level"); require(!users[msg.sender].activeQ8Levels[level], "level already activated"); if (users[msg.sender].blocked[level - 1]) { users[msg.sender].blocked[level - 1] = false; } users[msg.sender].activeQ8Levels[level] = true; address freeReferrer = findFreeQ8Referrer(msg.sender, level); updateQ8Referrer(msg.sender, freeReferrer, level); emit NewRound(msg.sender, freeReferrer, level); if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[level] * 3 / 2)) { ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]); ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level] / 2); } } function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private { require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive"); if ((users[referrerAddress].income[level] / (levelPrice[level] / 2)) >= 6) { if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) { users[referrerAddress].blocked[level] = true; } } if (q8Matrix[level].firstLevelReferrals.length < 2) { q8Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length)); q8Matrix[level].currentReferrer = referrerAddress; if (referrerAddress == owner) { users[owner].income[level] += levelPrice[level]; return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]); } uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); } q8Matrix[level].secondLevelReferrals.push(userAddress); q8Matrix[level].currentReferrer = referrerAddress; emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2)); if (q8Matrix[level].secondLevelReferrals.length == 1) { address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level); users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100; return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100); } if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest q8Matrix[level].reinvestCount++; q8Matrix[level].firstLevelReferrals = new address[](0); q8Matrix[level].secondLevelReferrals = new address[](0); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } } function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) { while (true) { if (users[users[userAddress].referrer].activeQ8Levels[level]) { return users[userAddress].referrer; } userAddress = users[userAddress].referrer; } } function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) { address receiver = userAddress; bool isExtraDividends; while (true) { if (users[receiver].blocked[level]) { emit MissedEthReceive(receiver, _from, level); isExtraDividends = true; receiver = users[receiver].referrer; } else { return (receiver, isExtraDividends); } } } function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private { (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level); if (!address(uint160(receiver)).send(amount)) { return address(uint160(receiver)).transfer(address(this).balance); } if (isExtraDividends) { emit SentExtraEthDividends(_from, receiver, level); } } function isUserExists(address user) public view returns (bool) { return (users[user].id != 0); } function bytesToAddress(bytes memory bys) private pure returns (address addr) { assembly { addr := mload(add(bys, 20)) } } function activeQ8Levels(address _user, uint8 level) public view returns (bool){ return users[_user].activeQ8Levels[level]; } function blocked(address _user, uint8 level) public view returns (bool){ return users[_user].blocked[level]; } function income(address _user, uint8 level) public view returns (uint){ return users[_user].income[level]; } function getUserInfo(address _user, uint8 level) public view returns (bool, bool, uint){ return (users[_user].activeQ8Levels[level] , users[_user].blocked[level] , users[_user].income[level]); } function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){ return (q8Matrix[level].currentReferrer, q8Matrix[level].firstLevelReferrals, q8Matrix[level].secondLevelReferrals, q8Matrix[level].reinvestCount); } function updatePool(address _pool) public OnlySuper { pool = _pool; } function updateManager(address _manager) public OnlySuper { manager = _manager; } function updateSuper(address _super) public OnlySuper { super = _super; } function update(address _user, uint8 _level) public OnlySuper { require(isUserExists(_user), "user not exists"); users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level]; } function updateBlocked(address _user, uint8 _level) public OnlySuper { require(isUserExists(_user), "user not exists"); users[_user].blocked[_level] = !users[_user].blocked[_level]; } function withdrawELS(address _user, uint _value) public OnlySuper { ETPlanToken(eTPlanToken).transfer(_user, _value); } } contract ETPlanV2 { struct User { uint id; address referrer; uint partnersCount; mapping(uint8 => bool) activeQ8Levels; mapping(uint8 => bool) blocked; mapping(uint8 => uint) income; } struct Q8 { address currentReferrer; address[] firstLevelReferrals; address[] secondLevelReferrals; uint reinvestCount; } uint8 public constant LAST_LEVEL = 12; uint public lastUserId = 2; address public owner; address public pool; address public manager; address public eTPlanToken; mapping(uint8 => uint) public levelPrice; mapping(uint8 => Q8) public q8Matrix; mapping(address => User) public users; mapping(uint => address) public idToAddress; event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place); event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId); event MissedEthReceive(address indexed receiver, address indexed from, uint8 level); event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level); event NewRound(address indexed user, address indexed referrer, uint8 level); address public super; address public _this; modifier OnlySuper { require(msg.sender == super); _; } constructor() public { levelPrice[1] = 0.1 ether; for (uint8 i = 2; i <= LAST_LEVEL; i++) { levelPrice[i] = levelPrice[i - 1] * 2; } _this = address(this); super = msg.sender; } function initQ8(address _etplan) OnlySuper external { ETPlan etplan = ETPlan(address(uint160(_etplan))); for (uint8 j = 1; j <= 12; j++) { (address currentReferrer, address[] memory firstLevelReferrals , address[] memory secondLevelReferrals, uint reinvestCount) = etplan.getq8Matrix(j); q8Matrix[j].currentReferrer = currentReferrer; q8Matrix[j].firstLevelReferrals = firstLevelReferrals; q8Matrix[j].secondLevelReferrals = secondLevelReferrals; q8Matrix[j].reinvestCount = reinvestCount; } } function initData(address _etplan, uint start, uint end) OnlySuper external { ETPlan etplan = ETPlan(address(uint160(_etplan))); owner = etplan.owner(); manager = etplan.manager(); pool = etplan.pool(); eTPlanToken = etplan.eTPlanToken(); lastUserId = end + 1; for (uint i = start; i <= end; i++) { address currentUser = etplan.idToAddress(i); (uint id,address referrer,uint partnersCount) = etplan.users(currentUser); User memory user = User({ id : id, referrer : referrer, partnersCount : partnersCount }); users[currentUser] = user; for (uint8 j = 1; j <= 12; j++) { if (i == 3) { users[currentUser].blocked[j] = true; users[currentUser].activeQ8Levels[j] = false; } else { bool active = etplan.activeQ8Levels(currentUser, j); users[currentUser].activeQ8Levels[j] = active; users[currentUser].income[j] = etplan.income(currentUser, j); } } idToAddress[i] = currentUser; } } function() external payable { if (msg.data.length == 0) { return registration(msg.sender, owner); } registration(msg.sender, bytesToAddress(msg.data)); } function registrationExt(address referrerAddress) external payable { registration(msg.sender, referrerAddress); } function registration(address userAddress, address referrerAddress) private { require(msg.value == 0.1 ether, "registration cost 0.1"); require(!isUserExists(userAddress), "user exists"); require(isUserExists(referrerAddress), "referrer not exists"); uint32 size; assembly { size := extcodesize(userAddress) } require(size == 0, "cannot be a contract"); User memory user = User({ id : lastUserId, referrer : referrerAddress, partnersCount : 0 }); users[userAddress] = user; idToAddress[lastUserId] = userAddress; users[userAddress].activeQ8Levels[1] = true; lastUserId++; users[referrerAddress].partnersCount++; emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id); updateQ8Referrer(userAddress, referrerAddress, uint8(1)); if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[uint8(1)] * 3 / 2)) { ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]); ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2); } } function buyNewLevel(uint8 level) external payable { require(isUserExists(msg.sender), "user is not exists. Register first."); require(msg.value == levelPrice[level], "invalid price"); require(level > 1 && level <= LAST_LEVEL, "invalid level"); require(!users[msg.sender].activeQ8Levels[level], "level already activated"); if (users[msg.sender].blocked[level - 1]) { users[msg.sender].blocked[level - 1] = false; } users[msg.sender].activeQ8Levels[level] = true; address freeReferrer = findFreeQ8Referrer(msg.sender, level); updateQ8Referrer(msg.sender, freeReferrer, level); emit NewRound(msg.sender, freeReferrer, level); if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[level] * 3 / 2)) { ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]); ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level] / 2); } } function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private { require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive"); if ((users[referrerAddress].income[level] % (levelPrice[level] / 2)) >= 6) { if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) { users[referrerAddress].blocked[level] = true; } } if (q8Matrix[level].firstLevelReferrals.length < 2) { q8Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length)); q8Matrix[level].currentReferrer = referrerAddress; if (referrerAddress == owner) { users[owner].income[level] += levelPrice[level]; return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]); } uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); } q8Matrix[level].secondLevelReferrals.push(userAddress); q8Matrix[level].currentReferrer = referrerAddress; emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2)); if (q8Matrix[level].secondLevelReferrals.length == 1) { address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level); users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100; return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100); } if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest q8Matrix[level].reinvestCount++; q8Matrix[level].firstLevelReferrals = new address[](0); q8Matrix[level].secondLevelReferrals = new address[](0); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } } function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) { while (true) { if (users[users[userAddress].referrer].activeQ8Levels[level]) { return users[userAddress].referrer; } userAddress = users[userAddress].referrer; } } function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) { address receiver = userAddress; bool isExtraDividends; while (true) { if (users[receiver].blocked[level]) { emit MissedEthReceive(receiver, _from, level); isExtraDividends = true; receiver = users[receiver].referrer; } else { return (receiver, isExtraDividends); } } } function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private { (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level); if (!address(uint160(receiver)).send(amount)) { return address(uint160(receiver)).transfer(address(this).balance); } if (isExtraDividends) { emit SentExtraEthDividends(_from, receiver, level); } } function isUserExists(address user) public view returns (bool) { return (users[user].id != 0); } function bytesToAddress(bytes memory bys) private pure returns (address addr) { assembly { addr := mload(add(bys, 20)) } } function activeQ8Levels(address _user, uint8 level) public view returns (bool){ return users[_user].activeQ8Levels[level]; } function blocked(address _user, uint8 level) public view returns (bool){ return users[_user].blocked[level]; } function income(address _user, uint8 level) public view returns (uint){ return users[_user].income[level]; } function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){ return (q8Matrix[level].currentReferrer, q8Matrix[level].firstLevelReferrals, q8Matrix[level].secondLevelReferrals, q8Matrix[level].reinvestCount); } function updatePool(address _pool) public OnlySuper { pool = _pool; } function updateManager(address _manager) public OnlySuper { manager = _manager; } function updateSuper(address _super) public OnlySuper { super = _super; } function update(address _user, uint8 _level) public OnlySuper { require(isUserExists(_user), "user not exists"); users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level]; } function updateBlocked(address _user, uint8 _level) public OnlySuper { require(isUserExists(_user), "user not exists"); users[_user].blocked[_level] = !users[_user].blocked[_level]; } function withdrawELS(address _user, uint _value) public OnlySuper { ETPlanToken(eTPlanToken).transfer(_user, _value); } } contract ETPlan { struct User { uint id; address referrer; uint partnersCount; mapping(uint8 => bool) activeQ8Levels; mapping(uint8 => bool) blocked; mapping(uint8 => uint) income; } struct Q8 { address currentReferrer; address[] firstLevelReferrals; address[] secondLevelReferrals; uint reinvestCount; } uint8 public constant LAST_LEVEL = 12; uint public lastUserId = 2; address public owner; address public pool; address public manager; address public eTPlanToken; mapping(uint8 => uint) public levelPrice; mapping(uint8 => Q8) public q8Matrix; mapping(address => User) public users; mapping(uint => address) public idToAddress; event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place); event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId); event MissedEthReceive(address indexed receiver, address indexed from, uint8 level); event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level); event NewRound(address indexed user, address indexed referrer, uint8 level); address public super; address public _this; modifier OnlySuper { require(msg.sender == super); _; } constructor(address _token) public { levelPrice[1] = 0.1 ether; for (uint8 i = 2; i <= LAST_LEVEL; i++) { levelPrice[i] = levelPrice[i - 1] * 2; } owner = msg.sender; super = msg.sender; manager = msg.sender; pool = msg.sender; eTPlanToken = _token; _this = address(this); } function initEnd(address _endless, uint start, uint end) OnlySuper external { Endless endless = Endless(address(uint160(_endless))); owner = endless.owner(); lastUserId = end + 1; for (uint i = start; i <= end; i++) { address currentUser = endless.userIds(i); (uint id,address referrer,uint partnersCount) = endless.users(currentUser); User memory user = User({ id : id, referrer : referrer, partnersCount : partnersCount }); users[currentUser] = user; for (uint8 j = 1; j <= 12; j++) { if (i == 3) { users[currentUser].blocked[j] = true; users[currentUser].activeQ8Levels[j] = false; } else { bool active = endless.usersActiveX6Levels(currentUser, j); users[currentUser].activeQ8Levels[j] = active; } } idToAddress[i] = currentUser; } } function() external payable { if (msg.data.length == 0) { return registration(msg.sender, owner); } registration(msg.sender, bytesToAddress(msg.data)); } function registrationExt(address referrerAddress) external payable { registration(msg.sender, referrerAddress); } function registration(address userAddress, address referrerAddress) private { require(msg.value == 0.1 ether, "registration cost 0.1"); require(!isUserExists(userAddress), "user exists"); require(isUserExists(referrerAddress), "referrer not exists"); uint32 size; assembly { size := extcodesize(userAddress) } require(size == 0, "cannot be a contract"); User memory user = User({ id : lastUserId, referrer : referrerAddress, partnersCount : 0 }); users[userAddress] = user; idToAddress[lastUserId] = userAddress; users[userAddress].activeQ8Levels[1] = true; lastUserId++; users[referrerAddress].partnersCount++; emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id); updateQ8Referrer(userAddress, referrerAddress, uint8(1)); if (ETPlanToken(eTPlanToken).balanceOf(_this) > levelPrice[uint8(1)]) { ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]); ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2); } } function buyNewLevel(uint8 level) external payable { require(isUserExists(msg.sender), "user is not exists. Register first."); require(msg.value == levelPrice[level], "invalid price"); require(level > 1 && level <= LAST_LEVEL, "invalid level"); require(!users[msg.sender].activeQ8Levels[level], "level already activated"); if (users[msg.sender].blocked[level - 1]) { users[msg.sender].blocked[level - 1] = false; } users[msg.sender].activeQ8Levels[level] = true; address freeReferrer = findFreeQ8Referrer(msg.sender, level); updateQ8Referrer(msg.sender, freeReferrer, level); emit NewRound(msg.sender, freeReferrer, level); if (ETPlanToken(eTPlanToken).balanceOf(_this) > levelPrice[level]) { ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]); ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level]/2); } } function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private { require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive"); if ((users[referrerAddress].income[level] % (levelPrice[level] / 2)) >= 6) { if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) { users[referrerAddress].blocked[level] = true; } } if (q8Matrix[level].firstLevelReferrals.length < 2) { q8Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length)); q8Matrix[level].currentReferrer = referrerAddress; if (referrerAddress == owner) { users[owner].income[level] += levelPrice[level]; return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]); } uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); } q8Matrix[level].secondLevelReferrals.push(userAddress); q8Matrix[level].currentReferrer = referrerAddress; emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2)); if (q8Matrix[level].secondLevelReferrals.length == 1) { address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level); users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100; return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100); } if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest q8Matrix[level].reinvestCount++; q8Matrix[level].firstLevelReferrals = new address[](0); q8Matrix[level].secondLevelReferrals = new address[](0); } address freeReferrer = findFreeQ8Referrer(userAddress, level); users[freeReferrer].income[level] += levelPrice[level] / 2; sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2); uint poolAmount = levelPrice[level] * 20 / 100; if (!address(uint160(pool)).send(poolAmount)) { return address(uint160(pool)).transfer(address(this).balance); } uint managerAmount = levelPrice[level] * 30 / 100; if (!address(uint160(manager)).send(managerAmount)) { return address(uint160(manager)).transfer(address(this).balance); } } function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) { while (true) { if (users[users[userAddress].referrer].activeQ8Levels[level]) { return users[userAddress].referrer; } userAddress = users[userAddress].referrer; } } function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) { address receiver = userAddress; bool isExtraDividends; while (true) { if (users[receiver].blocked[level]) { emit MissedEthReceive(receiver, _from, level); isExtraDividends = true; receiver = users[receiver].referrer; } else { return (receiver, isExtraDividends); } } } function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private { (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level); if (!address(uint160(receiver)).send(amount)) { return address(uint160(receiver)).transfer(address(this).balance); } if (isExtraDividends) { emit SentExtraEthDividends(_from, receiver, level); } } function isUserExists(address user) public view returns (bool) { return (users[user].id != 0); } function bytesToAddress(bytes memory bys) private pure returns (address addr) { assembly { addr := mload(add(bys, 20)) } } function activeQ8Levels(address _user, uint8 level) public view returns (bool){ return users[_user].activeQ8Levels[level]; } function blocked(address _user, uint8 level) public view returns (bool){ return users[_user].blocked[level]; } function income(address _user, uint8 level) public view returns (uint){ return users[_user].income[level]; } function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){ return (q8Matrix[level].currentReferrer, q8Matrix[level].firstLevelReferrals, q8Matrix[level].secondLevelReferrals, q8Matrix[level].reinvestCount); } function updatePool(address _pool) public OnlySuper { pool = _pool; } function updateManager(address _manager) public OnlySuper { manager = _manager; } function updateSuper(address _super) public OnlySuper { super = _super; } function update(address _user, uint8 _level) public OnlySuper { require(isUserExists(_user), "user not exists"); users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level]; } function withdrawELS(address _user, uint _value) public OnlySuper { ETPlanToken(eTPlanToken).transfer(_user, _value); } } contract Endless { struct User { uint id; address referrer; uint partnersCount; mapping(uint8 => bool) activeX3Levels; mapping(uint8 => bool) activeX6Levels; mapping(uint8 => X3) x3Matrix; mapping(uint8 => X6) x6Matrix; } struct X3 { address currentReferrer; address[] referrals; bool blocked; uint reinvestCount; } struct X6 { address currentReferrer; address[] firstLevelReferrals; address[] secondLevelReferrals; bool blocked; uint reinvestCount; address closedPart; } uint8 public constant LAST_LEVEL = 12; mapping(address => User) public users; mapping(uint => address) public idToAddress; mapping(uint => address) public userIds; mapping(address => uint) public balances; uint public lastUserId = 2; address public owner; mapping(uint8 => uint) public levelPrice; event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId); event Reinvest(address indexed user, address indexed currentReferrer, address indexed caller, uint8 matrix, uint8 level); event Upgrade(address indexed user, address indexed referrer, uint8 matrix, uint8 level); event NewUserPlace(address indexed user, address indexed referrer, uint8 matrix, uint8 level, uint8 place); event MissedEthReceive(address indexed receiver, address indexed from, uint8 matrix, uint8 level); event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 matrix, uint8 level); constructor(address ownerAddress) public { levelPrice[1] = 0.025 ether; for (uint8 i = 2; i <= LAST_LEVEL; i++) { levelPrice[i] = levelPrice[i-1] * 2; } owner = ownerAddress; User memory user = User({ id: 1, referrer: address(0), partnersCount: uint(0) }); users[ownerAddress] = user; idToAddress[1] = ownerAddress; for (uint8 i = 1; i <= LAST_LEVEL; i++) { users[ownerAddress].activeX3Levels[i] = true; users[ownerAddress].activeX6Levels[i] = true; } userIds[1] = ownerAddress; } function() external payable { if(msg.data.length == 0) { return registration(msg.sender, owner); } registration(msg.sender, bytesToAddress(msg.data)); } function registrationExt(address referrerAddress) external payable { registration(msg.sender, referrerAddress); } function buyNewLevel(uint8 matrix, uint8 level) external payable { require(isUserExists(msg.sender), "user is not exists. Register first."); require(matrix == 1 || matrix == 2, "invalid matrix"); require(msg.value == levelPrice[level], "invalid price"); require(level > 1 && level <= LAST_LEVEL, "invalid level"); if (matrix == 1) { require(!users[msg.sender].activeX3Levels[level], "level already activated"); if (users[msg.sender].x3Matrix[level-1].blocked) { users[msg.sender].x3Matrix[level-1].blocked = false; } address freeX3Referrer = findFreeX3Referrer(msg.sender, level); users[msg.sender].x3Matrix[level].currentReferrer = freeX3Referrer; users[msg.sender].activeX3Levels[level] = true; updateX3Referrer(msg.sender, freeX3Referrer, level); emit Upgrade(msg.sender, freeX3Referrer, 1, level); } else { require(!users[msg.sender].activeX6Levels[level], "level already activated"); if (users[msg.sender].x6Matrix[level-1].blocked) { users[msg.sender].x6Matrix[level-1].blocked = false; } address freeX6Referrer = findFreeX6Referrer(msg.sender, level); users[msg.sender].activeX6Levels[level] = true; updateX6Referrer(msg.sender, freeX6Referrer, level); emit Upgrade(msg.sender, freeX6Referrer, 2, level); } } function registration(address userAddress, address referrerAddress) private { require(msg.value == 0.05 ether, "registration cost 0.05"); require(!isUserExists(userAddress), "user exists"); require(isUserExists(referrerAddress), "referrer not exists"); uint32 size; assembly { size := extcodesize(userAddress) } require(size == 0, "cannot be a contract"); User memory user = User({ id: lastUserId, referrer: referrerAddress, partnersCount: 0 }); users[userAddress] = user; idToAddress[lastUserId] = userAddress; users[userAddress].referrer = referrerAddress; users[userAddress].activeX3Levels[1] = true; users[userAddress].activeX6Levels[1] = true; userIds[lastUserId] = userAddress; lastUserId++; users[referrerAddress].partnersCount++; address freeX3Referrer = findFreeX3Referrer(userAddress, 1); users[userAddress].x3Matrix[1].currentReferrer = freeX3Referrer; updateX3Referrer(userAddress, freeX3Referrer, 1); updateX6Referrer(userAddress, findFreeX6Referrer(userAddress, 1), 1); emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id); } function updateX3Referrer(address userAddress, address referrerAddress, uint8 level) private { users[referrerAddress].x3Matrix[level].referrals.push(userAddress); if (users[referrerAddress].x3Matrix[level].referrals.length < 3) { emit NewUserPlace(userAddress, referrerAddress, 1, level, uint8(users[referrerAddress].x3Matrix[level].referrals.length)); return sendETHDividends(referrerAddress, userAddress, 1, level); } emit NewUserPlace(userAddress, referrerAddress, 1, level, 3); //close matrix users[referrerAddress].x3Matrix[level].referrals = new address[](0); if (!users[referrerAddress].activeX3Levels[level+1] && level != LAST_LEVEL) { users[referrerAddress].x3Matrix[level].blocked = true; } //create new one by recursion if (referrerAddress != owner) { //check referrer active level address freeReferrerAddress = findFreeX3Referrer(referrerAddress, level); if (users[referrerAddress].x3Matrix[level].currentReferrer != freeReferrerAddress) { users[referrerAddress].x3Matrix[level].currentReferrer = freeReferrerAddress; } users[referrerAddress].x3Matrix[level].reinvestCount++; emit Reinvest(referrerAddress, freeReferrerAddress, userAddress, 1, level); updateX3Referrer(referrerAddress, freeReferrerAddress, level); } else { sendETHDividends(owner, userAddress, 1, level); users[owner].x3Matrix[level].reinvestCount++; emit Reinvest(owner, address(0), userAddress, 1, level); } } function updateX6Referrer(address userAddress, address referrerAddress, uint8 level) private { require(users[referrerAddress].activeX6Levels[level], "500. Referrer level is inactive"); if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length < 2) { users[referrerAddress].x6Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, referrerAddress, 2, level, uint8(users[referrerAddress].x6Matrix[level].firstLevelReferrals.length)); //set current level users[userAddress].x6Matrix[level].currentReferrer = referrerAddress; if (referrerAddress == owner) { return sendETHDividends(referrerAddress, userAddress, 2, level); } address ref = users[referrerAddress].x6Matrix[level].currentReferrer; users[ref].x6Matrix[level].secondLevelReferrals.push(userAddress); uint len = users[ref].x6Matrix[level].firstLevelReferrals.length; if ((len == 2) && (users[ref].x6Matrix[level].firstLevelReferrals[0] == referrerAddress) && (users[ref].x6Matrix[level].firstLevelReferrals[1] == referrerAddress)) { if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) { emit NewUserPlace(userAddress, ref, 2, level, 5); } else { emit NewUserPlace(userAddress, ref, 2, level, 6); } } else if ((len == 1 || len == 2) && users[ref].x6Matrix[level].firstLevelReferrals[0] == referrerAddress) { if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) { emit NewUserPlace(userAddress, ref, 2, level, 3); } else { emit NewUserPlace(userAddress, ref, 2, level, 4); } } else if (len == 2 && users[ref].x6Matrix[level].firstLevelReferrals[1] == referrerAddress) { if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) { emit NewUserPlace(userAddress, ref, 2, level, 5); } else { emit NewUserPlace(userAddress, ref, 2, level, 6); } } return updateX6ReferrerSecondLevel(userAddress, ref, level); } users[referrerAddress].x6Matrix[level].secondLevelReferrals.push(userAddress); if (users[referrerAddress].x6Matrix[level].closedPart != address(0)) { if ((users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] == users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]) && (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] == users[referrerAddress].x6Matrix[level].closedPart)) { updateX6(userAddress, referrerAddress, level, true); return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } else if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] == users[referrerAddress].x6Matrix[level].closedPart) { updateX6(userAddress, referrerAddress, level, true); return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } else { updateX6(userAddress, referrerAddress, level, false); return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } } if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[1] == userAddress) { updateX6(userAddress, referrerAddress, level, false); return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } else if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] == userAddress) { updateX6(userAddress, referrerAddress, level, true); return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } if (users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length <= users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length) { updateX6(userAddress, referrerAddress, level, false); } else { updateX6(userAddress, referrerAddress, level, true); } updateX6ReferrerSecondLevel(userAddress, referrerAddress, level); } function updateX6(address userAddress, address referrerAddress, uint8 level, bool x2) private { if (!x2) { users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, users[referrerAddress].x6Matrix[level].firstLevelReferrals[0], 2, level, uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length)); emit NewUserPlace(userAddress, referrerAddress, 2, level, 2 + uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length)); //set current level users[userAddress].x6Matrix[level].currentReferrer = users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]; } else { users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.push(userAddress); emit NewUserPlace(userAddress, users[referrerAddress].x6Matrix[level].firstLevelReferrals[1], 2, level, uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length)); emit NewUserPlace(userAddress, referrerAddress, 2, level, 4 + uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length)); //set current level users[userAddress].x6Matrix[level].currentReferrer = users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]; } } function updateX6ReferrerSecondLevel(address userAddress, address referrerAddress, uint8 level) private { if (users[referrerAddress].x6Matrix[level].secondLevelReferrals.length < 4) { return sendETHDividends(referrerAddress, userAddress, 2, level); } address[] memory x6 = users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].firstLevelReferrals; if (x6.length == 2) { if (x6[0] == referrerAddress || x6[1] == referrerAddress) { users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].closedPart = referrerAddress; } else if (x6.length == 1) { if (x6[0] == referrerAddress) { users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].closedPart = referrerAddress; } } } users[referrerAddress].x6Matrix[level].firstLevelReferrals = new address[](0); users[referrerAddress].x6Matrix[level].secondLevelReferrals = new address[](0); users[referrerAddress].x6Matrix[level].closedPart = address(0); if (!users[referrerAddress].activeX6Levels[level+1] && level != LAST_LEVEL) { users[referrerAddress].x6Matrix[level].blocked = true; } users[referrerAddress].x6Matrix[level].reinvestCount++; if (referrerAddress != owner) { address freeReferrerAddress = findFreeX6Referrer(referrerAddress, level); emit Reinvest(referrerAddress, freeReferrerAddress, userAddress, 2, level); updateX6Referrer(referrerAddress, freeReferrerAddress, level); } else { emit Reinvest(owner, address(0), userAddress, 2, level); sendETHDividends(owner, userAddress, 2, level); } } function findFreeX3Referrer(address userAddress, uint8 level) public view returns(address) { while (true) { if (users[users[userAddress].referrer].activeX3Levels[level]) { return users[userAddress].referrer; } userAddress = users[userAddress].referrer; } } function findFreeX6Referrer(address userAddress, uint8 level) public view returns(address) { while (true) { if (users[users[userAddress].referrer].activeX6Levels[level]) { return users[userAddress].referrer; } userAddress = users[userAddress].referrer; } } function usersActiveX3Levels(address userAddress, uint8 level) public view returns(bool) { return users[userAddress].activeX3Levels[level]; } function usersActiveX6Levels(address userAddress, uint8 level) public view returns(bool) { return users[userAddress].activeX6Levels[level]; } function usersX3Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, bool ,uint) { return (users[userAddress].x3Matrix[level].currentReferrer, users[userAddress].x3Matrix[level].referrals, users[userAddress].x3Matrix[level].blocked, users[userAddress].x3Matrix[level].reinvestCount); } function usersX6Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, address[] memory, bool, address,uint) { return (users[userAddress].x6Matrix[level].currentReferrer, users[userAddress].x6Matrix[level].firstLevelReferrals, users[userAddress].x6Matrix[level].secondLevelReferrals, users[userAddress].x6Matrix[level].blocked, users[userAddress].x6Matrix[level].closedPart, users[userAddress].x6Matrix[level].reinvestCount); } function isUserExists(address user) public view returns (bool) { return (users[user].id != 0); } function findEthReceiver(address userAddress, address _from, uint8 matrix, uint8 level) private returns(address, bool) { address receiver = userAddress; bool isExtraDividends; if (matrix == 1) { while (true) { if (users[receiver].x3Matrix[level].blocked) { emit MissedEthReceive(receiver, _from, 1, level); isExtraDividends = true; receiver = users[receiver].x3Matrix[level].currentReferrer; } else { return (receiver, isExtraDividends); } } } else { while (true) { if (users[receiver].x6Matrix[level].blocked) { emit MissedEthReceive(receiver, _from, 2, level); isExtraDividends = true; receiver = users[receiver].x6Matrix[level].currentReferrer; } else { return (receiver, isExtraDividends); } } } } function sendETHDividends(address userAddress, address _from, uint8 matrix, uint8 level) private { (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, matrix, level); if (!address(uint160(receiver)).send(levelPrice[level])) { return address(uint160(receiver)).transfer(address(this).balance); } if (isExtraDividends) { emit SentExtraEthDividends(_from, receiver, matrix, level); } } function bytesToAddress(bytes memory bys) private pure returns (address addr) { assembly { addr := mload(add(bys, 20)) } } } library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin- solidity/pull/522 if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { assert(b > 0); // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } } contract Token { /// @return total amount of tokens //function totalSupply() public view returns (uint supply); /// @param _owner The address from which the balance will be retrieved /// @return The balance function balanceOf(address _owner) public view returns (uint balance); /// @notice send `_value` token to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transfer(address _to, uint _value) public returns (bool success); /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` /// @param _from The address of the sender /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transferFrom(address _from, address _to, uint _value) public returns (bool success); /// @notice `msg.sender` approves `_addr` to spend `_value` tokens /// @param _spender The address of the account able to transfer the tokens /// @param _value The amount of wei to be approved for transfer /// @return Whether the approval was successful or not function approve(address _spender, uint _value) public returns (bool success); /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens allowed to spent function allowance(address _owner, address _spender) public view returns (uint remaining); event Transfer(address indexed _from, address indexed _to, uint _value); event Approval(address indexed _owner, address indexed _spender, uint _value); } contract RegularToken is Token { using SafeMath for uint256; function transfer(address _to, uint _value) public returns (bool) { require(_to != address(0)); //Default assumes totalSupply can't be over max (2^256 - 1). require(balances[msg.sender] >= _value); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } function transferFrom(address _from, address _to, uint _value) public returns (bool) { require(_to != address(0)); require(balances[_from] >= _value); require(allowed[_from][msg.sender] >= _value); balances[_to] = balances[_to].add(_value); balances[_from] = balances[_from].sub(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } function balanceOf(address _owner) public view returns (uint) { return balances[_owner]; } function approve(address _spender, uint _value) public returns (bool) { require(_spender != address(0)); allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function allowance(address _owner, address _spender) public view returns (uint) { return allowed[_owner][_spender]; } mapping(address => uint) balances; mapping(address => mapping(address => uint)) allowed; uint public totalSupply; } contract UnboundedRegularToken is RegularToken { uint constant MAX_UINT = 2 ** 256 - 1; /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited amount. /// @param _from Address to transfer from. /// @param _to Address to transfer to. /// @param _value Amount to transfer. /// @return Success of transfer. function transferFrom(address _from, address _to, uint _value) public returns (bool) { require(_to != address(0)); uint allowance = allowed[_from][msg.sender]; require(balances[_from] >= _value); require(allowance >= _value); balances[_to] = balances[_to].add(_value); balances[_from] = balances[_from].sub(_value); if (allowance < MAX_UINT) { allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); } emit Transfer(_from, _to, _value); return true; } } contract ETPlanToken is UnboundedRegularToken { uint8 constant public decimals = 18; string constant public name = "ETPlanToken"; string constant public symbol = "ELS"; constructor() public { totalSupply = 33 * 10 ** 25; balances[msg.sender] = totalSupply; emit Transfer(address(0), msg.sender, totalSupply); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_etplan","type":"address"}],"name":"initQ8","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LAST_LEVEL","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"idToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_this","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUserId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_level","type":"uint8"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"income","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"isUserExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_manager","type":"address"}],"name":"updateManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawELS","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"referrerAddress","type":"address"}],"name":"registrationExt","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"q8Matrix","outputs":[{"name":"currentReferrer","type":"address"},{"name":"reinvestCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pool","type":"address"}],"name":"updatePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"},{"name":"level","type":"uint8"}],"name":"findFreeQ8Referrer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"level","type":"uint8"}],"name":"buyNewLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"activeQ8Levels","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"super","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"users","outputs":[{"name":"id","type":"uint256"},{"name":"referrer","type":"address"},{"name":"partnersCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"getUserInfo","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_super","type":"address"}],"name":"updateSuper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eTPlanToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_level","type":"uint8"}],"name":"updateBlocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"level","type":"uint8"}],"name":"getq8Matrix","outputs":[{"name":"","type":"address"},{"name":"","type":"address[]"},{"name":"","type":"address[]"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"blocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_etplan","type":"address"},{"name":"start","type":"uint256"},{"name":"end","type":"uint256"}],"name":"initData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"level","type":"uint8"},{"indexed":false,"name":"place","type":"uint8"}],"name":"NewUserPlace","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":true,"name":"userId","type":"uint256"},{"indexed":false,"name":"referrerId","type":"uint256"}],"name":"Registration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"receiver","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"MissedEthReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"SentExtraEthDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"NewRound","type":"event"}]
Contract Creation Code
608060405260026000553480156200001657600080fd5b5067016345785d8a000060056000600160ff168152602001908152602001600020819055506000600290505b600c60ff168160ff16116200009c576002600560006001840360ff1660ff1681526020019081526020016000205402600560008360ff1660ff16815260200190815260200160002081905550808060010191505062000042565b5030600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614c9f806200012f6000396000f3fe6080604052600436106101c25760003560e01c80637b46c54f116100f7578063b325d14e11610095578063ccf19b3111610064578063ccf19b3114610ba5578063d845e63014610cba578063ecabdf7914610d30578063faa9f04b14610d82576101c2565b8063b325d14e14610a17578063bd47341014610a9f578063bf3c41f814610af0578063bf77b45914610b47576101c2565b806387d84e9f116100d157806387d84e9f146108545780638da5cb5b146108ca578063910d13e814610921578063a87430ba14610978576101c2565b80637b46c54f146107345780637ce36ec014610785578063876cb21714610823576101c2565b8063481c6a751161016457806358aba00f1161013e57806358aba00f146105bf5780637337088d14610610578063797eee241461066b5780637b3f6926146106af576101c2565b8063481c6a751461048d5780634a6e1870146104e4578063509222cd14610556576101c2565b80632a2d0c47116101a05780632a2d0c47146103325780632b5ab84a146103ad578063348d448714610404578063356ac86e1461042f576101c2565b80631411a5411461025957806316f0115b146102aa57806329c7040014610301575b60008036905014156101ff576101fa33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610de7565b610257565b610256336102516000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061160d565b610de7565b5b005b34801561026557600080fd5b506102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b005b3480156102b657600080fd5b506102bf611be1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611c07565b604051808260ff1660ff16815260200191505060405180910390f35b34801561033e57600080fd5b5061036b6004803603602081101561035557600080fd5b8101908080359060200190929190505050611c0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b957600080fd5b506103c2611c3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561041057600080fd5b50610419611c65565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b5061048b6004803603604081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611c6b565b005b34801561049957600080fd5b506104a2611e1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104f057600080fd5b506105406004803603604081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611e42565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b506105a56004803603602081101561057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b604051808215151515815260200191505060405180910390f35b3480156105cb57600080fd5b5061060e600480360360208110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef5565b005b34801561061c57600080fd5b506106696004803603604081101561063357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f93565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120d6565b005b3480156106bb57600080fd5b506106eb600480360360208110156106d257600080fd5b81019080803560ff1690602001909291905050506120e3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561074057600080fd5b506107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b34801561079157600080fd5b506107e1600480360360408110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506121c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108526004803603602081101561083957600080fd5b81019080803560ff169060200190929190505050612378565b005b34801561086057600080fd5b506108b06004803603604081101561087757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ad8565b604051808215151515815260200191505060405180910390f35b3480156108d657600080fd5b506108df612b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561092d57600080fd5b50610936612b6f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561098457600080fd5b506109c76004803603602081101561099b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b95565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b348015610a2357600080fd5b50610a7360048036036040811015610a3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612bdf565b604051808415151515815260200183151515158152602001828152602001935050505060405180910390f35b348015610aab57600080fd5b50610aee60048036036020811015610ac257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d19565b005b348015610afc57600080fd5b50610b05612db7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b5357600080fd5b50610ba360048036036040811015610b6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ddd565b005b348015610bb157600080fd5b50610be160048036036020811015610bc857600080fd5b81019080803560ff169060200190929190505050612f8e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610c60578082015181840152602081019050610c45565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610ca2578082015181840152602081019050610c87565b50505050905001965050505050505060405180910390f35b348015610cc657600080fd5b50610d1660048036036040811015610cdd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050613146565b604051808215151515815260200191505060405180910390f35b348015610d3c57600080fd5b50610d6c60048036036020811015610d5357600080fd5b81019080803560ff1690602001909291905050506131b7565b6040518082815260200191505060405180910390f35b348015610d8e57600080fd5b50610de560048036036060811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506131cf565b005b67016345785d8a00003414610e64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610e6d82611ea6565b15610ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ee981611ea6565b610f5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610fdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610fe5614b4c565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46112d584846001613862565b6002600360056000600160ff1660ff1681526020019081526020016000205402816112fc57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b81019080805190602001909291905050501061160757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161156057fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167557600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d60208110156117ab57600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184257600080fd5b505afa158015611856573d6000803e3d6000fd5b505050506040513d602081101561186c57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561190357600080fd5b505afa158015611917573d6000803e3d6000fd5b505050506040513d602081101561192d57600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600190505b600c8160ff1611611bdc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611a2c57600080fd5b81019080805190602001909291908051640100000000811115611a4e57600080fd5b82810190506020810184811115611a6457600080fd5b8151856020820283011164010000000082111715611a8157600080fd5b50509291906020018051640100000000811115611a9d57600080fd5b82810190506020810184811115611ab357600080fd5b8151856020820283011164010000000082111715611ad057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff1681526020019081526020016000206001019080519060200190611b78929190614b83565b5081600660008760ff1660ff1681526020019081526020016000206002019080519060200190611ba9929190614b83565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611985565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc557600080fd5b611cce82611ea6565b611d40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fed57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d60208110156120c057600080fd5b8101908080519060200190929190505050505050565b6120e03382610de7565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b6001156123715760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561230757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612372565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506121c8565b5b92915050565b61238133611ea6565b6123d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614c516023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561247e5750600c60ff168160ff1611155b6124f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff16156126af576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061272d33836121c5565b905061273a338284613862565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816127cb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b810190808051906020019092919050505010612ad457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050506040513d60208110156129b957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff1681526020019081526020016000205481612a2d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b6000806000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008760ff1660ff168152602001908152602001600020549250925092509250925092565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d7357600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e3757600080fd5b612e4082611ea6565b612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156130a857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161305e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561313057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130e6575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322957600080fd5b60008390506001820160008190555060008390505b82811161385b5760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561329857600080fd5b505afa1580156132ac573d6000803e3d6000fd5b505050506040513d60208110156132c257600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b15801561335757600080fd5b505afa15801561336b573d6000803e3d6000fd5b505050506040513d606081101561338157600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092506133b4614b4c565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116137f6576003871415613589576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506137e9565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561374f57600080fd5b505afa158015613763573d6000803e3d6000fd5b505050506040513d602081101561377957600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b808060010191505061348c565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050808060010191505061323e565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1661393b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161396057fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816139c257fe5b0410613abf57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff16158015613a465750600c60ff168160ff1614155b15613abe576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff16815260200190815260200160002060010180549050101561406457600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7c57600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613d77828483600560008660ff1660ff168152602001908152602001600020546148ad565b6148a8565b600060646014600560008560ff1660ff168152602001908152602001600020540281613da457fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613e8857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613e81573d6000803e3d6000fd5b50506148a8565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613eb057fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613f9557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613f8d573d6000803e3d6000fd5b5050506148a8565b6000613fa186856121c5565b90506002600560008660ff1660ff1681526020019081526020016000205481613fc657fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff1681526020019081526020016000206000828254019250508190555061405c8187866002600560008a60ff1660ff168152602001908152602001600020548161405657fe5b046148ad565b5050506148a8565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156144ab57600061420e84836121c5565b90506002600560008460ff1660ff168152602001908152602001600020548161423357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142c98185846002600560008860ff1660ff16815260200190815260200160002054816142c357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142f157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506143d657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143ce573d6000803e3d6000fd5b5050506148a8565b60006143e283856121c5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161440a57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506144a38187866064601e600560008b60ff1660ff16815260200190815260200160002054028161449d57fe5b046148ad565b5050506148a8565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156145c257600660008260ff1660ff16815260200190815260200160002060030160008154809291906001019190505550600060405190808252806020026020018201604052801561452f5781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061455f929190614b83565b5060006040519080825280602002602001820160405280156145905781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906145c0929190614b83565b505b60006145ce84836121c5565b90506002600560008460ff1660ff16815260200190815260200160002054816145f357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506146898185846002600560008860ff1660ff168152602001908152602001600020548161468357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816146b157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061479657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561478e573d6000803e3d6000fd5b5050506148a8565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816147be57fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506148a457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561489b573d6000803e3d6000fd5b505050506148a8565b5050505b505050565b6000806148bb8686866149d8565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061495d578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614955573d6000803e3d6000fd5b5050506149d2565b80156149cf578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b600115614b4157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614b2f578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614b3c565b8181935093505050614b44565b6149e3565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614bfc579160200282015b82811115614bfb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614ba3565b5b509050614c099190614c0d565b5090565b614c4d91905b80821115614c4957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101614c13565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a723058207c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b7600029
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80637b46c54f116100f7578063b325d14e11610095578063ccf19b3111610064578063ccf19b3114610ba5578063d845e63014610cba578063ecabdf7914610d30578063faa9f04b14610d82576101c2565b8063b325d14e14610a17578063bd47341014610a9f578063bf3c41f814610af0578063bf77b45914610b47576101c2565b806387d84e9f116100d157806387d84e9f146108545780638da5cb5b146108ca578063910d13e814610921578063a87430ba14610978576101c2565b80637b46c54f146107345780637ce36ec014610785578063876cb21714610823576101c2565b8063481c6a751161016457806358aba00f1161013e57806358aba00f146105bf5780637337088d14610610578063797eee241461066b5780637b3f6926146106af576101c2565b8063481c6a751461048d5780634a6e1870146104e4578063509222cd14610556576101c2565b80632a2d0c47116101a05780632a2d0c47146103325780632b5ab84a146103ad578063348d448714610404578063356ac86e1461042f576101c2565b80631411a5411461025957806316f0115b146102aa57806329c7040014610301575b60008036905014156101ff576101fa33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610de7565b610257565b610256336102516000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061160d565b610de7565b5b005b34801561026557600080fd5b506102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b005b3480156102b657600080fd5b506102bf611be1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611c07565b604051808260ff1660ff16815260200191505060405180910390f35b34801561033e57600080fd5b5061036b6004803603602081101561035557600080fd5b8101908080359060200190929190505050611c0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b957600080fd5b506103c2611c3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561041057600080fd5b50610419611c65565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b5061048b6004803603604081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611c6b565b005b34801561049957600080fd5b506104a2611e1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104f057600080fd5b506105406004803603604081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611e42565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b506105a56004803603602081101561057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b604051808215151515815260200191505060405180910390f35b3480156105cb57600080fd5b5061060e600480360360208110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef5565b005b34801561061c57600080fd5b506106696004803603604081101561063357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f93565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120d6565b005b3480156106bb57600080fd5b506106eb600480360360208110156106d257600080fd5b81019080803560ff1690602001909291905050506120e3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561074057600080fd5b506107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b34801561079157600080fd5b506107e1600480360360408110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506121c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108526004803603602081101561083957600080fd5b81019080803560ff169060200190929190505050612378565b005b34801561086057600080fd5b506108b06004803603604081101561087757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ad8565b604051808215151515815260200191505060405180910390f35b3480156108d657600080fd5b506108df612b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561092d57600080fd5b50610936612b6f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561098457600080fd5b506109c76004803603602081101561099b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b95565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b348015610a2357600080fd5b50610a7360048036036040811015610a3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612bdf565b604051808415151515815260200183151515158152602001828152602001935050505060405180910390f35b348015610aab57600080fd5b50610aee60048036036020811015610ac257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d19565b005b348015610afc57600080fd5b50610b05612db7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b5357600080fd5b50610ba360048036036040811015610b6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ddd565b005b348015610bb157600080fd5b50610be160048036036020811015610bc857600080fd5b81019080803560ff169060200190929190505050612f8e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610c60578082015181840152602081019050610c45565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610ca2578082015181840152602081019050610c87565b50505050905001965050505050505060405180910390f35b348015610cc657600080fd5b50610d1660048036036040811015610cdd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050613146565b604051808215151515815260200191505060405180910390f35b348015610d3c57600080fd5b50610d6c60048036036020811015610d5357600080fd5b81019080803560ff1690602001909291905050506131b7565b6040518082815260200191505060405180910390f35b348015610d8e57600080fd5b50610de560048036036060811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506131cf565b005b67016345785d8a00003414610e64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610e6d82611ea6565b15610ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ee981611ea6565b610f5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610fdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610fe5614b4c565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46112d584846001613862565b6002600360056000600160ff1660ff1681526020019081526020016000205402816112fc57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b81019080805190602001909291905050501061160757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161156057fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167557600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d60208110156117ab57600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184257600080fd5b505afa158015611856573d6000803e3d6000fd5b505050506040513d602081101561186c57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561190357600080fd5b505afa158015611917573d6000803e3d6000fd5b505050506040513d602081101561192d57600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600190505b600c8160ff1611611bdc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611a2c57600080fd5b81019080805190602001909291908051640100000000811115611a4e57600080fd5b82810190506020810184811115611a6457600080fd5b8151856020820283011164010000000082111715611a8157600080fd5b50509291906020018051640100000000811115611a9d57600080fd5b82810190506020810184811115611ab357600080fd5b8151856020820283011164010000000082111715611ad057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff1681526020019081526020016000206001019080519060200190611b78929190614b83565b5081600660008760ff1660ff1681526020019081526020016000206002019080519060200190611ba9929190614b83565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611985565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc557600080fd5b611cce82611ea6565b611d40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fed57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d60208110156120c057600080fd5b8101908080519060200190929190505050505050565b6120e03382610de7565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b6001156123715760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561230757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612372565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506121c8565b5b92915050565b61238133611ea6565b6123d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614c516023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561247e5750600c60ff168160ff1611155b6124f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff16156126af576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061272d33836121c5565b905061273a338284613862565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816127cb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b810190808051906020019092919050505010612ad457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050506040513d60208110156129b957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff1681526020019081526020016000205481612a2d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b6000806000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008760ff1660ff168152602001908152602001600020549250925092509250925092565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d7357600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e3757600080fd5b612e4082611ea6565b612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156130a857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161305e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561313057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130e6575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322957600080fd5b60008390506001820160008190555060008390505b82811161385b5760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561329857600080fd5b505afa1580156132ac573d6000803e3d6000fd5b505050506040513d60208110156132c257600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b15801561335757600080fd5b505afa15801561336b573d6000803e3d6000fd5b505050506040513d606081101561338157600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092506133b4614b4c565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116137f6576003871415613589576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506137e9565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561374f57600080fd5b505afa158015613763573d6000803e3d6000fd5b505050506040513d602081101561377957600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b808060010191505061348c565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050808060010191505061323e565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1661393b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161396057fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816139c257fe5b0410613abf57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff16158015613a465750600c60ff168160ff1614155b15613abe576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff16815260200190815260200160002060010180549050101561406457600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7c57600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613d77828483600560008660ff1660ff168152602001908152602001600020546148ad565b6148a8565b600060646014600560008560ff1660ff168152602001908152602001600020540281613da457fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613e8857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613e81573d6000803e3d6000fd5b50506148a8565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613eb057fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613f9557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613f8d573d6000803e3d6000fd5b5050506148a8565b6000613fa186856121c5565b90506002600560008660ff1660ff1681526020019081526020016000205481613fc657fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff1681526020019081526020016000206000828254019250508190555061405c8187866002600560008a60ff1660ff168152602001908152602001600020548161405657fe5b046148ad565b5050506148a8565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156144ab57600061420e84836121c5565b90506002600560008460ff1660ff168152602001908152602001600020548161423357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142c98185846002600560008860ff1660ff16815260200190815260200160002054816142c357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142f157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506143d657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143ce573d6000803e3d6000fd5b5050506148a8565b60006143e283856121c5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161440a57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506144a38187866064601e600560008b60ff1660ff16815260200190815260200160002054028161449d57fe5b046148ad565b5050506148a8565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156145c257600660008260ff1660ff16815260200190815260200160002060030160008154809291906001019190505550600060405190808252806020026020018201604052801561452f5781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061455f929190614b83565b5060006040519080825280602002602001820160405280156145905781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906145c0929190614b83565b505b60006145ce84836121c5565b90506002600560008460ff1660ff16815260200190815260200160002054816145f357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506146898185846002600560008860ff1660ff168152602001908152602001600020548161468357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816146b157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061479657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561478e573d6000803e3d6000fd5b5050506148a8565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816147be57fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506148a457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561489b573d6000803e3d6000fd5b505050506148a8565b5050505b505050565b6000806148bb8686866149d8565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061495d578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614955573d6000803e3d6000fd5b5050506149d2565b80156149cf578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b600115614b4157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614b2f578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614b3c565b8181935093505050614b44565b6149e3565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614bfc579160200282015b82811115614bfb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614ba3565b5b509050614c099190614c0d565b5090565b614c4d91905b80821115614c4957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101614c13565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a723058207c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b7600029
Deployed Bytecode Sourcemap
60:13349:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3725:1;3706:8;;:15;;:20;3702:91;;;3750:31;3763:10;3775:5;;;;;;;;;;;3750:12;:31::i;:::-;3743:38;;3702:91;3805:50;3818:10;3830:24;3845:8;;3830:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3830:24:0;;;;;;:14;:24::i;:::-;3805:12;:50::i;:::-;3663:200;60:13349;1743:768;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1743:768:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1743:768:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;596:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;596:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;490:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;490:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;820:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;820:43:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1380:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1380:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;536:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;536:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12838:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12838:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12838:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;622:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;622:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11880:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11880:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11880:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11318:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11318:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11318:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12640:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12640:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12640:95:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13273:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13273:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13273:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3871:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3871:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;733:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;733:36:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;733:36:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12549:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12549:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12549:83:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;9970:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9970:338:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9970:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5284:999;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5284:999:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11602:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11602:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11602:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;569:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;569:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1351;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1351:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;776:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;776:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;776:37:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12010:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12010:226:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12010:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12743:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12743:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12743:87:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;651:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;651:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13059:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13059:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13059:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12244:297;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12244:297:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12244:297:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12244:297:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12244:297:0;;;;;;;;;;;;;;;;;;;;;11748:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11748:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11748:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;686:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;686:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;686:40:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2519:1136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2519:1136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2519:1136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4006:1270;4114:9;4101;:22;4093:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4169:25;4182:11;4169:12;:25::i;:::-;4168:26;4160:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:29;4242:15;4229:12;:29::i;:::-;4221:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4295:11;4361;4349:24;4341:32;;4410:1;4402:4;:9;;;4394:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4449:16;;:::i;:::-;4468:124;;;;;;;;4493:10;;4468:124;;;;4529:15;4468:124;;;;;;4575:1;4468:124;;;4449:143;;4626:4;4605:5;:18;4611:11;4605:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4667:11;4641;:23;4653:10;;4641:23;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4730:4;4691:5;:18;4697:11;4691:18;;;;;;;;;;;;;;;:33;;:36;4725:1;4691:36;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;4747:10;;:12;;;;;;;;;;;;;4772:5;:22;4778:15;4772:22;;;;;;;;;;;;;;;:36;;;:38;;;;;;;;;;;;;4871:5;:18;4877:11;4871:18;;;;;;;;;;;;;;;:21;;;4854:15;4828:92;;4841:11;4828:92;;;4894:5;:22;4900:15;4894:22;;;;;;;;;;;;;;;:25;;;4828:92;;;;;;;;;;;;;;;;;;4933:56;4950:11;4963:15;4986:1;4933:16;:56::i;:::-;5077:1;5073;5050:10;:20;5067:1;5050:20;;;;;;;;;;;;;;;;:24;:28;;;;;;5016:11;;;;;;;;;;;5004:34;;;5039:5;;;;;;;;;;;5004:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5004:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5004:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5004:41:0;;;;;;;;;;;;;;;;:75;5000:267;;5108:11;;;;;;;;;;;5096:33;;;5130:11;5143:10;:20;5160:1;5143:20;;;;;;;;;;;;;;;;5096:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5096:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5096:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5096:68:0;;;;;;;;;;;;;;;;;5191:11;;;;;;;;;;;5179:33;;;5213:15;5253:1;5230:10;:20;5247:1;5230:20;;;;;;;;;;;;;;;;:24;;;;;;5179:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5179:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5179:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5179:76:0;;;;;;;;;;;;;;;;;5000:267;4006:1270;;;;:::o;11436:158::-;11500:12;11572:2;11567:3;11563:12;11557:19;11549:27;;11534:53;;;:::o;1743:768::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;1806:15;1849:7;1806:53;;1878:6;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1878:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1878:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1878:14:0;;;;;;;;;;;;;;;;1870:5;;:22;;;;;;;;;;;;;;;;;;1913:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1913:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1913:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1913:16:0;;;;;;;;;;;;;;;;1903:7;;:26;;;;;;;;;;;;;;;;;;1947:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1947:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1947:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1947:13:0;;;;;;;;;;;;;;;;1940:4;;:20;;;;;;;;;;;;;;;;;;1985:6;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1985:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1985:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1985:20:0;;;;;;;;;;;;;;;;1971:11;;:34;;;;;;;;;;;;;;;;;;2023:7;2033:1;2023:11;;2018:486;2041:2;2036:1;:7;;;2018:486;;2066:23;2091:36;2143:37;2195:18;2217:6;:18;;;2236:1;2217:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2217:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2217:21:0;;;;;;39:16:-1;36:1;17:17;2:54;2217:21:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;2217:21:0;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;2217:21:0;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;2217:21:0;;;;;;;;;;;;;;;;;2065:173;;;;;;;;2283:15;2253:8;:11;2262:1;2253:11;;;;;;;;;;;;;;;:27;;;:45;;;;;;;;;;;;;;;;;;2347:19;2313:8;:11;2322:1;2313:11;;;;;;;;;;;;;;;:31;;:53;;;;;;;;;;;;:::i;:::-;;2416:20;2381:8;:11;2390:1;2381:11;;;;;;;;;;;;;;;:32;;:55;;;;;;;;;;;;:::i;:::-;;2479:13;2451:8;:11;2460:1;2451:11;;;;;;;;;;;;;;;:25;;:41;;;;2018:486;;;;2045:3;;;;;;;2018:486;;;;1478:1;1743:768;:::o;596:19::-;;;;;;;;;;;;;:::o;490:37::-;525:2;490:37;:::o;820:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;1380:20::-;;;;;;;;;;;;;:::o;536:26::-;;;;:::o;12838:213::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12919:19;12932:5;12919:12;:19::i;:::-;12911:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13008:5;:12;13014:5;13008:12;;;;;;;;;;;;;;;:27;;:35;13036:6;13008:35;;;;;;;;;;;;;;;;;;;;;;;;;13007:36;12969:5;:12;12975:5;12969:12;;;;;;;;;;;;;;;:27;;:35;12997:6;12969:35;;;;;;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;12838:213;;:::o;622:22::-;;;;;;;;;;;;;:::o;11880:122::-;11945:4;11968:5;:12;11974:5;11968:12;;;;;;;;;;;;;;;:19;;:26;11988:5;11968:26;;;;;;;;;;;;;;;;11961:33;;11880:122;;;;:::o;11318:110::-;11375:4;11418:1;11400:5;:11;11406:4;11400:11;;;;;;;;;;;;;;;:14;;;:19;;11392:28;;11318:110;;;:::o;12640:95::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12719:8;12709:7;;:18;;;;;;;;;;;;;;;;;;12640:95;:::o;13273:133::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;13362:11;;;;;;;;;;;13350:33;;;13384:5;13391:6;13350:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13350:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13350:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13350:48:0;;;;;;;;;;;;;;;;;13273:133;;:::o;3871:127::-;3949:41;3962:10;3974:15;3949:12;:41::i;:::-;3871:127;:::o;733:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12549:83::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12619:5;12612:4;;:12;;;;;;;;;;;;;;;;;;12549:83;:::o;9970:338::-;10053:7;10073:228;10080:4;10073:228;;;10105:5;:34;10111:5;:18;10117:11;10111:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10105:34;;;;;;;;;;;;;;;:49;;:56;10155:5;10105:56;;;;;;;;;;;;;;;;;;;;;;;;;10101:131;;;10189:5;:18;10195:11;10189:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10182:34;;;;10101:131;10262:5;:18;10268:11;10262:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10248:41;;10073:228;;;9970:338;;;;;:::o;5284:999::-;5354:24;5367:10;5354:12;:24::i;:::-;5346:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5450:10;:17;5461:5;5450:17;;;;;;;;;;;;;;;;5437:9;:30;5429:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5512:1;5504:5;:9;;;:32;;;;;525:2;5517:19;;:5;:19;;;;5504:32;5496:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5574:5;:17;5580:10;5574:17;;;;;;;;;;;;;;;:32;;:39;5607:5;5574:39;;;;;;;;;;;;;;;;;;;;;;;;;5573:40;5565:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5658:5;:17;5664:10;5658:17;;;;;;;;;;;;;;;:25;;:36;5692:1;5684:5;:9;5658:36;;;;;;;;;;;;;;;;;;;;;;;;;5654:113;;;5750:5;5711;:17;5717:10;5711:17;;;;;;;;;;;;;;;:25;;:36;5745:1;5737:5;:9;5711:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;5654:113;5819:4;5777:5;:17;5783:10;5777:17;;;;;;;;;;;;;;;:32;;:39;5810:5;5777:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5834:20;5857:37;5876:10;5888:5;5857:18;:37::i;:::-;5834:60;;5905:49;5922:10;5934:12;5948:5;5905:16;:49::i;:::-;5991:12;5970:41;;5979:10;5970:41;;;6005:5;5970:41;;;;;;;;;;;;;;;;;;;;;;6096:1;6092;6072:10;:17;6083:5;6072:17;;;;;;;;;;;;;;;;:21;:25;;;;;;6038:11;;;;;;;;;;;6026:34;;;6061:5;;;;;;;;;;;6026:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6026:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6026:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6026:41:0;;;;;;;;;;;;;;;;:72;6022:254;;6127:11;;;;;;;;;;;6115:33;;;6149:10;6161;:17;6172:5;6161:17;;;;;;;;;;;;;;;;6115:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6115:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6115:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6115:64:0;;;;;;;;;;;;;;;;;6206:11;;;;;;;;;;;6194:33;;;6228:12;6262:1;6242:10;:17;6253:5;6242:17;;;;;;;;;;;;;;;;:21;;;;;;6194:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6194:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6194:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6194:70:0;;;;;;;;;;;;;;;;;6022:254;5284:999;;:::o;11602:138::-;11675:4;11698:5;:12;11704:5;11698:12;;;;;;;;;;;;;;;:27;;:34;11726:5;11698:34;;;;;;;;;;;;;;;;;;;;;;;;;11691:41;;11602:138;;;;:::o;569:20::-;;;;;;;;;;;;;:::o;1351:::-;;;;;;;;;;;;;:::o;776:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12010:226::-;12080:4;12086;12092;12116:5;:12;12122:5;12116:12;;;;;;;;;;;;;;;:27;;:34;12144:5;12116:34;;;;;;;;;;;;;;;;;;;;;;;;;12162:5;:12;12168:5;12162:12;;;;;;;;;;;;;;;:20;;:27;12183:5;12162:27;;;;;;;;;;;;;;;;;;;;;;;;;12201:5;:12;12207:5;12201:12;;;;;;;;;;;;;;;:19;;:26;12221:5;12201:26;;;;;;;;;;;;;;;;12108:120;;;;;;12010:226;;;;;:::o;12743:87::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12816:6;12808:5;;:14;;;;;;;;;;;;;;;;;;12743:87;:::o;651:26::-;;;;;;;;;;;;;:::o;13059:206::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;13147:19;13160:5;13147:12;:19::i;:::-;13139:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13229:5;:12;13235:5;13229:12;;;;;;;;;;;;;;;:20;;:28;13250:6;13229:28;;;;;;;;;;;;;;;;;;;;;;;;;13228:29;13197:5;:12;13203:5;13197:12;;;;;;;;;;;;;;;:20;;:28;13218:6;13197:28;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13059:206;;:::o;12244:297::-;12299:7;12308:16;12326;12344:4;12368:8;:15;12377:5;12368:15;;;;;;;;;;;;;;;:31;;;;;;;;;;;;12410:8;:15;12419:5;12410:15;;;;;;;;;;;;;;;:35;;12456:8;:15;12465:5;12456:15;;;;;;;;;;;;;;;:36;;12503:8;:15;12512:5;12503:15;;;;;;;;;;;;;;;:29;;;12360:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12244:297;;;;;:::o;11748:124::-;11814:4;11837:5;:12;11843:5;11837:12;;;;;;;;;;;;;;;:20;;:27;11858:5;11837:27;;;;;;;;;;;;;;;;;;;;;;;;;11830:34;;11748:124;;;;:::o;686:40::-;;;;;;;;;;;;;;;;;:::o;2519:1136::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;2608:15;2651:7;2608:53;;2693:1;2687:3;:7;2674:10;:20;;;;2712:6;2721:5;2712:14;;2707:941;2733:3;2728:1;:8;2707:941;;2758:19;2780:6;:18;;;2799:1;2780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2780:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2780:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2780:21:0;;;;;;;;;;;;;;;;2758:43;;2817:7;2825:16;2842:18;2864:6;:12;;;2877:11;2864:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2864:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2864:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2864:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2816:73;;;;;;2904:16;;:::i;:::-;2923:137;;;;;;;;2952:2;2923:137;;;;2984:8;2923:137;;;;;;3027:13;2923:137;;;2904:156;;3096:4;3075:5;:18;3081:11;3075:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3122:7;3132:1;3122:11;;3117:475;3140:2;3135:1;:7;;;3117:475;;3177:1;3172;:6;3168:409;;;3235:4;3203:5;:18;3209:11;3203:18;;;;;;;;;;;;;;;:26;;:29;3230:1;3203:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;3301:5;3262;:18;3268:11;3262:18;;;;;;;;;;;;;;;:33;;:36;3296:1;3262:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;3168:409;;;3355:11;3369:6;:21;;;3391:11;3404:1;3369:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3369:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3369:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3369:37:0;;;;;;;;;;;;;;;;3355:51;;3468:6;3429:5;:18;3435:11;3429:18;;;;;;;;;;;;;;;:33;;:36;3463:1;3429:36;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;3528:6;:13;;;3542:11;3555:1;3528:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3528:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3528:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3528:29:0;;;;;;;;;;;;;;;;3497:5;:18;3503:11;3497:18;;;;;;;;;;;;;;;:25;;:28;3523:1;3497:28;;;;;;;;;;;;;;;:60;;;;3168:409;;3144:3;;;;;;;3117:475;;;;3625:11;3608;:14;3620:1;3608:14;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2707:941;;;;;2738:3;;;;;;;2707:941;;;;1478:1;2519:1136;;;:::o;6291:3671::-;6403:5;:22;6409:15;6403:22;;;;;;;;;;;;;;;:37;;:44;6441:5;6403:44;;;;;;;;;;;;;;;;;;;;;;;;;6395:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6568:1;6561;6541:10;:17;6552:5;6541:17;;;;;;;;;;;;;;;;:21;;;;;;6501:5;:22;6507:15;6501:22;;;;;;;;;;;;;;;:29;;:36;6531:5;6501:36;;;;;;;;;;;;;;;;:62;;;;;;6500:69;6496:258;;6591:5;:22;6597:15;6591:22;;;;;;;;;;;;;;;:37;;:48;6637:1;6629:5;:9;6591:48;;;;;;;;;;;;;;;;;;;;;;;;;6590:49;:72;;;;;525:2;6643:19;;:5;:19;;;;6590:72;6586:157;;;6723:4;6683:5;:22;6689:15;6683:22;;;;;;;;;;;;;;;:30;;:37;6714:5;6683:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;6586:157;6496:258;6813:1;6768:8;:15;6777:5;6768:15;;;;;;;;;;;;;;;:35;;:42;;;;:46;6764:1234;;;6831:8;:15;6840:5;6831:15;;;;;;;;;;;;;;;:35;;6872:11;6831:53;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6831:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6930:15;6904:100;;6917:11;6904:100;;;6947:5;6960:8;:15;6969:5;6960:15;;;;;;;;;;;;;;;:35;;:42;;;;6904:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7055:15;7021:8;:15;7030:5;7021:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;7108:5;;;;;;;;;;;7089:24;;:15;:24;;;7085:210;;;7164:10;:17;7175:5;7164:17;;;;;;;;;;;;;;;;7134:5;:12;7140:5;;;;;;;;;;;7134:12;;;;;;;;;;;;;;;:19;;:26;7154:5;7134:26;;;;;;;;;;;;;;;;:47;;;;;;;;;;;7207:72;7224:15;7241:11;7254:5;7261:10;:17;7272:5;7261:17;;;;;;;;;;;;;;;;7207:16;:72::i;:::-;7200:79;;7085:210;7311:15;7354:3;7349:2;7329:10;:17;7340:5;7329:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7311:46;;7393:4;;;;;;;;;;;7377:27;;:39;7405:10;7377:39;;;;;;;;;;;;;;;;;;;;;;;7372:142;;7460:4;;;;;;;;;;;7444:31;;:54;7484:4;7476:21;;;7444:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7444:54:0;7437:61;;;7372:142;7528:18;7574:3;7569:2;7549:10;:17;7560:5;7549:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7528:49;;7613:7;;;;;;;;;;;7597:30;;:45;7628:13;7597:45;;;;;;;;;;;;;;;;;;;;;;;7592:151;;7686:7;;;;;;;;;;;7670:34;;:57;7713:4;7705:21;;;7670:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7670:57:0;7663:64;;;;7592:151;7757:20;7780:38;7799:11;7812:5;7780:18;:38::i;:::-;7757:61;;7890:1;7870:10;:17;7881:5;7870:17;;;;;;;;;;;;;;;;:21;;;;;;7833:5;:19;7839:12;7833:19;;;;;;;;;;;;;;;:26;;:33;7860:5;7833:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;7913:73;7930:12;7944:11;7957:5;7984:1;7964:10;:17;7975:5;7964:17;;;;;;;;;;;;;;;;:21;;;;;;7913:16;:73::i;:::-;7906:80;;;;;6764:1234;8008:8;:15;8017:5;8008:15;;;;;;;;;;;;;;;:36;;8050:11;8008:54;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;8008:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8107:15;8073:8;:15;8082:5;8073:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;8164:15;8138:105;;8151:11;8138:105;;;8181:5;8240:1;8194:8;:15;8203:5;8194:15;;;;;;;;;;;;;;;:36;;:43;;;;:47;8138:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8307:1;8260:8;:15;8269:5;8260:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;8256:785;;;8325:20;8348:38;8367:11;8380:5;8348:18;:38::i;:::-;8325:61;;8458:1;8438:10;:17;8449:5;8438:17;;;;;;;;;;;;;;;;:21;;;;;;8401:5;:19;8407:12;8401:19;;;;;;;;;;;;;;;:26;;:33;8428:5;8401:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;8474:73;8491:12;8505:11;8518:5;8545:1;8525:10;:17;8536:5;8525:17;;;;;;;;;;;;;;;;:21;;;;;;8474:16;:73::i;:::-;8562:15;8605:3;8600:2;8580:10;:17;8591:5;8580:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8562:46;;8644:4;;;;;;;;;;;8628:27;;:39;8656:10;8628:39;;;;;;;;;;;;;;;;;;;;;;;8623:142;;8711:4;;;;;;;;;;;8695:31;;:54;8735:4;8727:21;;;8695:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8695:54:0;8688:61;;;;8623:142;8779:22;8804:39;8823:12;8837:5;8804:18;:39::i;:::-;8779:64;;8922:3;8917:2;8897:10;:17;8908:5;8897:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8858:5;:21;8864:14;8858:21;;;;;;;;;;;;;;;:28;;:35;8887:5;8858:35;;;;;;;;;;;;;;;;:67;;;;;;;;;;;8947:82;8964:14;8980:11;8993:5;9025:3;9020:2;9000:10;:17;9011:5;9000:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8947:16;:82::i;:::-;8940:89;;;;;8256:785;9104:1;9057:8;:15;9066:5;9057:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;9053:263;;;9132:8;:15;9141:5;9132:15;;;;;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;9232:1;9218:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;9218:16:0;;;;9180:8;:15;9189:5;9180:15;;;;;;;;;;;;;;;:35;;:54;;;;;;;;;;;;:::i;:::-;;9302:1;9288:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;9288:16:0;;;;9249:8;:15;9258:5;9249:15;;;;;;;;;;;;;;;:36;;:55;;;;;;;;;;;;:::i;:::-;;9053:263;9326:20;9349:38;9368:11;9381:5;9349:18;:38::i;:::-;9326:61;;9455:1;9435:10;:17;9446:5;9435:17;;;;;;;;;;;;;;;;:21;;;;;;9398:5;:19;9404:12;9398:19;;;;;;;;;;;;;;;:26;;:33;9425:5;9398:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;9467:73;9484:12;9498:11;9511:5;9538:1;9518:10;:17;9529:5;9518:17;;;;;;;;;;;;;;;;:21;;;;;;9467:16;:73::i;:::-;9551:15;9594:3;9589:2;9569:10;:17;9580:5;9569:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9551:46;;9629:4;;;;;;;;;;;9613:27;;:39;9641:10;9613:39;;;;;;;;;;;;;;;;;;;;;;;9608:134;;9692:4;;;;;;;;;;;9676:31;;:54;9716:4;9708:21;;;9676:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9676:54:0;9669:61;;;;9608:134;9752:18;9798:3;9793:2;9773:10;:17;9784:5;9773:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9752:49;;9833:7;;;;;;;;;;;9817:30;;:45;9848:13;9817:45;;;;;;;;;;;;;;;;;;;;;;;9812:143;;9902:7;;;;;;;;;;;9886:34;;:57;9929:4;9921:21;;;9886:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9886:57:0;9879:64;;;;;9812:143;6291:3671;;;;;;;:::o;10848:462::-;10956:16;10974:21;10999:42;11015:11;11028:5;11035;10999:15;:42::i;:::-;10955:86;;;;11075:8;11059:31;;:39;11091:6;11059:39;;;;;;;;;;;;;;;;;;;;;;;11054:138;;11138:8;11122:35;;:58;11166:4;11158:21;;;11122:58;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11122:58:0;11115:65;;;;11054:138;11208:16;11204:99;;;11275:8;11246:45;;11268:5;11246:45;;;11285:5;11246:45;;;;;;;;;;;;;;;;;;;;;;11204:99;10848:462;;;;;;;:::o;10316:524::-;10407:7;10416:4;10433:16;10452:11;10433:30;;10474:21;10506:327;10513:4;10506:327;;;10538:5;:15;10544:8;10538:15;;;;;;;;;;;;;;;:23;;:30;10562:5;10538:30;;;;;;;;;;;;;;;;;;;;;;;;;10534:288;;;10621:5;10594:40;;10611:8;10594:40;;;10628:5;10594:40;;;;;;;;;;;;;;;;;;;;;;10672:4;10653:23;;10706:5;:15;10712:8;10706:15;;;;;;;;;;;;;;;:24;;;;;;;;;;;;10695:35;;10534:288;;;10779:8;10789:16;10771:35;;;;;;;;10534:288;10506:327;;;10316:524;;;;;;;;;:::o;60:13349::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://7c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b760
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.