ETH Price: $1,908.59 (+4.50%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw ELS110953542020-10-20 21:02:141953 days ago1603227734IN
0xf0dac6a8...f6aE14C0C
0 ETH0.0030175774
Buy New Level110941752020-10-20 16:49:541953 days ago1603212594IN
0xf0dac6a8...f6aE14C0C
3.2 ETH0.01602966139.15
Buy New Level110941702020-10-20 16:49:181953 days ago1603212558IN
0xf0dac6a8...f6aE14C0C
1.6 ETH0.03075622137.00000145
Buy New Level110941652020-10-20 16:46:521953 days ago1603212412IN
0xf0dac6a8...f6aE14C0C
0.8 ETH0.02535596137.00000145
Buy New Level110941502020-10-20 16:43:021953 days ago1603212182IN
0xf0dac6a8...f6aE14C0C
0.4 ETH0.01439962125
Buy New Level110941222020-10-20 16:38:151953 days ago1603211895IN
0xf0dac6a8...f6aE14C0C
0.2 ETH0.02632601143
Registration Ext110941072020-10-20 16:34:271953 days ago1603211667IN
0xf0dac6a8...f6aE14C0C
0.1 ETH0.03518518135
Registration Ext110925482020-10-20 10:50:021954 days ago1603191002IN
0xf0dac6a8...f6aE14C0C
0.1 ETH0.0065935321.00000145
Buy New Level110922612020-10-20 9:44:581954 days ago1603187098IN
0xf0dac6a8...f6aE14C0C
0.4 ETH0.006718436.3
Buy New Level110922532020-10-20 9:43:221954 days ago1603187002IN
0xf0dac6a8...f6aE14C0C
0.2 ETH0.007525937.8
Registration Ext110922362020-10-20 9:40:241954 days ago1603186824IN
0xf0dac6a8...f6aE14C0C
0.1 ETH0.0110813938.40000175
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.00160335
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.001648836
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.001648836
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.001465632.00000145
Update110921972020-10-20 9:31:111954 days ago1603186271IN
0xf0dac6a8...f6aE14C0C
0 ETH0.001465632.00000145
Update110921772020-10-20 9:26:041954 days ago1603185964IN
0xf0dac6a8...f6aE14C0C
0 ETH0.0013736430
Update110921772020-10-20 9:26:041954 days ago1603185964IN
0xf0dac6a8...f6aE14C0C
0 ETH0.0013736430
Update110921762020-10-20 9:26:011954 days ago1603185961IN
0xf0dac6a8...f6aE14C0C
0 ETH0.0013736430
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-110941752020-10-20 16:49:541953 days ago1603212594
0xf0dac6a8...f6aE14C0C
0.96 ETH
-110941752020-10-20 16:49:541953 days ago1603212594
0xf0dac6a8...f6aE14C0C
0.64 ETH
-110941752020-10-20 16:49:541953 days ago1603212594
0xf0dac6a8...f6aE14C0C
1.6 ETH
-110941702020-10-20 16:49:181953 days ago1603212558
0xf0dac6a8...f6aE14C0C
0.48 ETH
-110941702020-10-20 16:49:181953 days ago1603212558
0xf0dac6a8...f6aE14C0C
0.32 ETH
-110941702020-10-20 16:49:181953 days ago1603212558
0xf0dac6a8...f6aE14C0C
0.8 ETH
-110941652020-10-20 16:46:521953 days ago1603212412
0xf0dac6a8...f6aE14C0C
0.24 ETH
-110941652020-10-20 16:46:521953 days ago1603212412
0xf0dac6a8...f6aE14C0C
0.16 ETH
-110941652020-10-20 16:46:521953 days ago1603212412
0xf0dac6a8...f6aE14C0C
0.4 ETH
-110941502020-10-20 16:43:021953 days ago1603212182
0xf0dac6a8...f6aE14C0C
0.12 ETH
-110941502020-10-20 16:43:021953 days ago1603212182
0xf0dac6a8...f6aE14C0C
0.08 ETH
-110941502020-10-20 16:43:021953 days ago1603212182
0xf0dac6a8...f6aE14C0C
0.2 ETH
-110941222020-10-20 16:38:151953 days ago1603211895
0xf0dac6a8...f6aE14C0C
0.1 ETH
-110941222020-10-20 16:38:151953 days ago1603211895
0xf0dac6a8...f6aE14C0C
0.06 ETH
-110941222020-10-20 16:38:151953 days ago1603211895
0xf0dac6a8...f6aE14C0C
0.04 ETH
-110941072020-10-20 16:34:271953 days ago1603211667
0xf0dac6a8...f6aE14C0C
0.03 ETH
-110941072020-10-20 16:34:271953 days ago1603211667
0xf0dac6a8...f6aE14C0C
0.02 ETH
-110941072020-10-20 16:34:271953 days ago1603211667
0xf0dac6a8...f6aE14C0C
0.05 ETH
-110925482020-10-20 10:50:021954 days ago1603191002
0xf0dac6a8...f6aE14C0C
0.03 ETH
-110925482020-10-20 10:50:021954 days ago1603191002
0xf0dac6a8...f6aE14C0C
0.02 ETH
-110925482020-10-20 10:50:021954 days ago1603191002
0xf0dac6a8...f6aE14C0C
0.05 ETH
-110922612020-10-20 9:44:581954 days ago1603187098
0xf0dac6a8...f6aE14C0C
0.12 ETH
-110922612020-10-20 9:44:581954 days ago1603187098
0xf0dac6a8...f6aE14C0C
0.08 ETH
-110922612020-10-20 9:44:581954 days ago1603187098
0xf0dac6a8...f6aE14C0C
0.2 ETH
-110922532020-10-20 9:43:221954 days ago1603187002
0xf0dac6a8...f6aE14C0C
0.1 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ETPlanV2

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-10-18
*/

pragma solidity >=0.4.23 <0.6.0;

/**
* eplans.vip
**/
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 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

Contract ABI

API
[{"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":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":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"}]

608060405260026000553480156200001657600080fd5b5067016345785d8a000060056000600160ff168152602001908152602001600020819055506000600290505b600c60ff168160ff16116200009c576002600560006001840360ff1660ff1681526020019081526020016000205402600560008360ff1660ff16815260200190815260200160002081905550808060010191505062000042565b5030600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506148a8806200012f6000396000f3fe60806040526004361061019c5760003560e01c80637b3f6926116100ec578063a87430ba1161008a578063ccf19b3111610064578063ccf19b3114610a99578063d845e63014610bae578063ecabdf7914610c24578063faa9f04b14610c765761019c565b8063a87430ba14610952578063bd473410146109f1578063bf3c41f814610a425761019c565b8063876cb217116100c6578063876cb217146107fd57806387d84e9f1461082e5780638da5cb5b146108a4578063910d13e8146108fb5761019c565b80637b3f6926146106895780637b46c54f1461070e5780637ce36ec01461075f5761019c565b8063356ac86e11610159578063509222cd11610133578063509222cd1461053057806358aba00f146105995780637337088d146105ea578063797eee24146106455761019c565b8063356ac86e14610409578063481c6a75146104675780634a6e1870146104be5761019c565b80631411a5411461023357806316f0115b1461028457806329c70400146102db5780632a2d0c471461030c5780632b5ab84a14610387578063348d4487146103de575b60008036905014156101d9576101d433600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610cdb565b610231565b6102303361022b6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611501565b610cdb565b5b005b34801561023f57600080fd5b506102826004803603602081101561025657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b34801561029057600080fd5b506102996117d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102e757600080fd5b506102f06117f7565b604051808260ff1660ff16815260200191505060405180910390f35b34801561031857600080fd5b506103456004803603602081101561032f57600080fd5b81019080803590602001909291905050506117fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039357600080fd5b5061039c61182f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3611855565b6040518082815260200191505060405180910390f35b34801561041557600080fd5b506104656004803603604081101561042c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061185b565b005b34801561047357600080fd5b5061047c611a0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104ca57600080fd5b5061051a600480360360408110156104e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611a32565b6040518082815260200191505060405180910390f35b34801561053c57600080fd5b5061057f6004803603602081101561055357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a96565b604051808215151515815260200191505060405180910390f35b3480156105a557600080fd5b506105e8600480360360208110156105bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ae5565b005b3480156105f657600080fd5b506106436004803603604081101561060d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b83565b005b6106876004803603602081101561065b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cc6565b005b34801561069557600080fd5b506106c5600480360360208110156106ac57600080fd5b81019080803560ff169060200190929190505050611cd3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561071a57600080fd5b5061075d6004803603602081101561073157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d17565b005b34801561076b57600080fd5b506107bb6004803603604081101561078257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61082c6004803603602081101561081357600080fd5b81019080803560ff169060200190929190505050611f68565b005b34801561083a57600080fd5b5061088a6004803603604081101561085157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506126c8565b604051808215151515815260200191505060405180910390f35b3480156108b057600080fd5b506108b9612739565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090757600080fd5b5061091061275f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b506109a16004803603602081101561097557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612785565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b3480156109fd57600080fd5b50610a4060048036036020811015610a1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127cf565b005b348015610a4e57600080fd5b50610a5761286d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa557600080fd5b50610ad560048036036020811015610abc57600080fd5b81019080803560ff169060200190929190505050612893565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610b54578082015181840152602081019050610b39565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610b96578082015181840152602081019050610b7b565b50505050905001965050505050505060405180910390f35b348015610bba57600080fd5b50610c0a60048036036040811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612a4b565b604051808215151515815260200191505060405180910390f35b348015610c3057600080fd5b50610c6060048036036020811015610c4757600080fd5b81019080803560ff169060200190929190505050612abc565b6040518082815260200191505060405180910390f35b348015610c8257600080fd5b50610cd960048036036060811015610c9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ad4565b005b67016345785d8a00003414610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610d6182611a96565b15610dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ddd81611a96565b610e4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610ed1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610ed9614755565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46111c98484600161346b565b6002600360056000600160ff1660ff1681526020019081526020016000205402816111f057fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d60208110156112dc57600080fd5b8101908080519060200190929190505050106114fb57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156113b557600080fd5b505af11580156113c9573d6000803e3d6000fd5b505050506040513d60208110156113df57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161145457fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114be57600080fd5b505af11580156114d2573d6000803e3d6000fd5b505050506040513d60208110156114e857600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156957600080fd5b60008190506000600190505b600c8160ff16116117cc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250608081101561161c57600080fd5b8101908080519060200190929190805164010000000081111561163e57600080fd5b8281019050602081018481111561165457600080fd5b815185602082028301116401000000008211171561167157600080fd5b5050929190602001805164010000000081111561168d57600080fd5b828101905060208101848111156116a357600080fd5b81518560208202830111640100000000821117156116c057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff168152602001908152602001600020600101908051906020019061176892919061478c565b5081600660008760ff1660ff168152602001908152602001600020600201908051906020019061179992919061478c565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611575565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118b557600080fd5b6118be82611a96565b611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bdd57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b8101908080519060200190929190505050505050565b611cd03382610cdb565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d7157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b600115611f615760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff1615611ef757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611f62565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250611db8565b5b92915050565b611f7133611a96565b611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061485a6023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561206e5750600c60ff168160ff1611155b6120e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561229f576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061231d3383611db5565b905061232a33828461346b565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816123bb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b8101908080519060200190929190505050106126c457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050506040513d60208110156125a957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff168152602001908152602001600020548161261d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561268757600080fd5b505af115801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461282957600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156129ad57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612963575b5050505050925081805480602002602001604051908101604052809291908181526020018280548015612a3557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129eb575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b2e57600080fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7957600080fd5b505afa158015612b8d573d6000803e3d6000fd5b505050506040513d6020811015612ba357600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3a57600080fd5b505afa158015612c4e573d6000803e3d6000fd5b505050506040513d6020811015612c6457600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6020811015612d2557600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b158015612dbc57600080fd5b505afa158015612dd0573d6000803e3d6000fd5b505050506040513d6020811015612de657600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001820160008190555060008390505b8281116134645760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612ea157600080fd5b505afa158015612eb5573d6000803e3d6000fd5b505050506040513d6020811015612ecb57600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b158015612f6057600080fd5b505afa158015612f74573d6000803e3d6000fd5b505050506040513d6060811015612f8a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050925092509250612fbd614755565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116133ff576003871415613192576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f2565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561335857600080fd5b505afa15801561336c573d6000803e3d6000fd5b505050506040513d602081101561338257600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b8080600101915050613095565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050508080600101915050612e47565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16613544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161356957fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816135cb57fe5b06106136c857600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff1615801561364f5750600c60ff168160ff1614155b156136c7576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff168152602001908152602001600020600101805490501015613c6d57600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561398557600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613980828483600560008660ff1660ff168152602001908152602001600020546144b6565b6144b1565b600060646014600560008560ff1660ff1681526020019081526020016000205402816139ad57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613a9157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613a8a573d6000803e3d6000fd5b50506144b1565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613ab957fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613b9e57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613b96573d6000803e3d6000fd5b5050506144b1565b6000613baa8685611db5565b90506002600560008660ff1660ff1681526020019081526020016000205481613bcf57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff16815260200190815260200160002060008282540192505081905550613c658187866002600560008a60ff1660ff1681526020019081526020016000205481613c5f57fe5b046144b6565b5050506144b1565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156140b4576000613e178483611db5565b90506002600560008460ff1660ff1681526020019081526020016000205481613e3c57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002060008282540192505081905550613ed28185846002600560008860ff1660ff1681526020019081526020016000205481613ecc57fe5b046144b6565b600060646014600560008660ff1660ff168152602001908152602001600020540281613efa57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613fdf57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613fd7573d6000803e3d6000fd5b5050506144b1565b6000613feb8385611db5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161401357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506140ac8187866064601e600560008b60ff1660ff1681526020019081526020016000205402816140a657fe5b046144b6565b5050506144b1565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156141cb57600660008260ff1660ff1681526020019081526020016000206003016000815480929190600101919050555060006040519080825280602002602001820160405280156141385781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061416892919061478c565b5060006040519080825280602002602001820160405280156141995781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906141c992919061478c565b505b60006141d78483611db5565b90506002600560008460ff1660ff16815260200190815260200160002054816141fc57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142928185846002600560008860ff1660ff168152602001908152602001600020548161428c57fe5b046144b6565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142ba57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061439f57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614397573d6000803e3d6000fd5b5050506144b1565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816143c757fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506144ad57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156144a4573d6000803e3d6000fd5b505050506144b1565b5050505b505050565b6000806144c48686866145e1565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050614566578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561455e573d6000803e3d6000fd5b5050506145db565b80156145d8578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b60011561474a57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614738578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614745565b818193509350505061474d565b6145ec565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614805579160200282015b828111156148045782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906147ac565b5b5090506148129190614816565b5090565b61485691905b8082111561485257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161481c565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a7230582050792bbacd464af1629ff7afeeb78668579315d01bad71ef5d1147e7c1b4b5a60029

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80637b3f6926116100ec578063a87430ba1161008a578063ccf19b3111610064578063ccf19b3114610a99578063d845e63014610bae578063ecabdf7914610c24578063faa9f04b14610c765761019c565b8063a87430ba14610952578063bd473410146109f1578063bf3c41f814610a425761019c565b8063876cb217116100c6578063876cb217146107fd57806387d84e9f1461082e5780638da5cb5b146108a4578063910d13e8146108fb5761019c565b80637b3f6926146106895780637b46c54f1461070e5780637ce36ec01461075f5761019c565b8063356ac86e11610159578063509222cd11610133578063509222cd1461053057806358aba00f146105995780637337088d146105ea578063797eee24146106455761019c565b8063356ac86e14610409578063481c6a75146104675780634a6e1870146104be5761019c565b80631411a5411461023357806316f0115b1461028457806329c70400146102db5780632a2d0c471461030c5780632b5ab84a14610387578063348d4487146103de575b60008036905014156101d9576101d433600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610cdb565b610231565b6102303361022b6000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611501565b610cdb565b5b005b34801561023f57600080fd5b506102826004803603602081101561025657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061150f565b005b34801561029057600080fd5b506102996117d1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102e757600080fd5b506102f06117f7565b604051808260ff1660ff16815260200191505060405180910390f35b34801561031857600080fd5b506103456004803603602081101561032f57600080fd5b81019080803590602001909291905050506117fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039357600080fd5b5061039c61182f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3611855565b6040518082815260200191505060405180910390f35b34801561041557600080fd5b506104656004803603604081101561042c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061185b565b005b34801561047357600080fd5b5061047c611a0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104ca57600080fd5b5061051a600480360360408110156104e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611a32565b6040518082815260200191505060405180910390f35b34801561053c57600080fd5b5061057f6004803603602081101561055357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a96565b604051808215151515815260200191505060405180910390f35b3480156105a557600080fd5b506105e8600480360360208110156105bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ae5565b005b3480156105f657600080fd5b506106436004803603604081101561060d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b83565b005b6106876004803603602081101561065b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cc6565b005b34801561069557600080fd5b506106c5600480360360208110156106ac57600080fd5b81019080803560ff169060200190929190505050611cd3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561071a57600080fd5b5061075d6004803603602081101561073157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d17565b005b34801561076b57600080fd5b506107bb6004803603604081101561078257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61082c6004803603602081101561081357600080fd5b81019080803560ff169060200190929190505050611f68565b005b34801561083a57600080fd5b5061088a6004803603604081101561085157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506126c8565b604051808215151515815260200191505060405180910390f35b3480156108b057600080fd5b506108b9612739565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090757600080fd5b5061091061275f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b506109a16004803603602081101561097557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612785565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b3480156109fd57600080fd5b50610a4060048036036020811015610a1457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127cf565b005b348015610a4e57600080fd5b50610a5761286d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610aa557600080fd5b50610ad560048036036020811015610abc57600080fd5b81019080803560ff169060200190929190505050612893565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610b54578082015181840152602081019050610b39565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610b96578082015181840152602081019050610b7b565b50505050905001965050505050505060405180910390f35b348015610bba57600080fd5b50610c0a60048036036040811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612a4b565b604051808215151515815260200191505060405180910390f35b348015610c3057600080fd5b50610c6060048036036020811015610c4757600080fd5b81019080803560ff169060200190929190505050612abc565b6040518082815260200191505060405180910390f35b348015610c8257600080fd5b50610cd960048036036060811015610c9957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ad4565b005b67016345785d8a00003414610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610d6182611a96565b15610dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ddd81611a96565b610e4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610ed1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610ed9614755565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46111c98484600161346b565b6002600360056000600160ff1660ff1681526020019081526020016000205402816111f057fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d60208110156112dc57600080fd5b8101908080519060200190929190505050106114fb57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156113b557600080fd5b505af11580156113c9573d6000803e3d6000fd5b505050506040513d60208110156113df57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161145457fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114be57600080fd5b505af11580156114d2573d6000803e3d6000fd5b505050506040513d60208110156114e857600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461156957600080fd5b60008190506000600190505b600c8160ff16116117cc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250608081101561161c57600080fd5b8101908080519060200190929190805164010000000081111561163e57600080fd5b8281019050602081018481111561165457600080fd5b815185602082028301116401000000008211171561167157600080fd5b5050929190602001805164010000000081111561168d57600080fd5b828101905060208101848111156116a357600080fd5b81518560208202830111640100000000821117156116c057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff168152602001908152602001600020600101908051906020019061176892919061478c565b5081600660008760ff1660ff168152602001908152602001600020600201908051906020019061179992919061478c565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611575565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118b557600080fd5b6118be82611a96565b611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bdd57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d6020811015611cb057600080fd5b8101908080519060200190929190505050505050565b611cd03382610cdb565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d7157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b600115611f615760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff1615611ef757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611f62565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250611db8565b5b92915050565b611f7133611a96565b611fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061485a6023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561206e5750600c60ff168160ff1611155b6120e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561229f576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061231d3383611db5565b905061232a33828461346b565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816123bb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b8101908080519060200190929190505050106126c457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050506040513d60208110156125a957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff168152602001908152602001600020548161261d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561268757600080fd5b505af115801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461282957600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156129ad57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612963575b5050505050925081805480602002602001604051908101604052809291908181526020018280548015612a3557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129eb575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b2e57600080fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7957600080fd5b505afa158015612b8d573d6000803e3d6000fd5b505050506040513d6020811015612ba357600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b158015612c3a57600080fd5b505afa158015612c4e573d6000803e3d6000fd5b505050506040513d6020811015612c6457600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6020811015612d2557600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b158015612dbc57600080fd5b505afa158015612dd0573d6000803e3d6000fd5b505050506040513d6020811015612de657600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001820160008190555060008390505b8281116134645760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612ea157600080fd5b505afa158015612eb5573d6000803e3d6000fd5b505050506040513d6020811015612ecb57600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b158015612f6057600080fd5b505afa158015612f74573d6000803e3d6000fd5b505050506040513d6060811015612f8a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050925092509250612fbd614755565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116133ff576003871415613192576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506133f2565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561335857600080fd5b505afa15801561336c573d6000803e3d6000fd5b505050506040513d602081101561338257600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b8080600101915050613095565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050508080600101915050612e47565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16613544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161356957fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816135cb57fe5b06106136c857600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff1615801561364f5750600c60ff168160ff1614155b156136c7576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff168152602001908152602001600020600101805490501015613c6d57600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561398557600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613980828483600560008660ff1660ff168152602001908152602001600020546144b6565b6144b1565b600060646014600560008560ff1660ff1681526020019081526020016000205402816139ad57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613a9157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613a8a573d6000803e3d6000fd5b50506144b1565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613ab957fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613b9e57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613b96573d6000803e3d6000fd5b5050506144b1565b6000613baa8685611db5565b90506002600560008660ff1660ff1681526020019081526020016000205481613bcf57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff16815260200190815260200160002060008282540192505081905550613c658187866002600560008a60ff1660ff1681526020019081526020016000205481613c5f57fe5b046144b6565b5050506144b1565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156140b4576000613e178483611db5565b90506002600560008460ff1660ff1681526020019081526020016000205481613e3c57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002060008282540192505081905550613ed28185846002600560008860ff1660ff1681526020019081526020016000205481613ecc57fe5b046144b6565b600060646014600560008660ff1660ff168152602001908152602001600020540281613efa57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613fdf57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613fd7573d6000803e3d6000fd5b5050506144b1565b6000613feb8385611db5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161401357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506140ac8187866064601e600560008b60ff1660ff1681526020019081526020016000205402816140a657fe5b046144b6565b5050506144b1565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156141cb57600660008260ff1660ff1681526020019081526020016000206003016000815480929190600101919050555060006040519080825280602002602001820160405280156141385781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061416892919061478c565b5060006040519080825280602002602001820160405280156141995781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906141c992919061478c565b505b60006141d78483611db5565b90506002600560008460ff1660ff16815260200190815260200160002054816141fc57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142928185846002600560008860ff1660ff168152602001908152602001600020548161428c57fe5b046144b6565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142ba57fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061439f57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614397573d6000803e3d6000fd5b5050506144b1565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816143c757fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506144ad57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156144a4573d6000803e3d6000fd5b505050506144b1565b5050505b505050565b6000806144c48686866145e1565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050614566578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561455e573d6000803e3d6000fd5b5050506145db565b80156145d8578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b60011561474a57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614738578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614745565b818193509350505061474d565b6145ec565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614805579160200282015b828111156148045782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906147ac565b5b5090506148129190614816565b5090565b61485691905b8082111561485257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161481c565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a7230582050792bbacd464af1629ff7afeeb78668579315d01bad71ef5d1147e7c1b4b5a60029

Deployed Bytecode Sourcemap

60:12889:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3713:1;3694:8;;:15;;:20;3690:91;;;3738:31;3751:10;3763:5;;;;;;;;;;;3738:12;:31::i;:::-;3731:38;;3690:91;3793:50;3806:10;3818:24;3833:8;;3818: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;;3818:24:0;;;;;;:14;:24::i;:::-;3793:12;:50::i;:::-;3651:200;60:12889;1743:616;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1743:616:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1743:616: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;:::-;;;;;;;;;;;;;;;;;;;12592:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12592:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12592:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;622:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;622:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11868:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11868:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11868:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11306:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11306:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11306:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12394:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12394:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12394:95:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;12813:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12813:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12813:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3859:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3859: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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12303:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12303:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12303:83:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;9958:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9958:338:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9958:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5272:999;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5272:999:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11590:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11590:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11590: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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12497:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12497:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12497:87:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;651:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;651:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11998:297;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11998:297:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11998: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;11998: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;11998:297:0;;;;;;;;;;;;;;;;;;;;;11736:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11736:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11736: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;:::-;;;;;;;;;;;;;;;;;;;2367:1276;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2367:1276:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2367:1276:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3994:1270;4102:9;4089;:22;4081:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4157:25;4170:11;4157:12;:25::i;:::-;4156:26;4148:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4217:29;4230:15;4217:12;:29::i;:::-;4209:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4283:11;4349;4337:24;4329:32;;4398:1;4390:4;:9;;;4382:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4437:16;;:::i;:::-;4456:124;;;;;;;;4481:10;;4456:124;;;;4517:15;4456:124;;;;;;4563:1;4456:124;;;4437:143;;4614:4;4593:5;:18;4599:11;4593:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4655:11;4629;:23;4641:10;;4629:23;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4718:4;4679:5;:18;4685:11;4679:18;;;;;;;;;;;;;;;:33;;:36;4713:1;4679:36;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;4735:10;;:12;;;;;;;;;;;;;4760:5;:22;4766:15;4760:22;;;;;;;;;;;;;;;:36;;;:38;;;;;;;;;;;;;4859:5;:18;4865:11;4859:18;;;;;;;;;;;;;;;:21;;;4842:15;4816:92;;4829:11;4816:92;;;4882:5;:22;4888:15;4882:22;;;;;;;;;;;;;;;:25;;;4816:92;;;;;;;;;;;;;;;;;;4921:56;4938:11;4951:15;4974:1;4921:16;:56::i;:::-;5065:1;5061;5038:10;:20;5055:1;5038:20;;;;;;;;;;;;;;;;:24;:28;;;;;;5004:11;;;;;;;;;;;4992:34;;;5027:5;;;;;;;;;;;4992:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4992:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4992:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4992:41:0;;;;;;;;;;;;;;;;:75;4988:267;;5096:11;;;;;;;;;;;5084:33;;;5118:11;5131:10;:20;5148:1;5131:20;;;;;;;;;;;;;;;;5084:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5084:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5084:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5084:68:0;;;;;;;;;;;;;;;;;5179:11;;;;;;;;;;;5167:33;;;5201:15;5241:1;5218:10;:20;5235:1;5218:20;;;;;;;;;;;;;;;;:24;;;;;;5167:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5167:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5167:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5167:76:0;;;;;;;;;;;;;;;;;4988:267;3994:1270;;;;:::o;11424:158::-;11488:12;11560:2;11555:3;11551:12;11545:19;11537:27;;11522:53;;;:::o;1743:616::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;1806:13;1845:7;1806:49;;1871:7;1881:1;1871:11;;1866:486;1889:2;1884:1;:7;;;1866:486;;1914:23;1939:36;1991:37;2043:18;2065:6;:18;;;2084:1;2065:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2065:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2065:21:0;;;;;;39:16:-1;36:1;17:17;2:54;2065: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;2065: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;;2065: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;;2065:21:0;;;;;;;;;;;;;;;;;1913:173;;;;;;;;2131:15;2101:8;:11;2110:1;2101:11;;;;;;;;;;;;;;;:27;;;:45;;;;;;;;;;;;;;;;;;2195:19;2161:8;:11;2170:1;2161:11;;;;;;;;;;;;;;;:31;;:53;;;;;;;;;;;;:::i;:::-;;2264:20;2229:8;:11;2238:1;2229:11;;;;;;;;;;;;;;;:32;;:55;;;;;;;;;;;;:::i;:::-;;2327:13;2299:8;:11;2308:1;2299:11;;;;;;;;;;;;;;;:25;;:41;;;;1866:486;;;;1893:3;;;;;;;1866:486;;;;1478:1;1743:616;:::o;596:19::-;;;;;;;;;;;;;:::o;490:37::-;525:2;490:37;:::o;820:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;1380:20::-;;;;;;;;;;;;;:::o;536:26::-;;;;:::o;12592:213::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12673:19;12686:5;12673:12;:19::i;:::-;12665:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12762:5;:12;12768:5;12762:12;;;;;;;;;;;;;;;:27;;:35;12790:6;12762:35;;;;;;;;;;;;;;;;;;;;;;;;;12761:36;12723:5;:12;12729:5;12723:12;;;;;;;;;;;;;;;:27;;:35;12751:6;12723:35;;;;;;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;12592:213;;:::o;622:22::-;;;;;;;;;;;;;:::o;11868:122::-;11933:4;11956:5;:12;11962:5;11956:12;;;;;;;;;;;;;;;:19;;:26;11976:5;11956:26;;;;;;;;;;;;;;;;11949:33;;11868:122;;;;:::o;11306:110::-;11363:4;11406:1;11388:5;:11;11394:4;11388:11;;;;;;;;;;;;;;;:14;;;:19;;11380:28;;11306:110;;;:::o;12394:95::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12473:8;12463:7;;:18;;;;;;;;;;;;;;;;;;12394:95;:::o;12813:133::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12902:11;;;;;;;;;;;12890:33;;;12924:5;12931:6;12890:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12890:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12890:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12890:48:0;;;;;;;;;;;;;;;;;12813:133;;:::o;3859:127::-;3937:41;3950:10;3962:15;3937:12;:41::i;:::-;3859:127;:::o;733:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12303:83::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12373:5;12366:4;;:12;;;;;;;;;;;;;;;;;;12303:83;:::o;9958:338::-;10041:7;10061:228;10068:4;10061:228;;;10093:5;:34;10099:5;:18;10105:11;10099:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10093:34;;;;;;;;;;;;;;;:49;;:56;10143:5;10093:56;;;;;;;;;;;;;;;;;;;;;;;;;10089:131;;;10177:5;:18;10183:11;10177:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10170:34;;;;10089:131;10250:5;:18;10256:11;10250:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10236:41;;10061:228;;;9958:338;;;;;:::o;5272:999::-;5342:24;5355:10;5342:12;:24::i;:::-;5334:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5438:10;:17;5449:5;5438:17;;;;;;;;;;;;;;;;5425:9;:30;5417:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5500:1;5492:5;:9;;;:32;;;;;525:2;5505:19;;:5;:19;;;;5492:32;5484:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5562:5;:17;5568:10;5562:17;;;;;;;;;;;;;;;:32;;:39;5595:5;5562:39;;;;;;;;;;;;;;;;;;;;;;;;;5561:40;5553:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5646:5;:17;5652:10;5646:17;;;;;;;;;;;;;;;:25;;:36;5680:1;5672:5;:9;5646:36;;;;;;;;;;;;;;;;;;;;;;;;;5642:113;;;5738:5;5699;:17;5705:10;5699:17;;;;;;;;;;;;;;;:25;;:36;5733:1;5725:5;:9;5699:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;5642:113;5807:4;5765:5;:17;5771:10;5765:17;;;;;;;;;;;;;;;:32;;:39;5798:5;5765:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5822:20;5845:37;5864:10;5876:5;5845:18;:37::i;:::-;5822:60;;5893:49;5910:10;5922:12;5936:5;5893:16;:49::i;:::-;5979:12;5958:41;;5967:10;5958:41;;;5993:5;5958:41;;;;;;;;;;;;;;;;;;;;;;6084:1;6080;6060:10;:17;6071:5;6060:17;;;;;;;;;;;;;;;;:21;:25;;;;;;6026:11;;;;;;;;;;;6014:34;;;6049:5;;;;;;;;;;;6014:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6014:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6014:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6014:41:0;;;;;;;;;;;;;;;;:72;6010:254;;6115:11;;;;;;;;;;;6103:33;;;6137:10;6149;:17;6160:5;6149:17;;;;;;;;;;;;;;;;6103:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6103:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6103:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6103:64:0;;;;;;;;;;;;;;;;;6194:11;;;;;;;;;;;6182:33;;;6216:12;6250:1;6230:10;:17;6241:5;6230:17;;;;;;;;;;;;;;;;:21;;;;;;6182:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6182:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6182:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6182:70:0;;;;;;;;;;;;;;;;;6010:254;5272:999;;:::o;11590:138::-;11663:4;11686:5;:12;11692:5;11686:12;;;;;;;;;;;;;;;:27;;:34;11714:5;11686:34;;;;;;;;;;;;;;;;;;;;;;;;;11679:41;;11590:138;;;;:::o;569:20::-;;;;;;;;;;;;;:::o;1351:::-;;;;;;;;;;;;;:::o;776:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12497:87::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12570:6;12562:5;;:14;;;;;;;;;;;;;;;;;;12497:87;:::o;651:26::-;;;;;;;;;;;;;:::o;11998:297::-;12053:7;12062:16;12080;12098:4;12122:8;:15;12131:5;12122:15;;;;;;;;;;;;;;;:31;;;;;;;;;;;;12164:8;:15;12173:5;12164:15;;;;;;;;;;;;;;;:35;;12210:8;:15;12219:5;12210:15;;;;;;;;;;;;;;;:36;;12257:8;:15;12266:5;12257:15;;;;;;;;;;;;;;;:29;;;12114:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11998:297;;;;;:::o;11736:124::-;11802:4;11825:5;:12;11831:5;11825:12;;;;;;;;;;;;;;;:20;;:27;11846:5;11825:27;;;;;;;;;;;;;;;;;;;;;;;;;11818:34;;11736:124;;;;:::o;686:40::-;;;;;;;;;;;;;;;;;:::o;2367:1276::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;2456:13;2495:7;2456:49;;2524:6;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2524:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2524:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2524:14:0;;;;;;;;;;;;;;;;2516:5;;:22;;;;;;;;;;;;;;;;;;2559:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2559:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2559:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2559:16:0;;;;;;;;;;;;;;;;2549:7;;:26;;;;;;;;;;;;;;;;;;2593:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2593:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2593:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2593:13:0;;;;;;;;;;;;;;;;2586:4;;:20;;;;;;;;;;;;;;;;;;2631:6;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2631:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2631:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2631:20:0;;;;;;;;;;;;;;;;2617:11;;:34;;;;;;;;;;;;;;;;;;2681:1;2675:3;:7;2662:10;:20;;;;2700:6;2709:5;2700:14;;2695:941;2721:3;2716:1;:8;2695:941;;2746:19;2768:6;:18;;;2787:1;2768:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2768:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2768:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2768:21:0;;;;;;;;;;;;;;;;2746:43;;2805:7;2813:16;2830:18;2852:6;:12;;;2865:11;2852:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2852:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2852:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2852:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2804:73;;;;;;2892:16;;:::i;:::-;2911:137;;;;;;;;2940:2;2911:137;;;;2972:8;2911:137;;;;;;3015:13;2911:137;;;2892:156;;3084:4;3063:5;:18;3069:11;3063:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3110:7;3120:1;3110:11;;3105:475;3128:2;3123:1;:7;;;3105:475;;3165:1;3160;:6;3156:409;;;3223:4;3191:5;:18;3197:11;3191:18;;;;;;;;;;;;;;;:26;;:29;3218:1;3191:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;3289:5;3250;:18;3256:11;3250:18;;;;;;;;;;;;;;;:33;;:36;3284:1;3250:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;3156:409;;;3343:11;3357:6;:21;;;3379:11;3392:1;3357:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3357:37:0;;;;;;;;;;;;;;;;3343:51;;3456:6;3417:5;:18;3423:11;3417:18;;;;;;;;;;;;;;;:33;;:36;3451:1;3417:36;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;3516:6;:13;;;3530:11;3543:1;3516:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3516:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3516:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3516:29:0;;;;;;;;;;;;;;;;3485:5;:18;3491:11;3485:18;;;;;;;;;;;;;;;:25;;:28;3511:1;3485:28;;;;;;;;;;;;;;;:60;;;;3156:409;;3132:3;;;;;;;3105:475;;;;3613:11;3596;:14;3608:1;3596:14;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2695:941;;;;;2726:3;;;;;;;2695:941;;;;1478:1;2367:1276;;;:::o;6279:3671::-;6391:5;:22;6397:15;6391:22;;;;;;;;;;;;;;;:37;;:44;6429:5;6391:44;;;;;;;;;;;;;;;;;;;;;;;;;6383:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6556:1;6549;6529:10;:17;6540:5;6529:17;;;;;;;;;;;;;;;;:21;;;;;;6489:5;:22;6495:15;6489:22;;;;;;;;;;;;;;;:29;;:36;6519:5;6489:36;;;;;;;;;;;;;;;;:62;;;;;;6488:69;6484:258;;6579:5;:22;6585:15;6579:22;;;;;;;;;;;;;;;:37;;:48;6625:1;6617:5;:9;6579:48;;;;;;;;;;;;;;;;;;;;;;;;;6578:49;:72;;;;;525:2;6631:19;;:5;:19;;;;6578:72;6574:157;;;6711:4;6671:5;:22;6677:15;6671:22;;;;;;;;;;;;;;;:30;;:37;6702:5;6671:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;6574:157;6484:258;6801:1;6756:8;:15;6765:5;6756:15;;;;;;;;;;;;;;;:35;;:42;;;;:46;6752:1234;;;6819:8;:15;6828:5;6819:15;;;;;;;;;;;;;;;:35;;6860:11;6819:53;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6819:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6918:15;6892:100;;6905:11;6892:100;;;6935:5;6948:8;:15;6957:5;6948:15;;;;;;;;;;;;;;;:35;;:42;;;;6892:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7043:15;7009:8;:15;7018:5;7009:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;7096:5;;;;;;;;;;;7077:24;;:15;:24;;;7073:210;;;7152:10;:17;7163:5;7152:17;;;;;;;;;;;;;;;;7122:5;:12;7128:5;;;;;;;;;;;7122:12;;;;;;;;;;;;;;;:19;;:26;7142:5;7122:26;;;;;;;;;;;;;;;;:47;;;;;;;;;;;7195:72;7212:15;7229:11;7242:5;7249:10;:17;7260:5;7249:17;;;;;;;;;;;;;;;;7195:16;:72::i;:::-;7188:79;;7073:210;7299:15;7342:3;7337:2;7317:10;:17;7328:5;7317:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7299:46;;7381:4;;;;;;;;;;;7365:27;;:39;7393:10;7365:39;;;;;;;;;;;;;;;;;;;;;;;7360:142;;7448:4;;;;;;;;;;;7432:31;;:54;7472:4;7464:21;;;7432:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7432:54:0;7425:61;;;7360:142;7516:18;7562:3;7557:2;7537:10;:17;7548:5;7537:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7516:49;;7601:7;;;;;;;;;;;7585:30;;:45;7616:13;7585:45;;;;;;;;;;;;;;;;;;;;;;;7580:151;;7674:7;;;;;;;;;;;7658:34;;:57;7701:4;7693:21;;;7658:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7658:57:0;7651:64;;;;7580:151;7745:20;7768:38;7787:11;7800:5;7768:18;:38::i;:::-;7745:61;;7878:1;7858:10;:17;7869:5;7858:17;;;;;;;;;;;;;;;;:21;;;;;;7821:5;:19;7827:12;7821:19;;;;;;;;;;;;;;;:26;;:33;7848:5;7821:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;7901:73;7918:12;7932:11;7945:5;7972:1;7952:10;:17;7963:5;7952:17;;;;;;;;;;;;;;;;:21;;;;;;7901:16;:73::i;:::-;7894:80;;;;;6752:1234;7996:8;:15;8005:5;7996:15;;;;;;;;;;;;;;;:36;;8038:11;7996:54;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;7996:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8095:15;8061:8;:15;8070:5;8061:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;8152:15;8126:105;;8139:11;8126:105;;;8169:5;8228:1;8182:8;:15;8191:5;8182:15;;;;;;;;;;;;;;;:36;;:43;;;;:47;8126:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8295:1;8248:8;:15;8257:5;8248:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;8244:785;;;8313:20;8336:38;8355:11;8368:5;8336:18;:38::i;:::-;8313:61;;8446:1;8426:10;:17;8437:5;8426:17;;;;;;;;;;;;;;;;:21;;;;;;8389:5;:19;8395:12;8389:19;;;;;;;;;;;;;;;:26;;:33;8416:5;8389:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;8462:73;8479:12;8493:11;8506:5;8533:1;8513:10;:17;8524:5;8513:17;;;;;;;;;;;;;;;;:21;;;;;;8462:16;:73::i;:::-;8550:15;8593:3;8588:2;8568:10;:17;8579:5;8568:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8550:46;;8632:4;;;;;;;;;;;8616:27;;:39;8644:10;8616:39;;;;;;;;;;;;;;;;;;;;;;;8611:142;;8699:4;;;;;;;;;;;8683:31;;:54;8723:4;8715:21;;;8683:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8683:54:0;8676:61;;;;8611:142;8767:22;8792:39;8811:12;8825:5;8792:18;:39::i;:::-;8767:64;;8910:3;8905:2;8885:10;:17;8896:5;8885:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8846:5;:21;8852:14;8846:21;;;;;;;;;;;;;;;:28;;:35;8875:5;8846:35;;;;;;;;;;;;;;;;:67;;;;;;;;;;;8935:82;8952:14;8968:11;8981:5;9013:3;9008:2;8988:10;:17;8999:5;8988:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8935:16;:82::i;:::-;8928:89;;;;;8244:785;9092:1;9045:8;:15;9054:5;9045:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;9041:263;;;9120:8;:15;9129:5;9120:15;;;;;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;9220:1;9206: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;9206:16:0;;;;9168:8;:15;9177:5;9168:15;;;;;;;;;;;;;;;:35;;:54;;;;;;;;;;;;:::i;:::-;;9290:1;9276: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;9276:16:0;;;;9237:8;:15;9246:5;9237:15;;;;;;;;;;;;;;;:36;;:55;;;;;;;;;;;;:::i;:::-;;9041:263;9314:20;9337:38;9356:11;9369:5;9337:18;:38::i;:::-;9314:61;;9443:1;9423:10;:17;9434:5;9423:17;;;;;;;;;;;;;;;;:21;;;;;;9386:5;:19;9392:12;9386:19;;;;;;;;;;;;;;;:26;;:33;9413:5;9386:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;9455:73;9472:12;9486:11;9499:5;9526:1;9506:10;:17;9517:5;9506:17;;;;;;;;;;;;;;;;:21;;;;;;9455:16;:73::i;:::-;9539:15;9582:3;9577:2;9557:10;:17;9568:5;9557:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9539:46;;9617:4;;;;;;;;;;;9601:27;;:39;9629:10;9601:39;;;;;;;;;;;;;;;;;;;;;;;9596:134;;9680:4;;;;;;;;;;;9664:31;;:54;9704:4;9696:21;;;9664:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9664:54:0;9657:61;;;;9596:134;9740:18;9786:3;9781:2;9761:10;:17;9772:5;9761:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9740:49;;9821:7;;;;;;;;;;;9805:30;;:45;9836:13;9805:45;;;;;;;;;;;;;;;;;;;;;;;9800:143;;9890:7;;;;;;;;;;;9874:34;;:57;9917:4;9909:21;;;9874:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9874:57:0;9867:64;;;;;9800:143;6279:3671;;;;;;;:::o;10836:462::-;10944:16;10962:21;10987:42;11003:11;11016:5;11023;10987:15;:42::i;:::-;10943:86;;;;11063:8;11047:31;;:39;11079:6;11047:39;;;;;;;;;;;;;;;;;;;;;;;11042:138;;11126:8;11110:35;;:58;11154:4;11146:21;;;11110:58;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11110:58:0;11103:65;;;;11042:138;11196:16;11192:99;;;11263:8;11234:45;;11256:5;11234:45;;;11273:5;11234:45;;;;;;;;;;;;;;;;;;;;;;11192:99;10836:462;;;;;;;:::o;10304:524::-;10395:7;10404:4;10421:16;10440:11;10421:30;;10462:21;10494:327;10501:4;10494:327;;;10526:5;:15;10532:8;10526:15;;;;;;;;;;;;;;;:23;;:30;10550:5;10526:30;;;;;;;;;;;;;;;;;;;;;;;;;10522:288;;;10609:5;10582:40;;10599:8;10582:40;;;10616:5;10582:40;;;;;;;;;;;;;;;;;;;;;;10660:4;10641:23;;10694:5;:15;10700:8;10694:15;;;;;;;;;;;;;;;:24;;;;;;;;;;;;10683:35;;10522:288;;;10767:8;10777:16;10759:35;;;;;;;;10522:288;10494:327;;;10304:524;;;;;;;;;:::o;60:12889::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://50792bbacd464af1629ff7afeeb78668579315d01bad71ef5d1147e7c1b4b5a6

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.