ETH Price: $3,279.49 (-1.12%)

Token

Nugs Token (NUGS)
 

Overview

Max Total Supply

96,072,632.426308598282643182 NUGS

Holders

447

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
27,393.750774642929115694 NUGS

Value
$0.00
0x92763204e3593b3bB07aa725a957f2B64F8d4F60
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NugsToken

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-09
*/

// File: contracts/commons/Ownable.sol

pragma solidity =0.5.10;

contract Ownable {
    address public owner;

    event TransferOwnership(address _from, address _to);

    constructor() public {
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "only owner");
        _;
    }

    function setOwner(address _owner) external onlyOwner {
        emit TransferOwnership(owner, _owner);
        owner = _owner;
    }
}

// File: contracts/commons/StorageUnit.sol

pragma solidity =0.5.10;

contract StorageUnit {
    address private owner;
    mapping(bytes32 => bytes32) private store;

    constructor() public {
        owner = msg.sender;
    }

    function write(bytes32 _key, bytes32 _value) external {
        /* solium-disable-next-line */
        require(msg.sender == owner);
        store[_key] = _value;
    }

    function read(bytes32 _key) external view returns (bytes32) {
        return store[_key];
    }
}

// File: contracts/utils/IsContract.sol

pragma solidity ^0.5.10;


library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/utils/DistributedStorage.sol

pragma solidity ^0.5.10;



library DistributedStorage {
    function contractSlot(bytes32 _struct) private view returns (address) {
        return address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        byte(0xff),
                        address(this),
                        _struct,
                        keccak256(type(StorageUnit).creationCode)
                    )
                )
            )
        );
    }

    function deploy(bytes32 _struct) private {
        bytes memory slotcode = type(StorageUnit).creationCode;
        /* solium-disable-next-line */
        assembly{ pop(create2(0, add(slotcode, 0x20), mload(slotcode), _struct)) }
    }

    function write(
        bytes32 _struct,
        bytes32 _key,
        bytes32 _value
    ) internal {
        StorageUnit store = StorageUnit(contractSlot(_struct));
        if (!IsContract.isContract(address(store))) {
            deploy(_struct);
        }

        /* solium-disable-next-line */
        (bool success, ) = address(store).call(
            abi.encodeWithSelector(
                store.write.selector,
                _key,
                _value
            )
        );

        require(success, "error writing storage");
    }

    function read(
        bytes32 _struct,
        bytes32 _key
    ) internal view returns (bytes32) {
        StorageUnit store = StorageUnit(contractSlot(_struct));
        if (!IsContract.isContract(address(store))) {
            return bytes32(0);
        }

        /* solium-disable-next-line */
        (bool success, bytes memory data) = address(store).staticcall(
            abi.encodeWithSelector(
                store.read.selector,
                _key
            )
        );

        require(success, "error reading storage");
        return abi.decode(data, (bytes32));
    }
}

// File: contracts/utils/SafeMath.sol

pragma solidity ^0.5.10;


library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "Add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "Sub underflow");
        return x - y;
    }

    function mult(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "Mult overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        uint256 r = x / y;
        if (x % y != 0) {
            r = r + 1;
        }

        return r;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/utils/Math.sol

pragma solidity ^0.5.10;


library Math {
    function orderOfMagnitude(uint256 input) internal pure returns (uint256){
        uint256 counter = uint(-1);
        uint256 temp = input;

        do {
            temp /= 10;
            counter++;
        } while (temp != 0);

        return counter;
    }

    function min(uint256 _a, uint256 _b) internal pure returns (uint256) {
        if (_a < _b) {
            return _a;
        } else {
            return _b;
        }
    }

    function max(uint256 _a, uint256 _b) internal pure returns (uint256) {
        if (_a > _b) {
            return _a;
        } else {
            return _b;
        }
    }
}

// File: contracts/utils/GasPump.sol

pragma solidity ^0.5.10;


contract GasPump {
    bytes32 private stub;

    modifier requestGas(uint256 _factor) {
        if (tx.gasprice == 0 || gasleft() > block.gaslimit) {
            uint256 startgas = gasleft();
            _;
            uint256 delta = startgas - gasleft();
            uint256 target = (delta * _factor) / 100;
            startgas = gasleft();
            while (startgas - gasleft() < target) {
                // Burn gas
                stub = keccak256(abi.encodePacked(stub));
            }
        } else {
            _;
        }
    }
}

// File: contracts/interfaces/IERC20.sol

pragma solidity =0.5.10;


interface IERC20 {
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function transfer(address _to, uint _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function balanceOf(address _owner) external view returns (uint256 balance);
}

// File: contracts/commons/AddressMinHeap.sol

pragma solidity =0.5.10;

/*
    @author Agustin Aguilar <[email protected]>
*/


library AddressMinHeap {
    using AddressMinHeap for AddressMinHeap.Heap;

    struct Heap {
        uint256[] entries;
        mapping(address => uint256) index;
    }

    function initialize(Heap storage _heap) internal {
        require(_heap.entries.length == 0, "already initialized");
        _heap.entries.push(0);
    }

    function encode(address _addr, uint256 _value) internal pure returns (uint256 _entry) {
        /* solium-disable-next-line */
        assembly {
            _entry := not(or(and(0xffffffffffffffffffffffffffffffffffffffff, _addr), shl(160, _value)))
        }
    }

    function decode(uint256 _entry) internal pure returns (address _addr, uint256 _value) {
        /* solium-disable-next-line */
        assembly {
            let entryAsm := not(_entry)
            _addr := and(entryAsm, 0xffffffffffffffffffffffffffffffffffffffff)
            _value := shr(160, entryAsm)
        }
    }

    function decodeAddress(uint256 _entry) internal pure returns (address _addr) {
        /* solium-disable-next-line */
        assembly {
            _addr := and(not(_entry), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }

    function top(Heap storage _heap) internal view returns(address, uint256) {
        if (_heap.entries.length < 2) {
            return (address(0), 0);
        }

        return decode(_heap.entries[1]);
    }

    function has(Heap storage _heap, address _addr) internal view returns (bool) {
        return _heap.index[_addr] != 0;
    }

    function size(Heap storage _heap) internal view returns (uint256) {
        return _heap.entries.length - 1;
    }

    function entry(Heap storage _heap, uint256 _i) internal view returns (address, uint256) {
        return decode(_heap.entries[_i + 1]);
    }

    // RemoveMax pops off the root element of the heap (the highest value here) and rebalances the heap
    function popTop(Heap storage _heap) internal returns(address _addr, uint256 _value) {
        // Ensure the heap exists
        uint256 heapLength = _heap.entries.length;
        require(heapLength > 1, "The heap does not exists");

        // take the root value of the heap
        (_addr, _value) = decode(_heap.entries[1]);
        _heap.index[_addr] = 0;

        if (heapLength == 2) {
            _heap.entries.length = 1;
        } else {
            // Takes the last element of the array and put it at the root
            uint256 val = _heap.entries[heapLength - 1];
            _heap.entries[1] = val;

            // Delete the last element from the array
            _heap.entries.length = heapLength - 1;

            // Start at the top
            uint256 ind = 1;

            // Bubble down
            ind = _heap.bubbleDown(ind, val);

            // Update index
            _heap.index[decodeAddress(val)] = ind;
        }
    }

    // Inserts adds in a value to our heap.
    function insert(Heap storage _heap, address _addr, uint256 _value) internal {
        require(_heap.index[_addr] == 0, "The entry already exists");

        // Add the value to the end of our array
        uint256 encoded = encode(_addr, _value);
        _heap.entries.push(encoded);

        // Start at the end of the array
        uint256 currentIndex = _heap.entries.length - 1;

        // Bubble Up
        currentIndex = _heap.bubbleUp(currentIndex, encoded);

        // Update index
        _heap.index[_addr] = currentIndex;
    }

    function update(Heap storage _heap, address _addr, uint256 _value) internal {
        uint256 ind = _heap.index[_addr];
        require(ind != 0, "The entry does not exists");

        uint256 can = encode(_addr, _value);
        uint256 val = _heap.entries[ind];
        uint256 newInd;

        if (can < val) {
            // Bubble down
            newInd = _heap.bubbleDown(ind, can);
        } else if (can > val) {
            // Bubble up
            newInd = _heap.bubbleUp(ind, can);
        } else {
            // no changes needed
            return;
        }

        // Update entry
        _heap.entries[newInd] = can;

        // Update index
        if (newInd != ind) {
            _heap.index[_addr] = newInd;
        }
    }

    function bubbleUp(Heap storage _heap, uint256 _ind, uint256 _val) internal returns (uint256 ind) {
        // Bubble up
        ind = _ind;
        if (ind != 1) {
            uint256 parent = _heap.entries[ind / 2];
            while (parent < _val) {
                // If the parent value is lower than our current value, we swap them
                (_heap.entries[ind / 2], _heap.entries[ind]) = (_val, parent);

                // Update moved Index
                _heap.index[decodeAddress(parent)] = ind;

                // change our current Index to go up to the parent
                ind = ind / 2;
                if (ind == 1) {
                    break;
                }

                // Update parent
                parent = _heap.entries[ind / 2];
            }
        }
    }

    function bubbleDown(Heap storage _heap, uint256 _ind, uint256 _val) internal returns (uint256 ind) {
        // Bubble down
        ind = _ind;

        uint256 lenght = _heap.entries.length;
        uint256 target = lenght - 1;

        while (ind * 2 < lenght) {
            // get the current index of the children
            uint256 j = ind * 2;

            // left child value
            uint256 leftChild = _heap.entries[j];

            // Store the value of the child
            uint256 childValue;

            if (target > j) {
                // The parent has two childs 👨‍👧‍👦

                // Load right child value
                uint256 rightChild = _heap.entries[j + 1];

                // Compare the left and right child.
                // if the rightChild is greater, then point j to it's index
                // and save the value
                if (leftChild < rightChild) {
                    childValue = rightChild;
                    j = j + 1;
                } else {
                    // The left child is greater
                    childValue = leftChild;
                }
            } else {
                // The parent has a single child 👨‍👦
                childValue = leftChild;
            }

            // Check if the child has a lower value
            if (_val > childValue) {
                break;
            }

            // else swap the value
            (_heap.entries[ind], _heap.entries[j]) = (childValue, _val);

            // Update moved Index
            _heap.index[decodeAddress(childValue)] = ind;

            // and let's keep going down the heap
            ind = j;
        }
    }
}

// File: contracts/Heap.sol

pragma solidity =0.5.10;



contract Heap is Ownable {
    using AddressMinHeap for AddressMinHeap.Heap;

    // heap
    AddressMinHeap.Heap private heap;

    // Heap events
    event JoinHeap(address indexed _address, uint256 _balance, uint256 _prevSize);
    event LeaveHeap(address indexed _address, uint256 _balance, uint256 _prevSize);

    uint256 public constant TOP_SIZE = 420;

    constructor() public {
        heap.initialize();
    }

    function topSize() external pure returns (uint256) {
        return TOP_SIZE;
    }

    function addressAt(uint256 _i) external view returns (address addr) {
        (addr, ) = heap.entry(_i);
    }

    function indexOf(address _addr) external view returns (uint256) {
        return heap.index[_addr];
    }

    function entry(uint256 _i) external view returns (address, uint256) {
        return heap.entry(_i);
    }

    function top() external view returns (address, uint256) {
        return heap.top();
    }

    function size() external view returns (uint256) {
        return heap.size();
    }

    function update(address _addr, uint256 _new) external onlyOwner {
        uint256 _size = heap.size();

        // If the heap is empty
        // join the _addr
        if (_size == 0 && _new != 0) {
            emit JoinHeap(_addr, _new, 0);
            heap.insert(_addr, _new);
            return;
        }

        // Load top value of the heap
        (, uint256 lastBal) = heap.top();

        // If our target address already is in the heap
        if (heap.has(_addr)) {
            // Update the target address value
            heap.update(_addr, _new);
            // If the new value is 0
            // always pop the heap
            // we updated the heap, so our address should be on top
            if (_new == 0) {
                heap.popTop();
                emit LeaveHeap(_addr, 0, _size);
            }
        } else {
            // IF heap is full or new balance is higher than pop heap
            if (_new != 0 && (_size < TOP_SIZE || lastBal < _new)) {
                // If heap is full pop heap
                if (_size >= TOP_SIZE) {
                    (address _poped, uint256 _balance) = heap.popTop();
                    emit LeaveHeap(_poped, _balance, _size);
                }

                // Insert new value
                heap.insert(_addr, _new);
                emit JoinHeap(_addr, _new, _size);
            }
        }
    }
}

// File: contracts/NugsToken.sol

pragma solidity =0.5.10;









interface Pauseable {
    function unpause() external;
}


contract NugsToken is Ownable, GasPump, IERC20, Pauseable {

    using DistributedStorage for bytes32;
    using SafeMath for uint256;

    // Lottery events
    event Winner(address indexed _addr, uint256 _value);

    // Managment events

    event SetWhitelistedFrom(address _addr, bool _whitelisted);
    event SetWhitelistedTo(address _addr, bool _whitelisted);
    event SetBlacklistedLottery(address _addr, bool _whitelisted);

    event SetFromAddressFee(address _addr, uint256 _fee);
    event SetToAddressFee(address _addr, uint256 _fee);

    uint256 public totalSupply = 420000000 * 10 ** 18;

    bytes32 private constant BALANCE_KEY = keccak256("balance");

    uint256 public constant DEFAULT_FEE = 200;	// 0.5%
    uint256 public constant CALLER_REWARD_FEE = 50;	// 2%

    uint256 public periodSeconds = 86400;	// seconds in 24h

    uint256 public periodOffset = (20*60+20)*60;	// 20H20 UTC == 4h20 Beijing in Summer time

    // metadata
    string public constant name = "Nugs Token";
    string public constant symbol = "NUGS";
    uint8 public constant decimals = 18;

    // custom fees for a few addresses, like badactor contracts
    mapping(address => uint256) public fromAddressFees;
    mapping(address => uint256) public toAddressFees;

    // Whitelisted addresses pay no fees, i.e. exchanges
    mapping(address => bool) public whitelistFrom;
    mapping(address => bool) public whitelistTo;

    // blacklisted lottery addresses do not received lottery winnings
    mapping(address => bool) public blacklistLottery;

    bool public paused = true;

    // heap
    Heap public heap;

    // internal
    bool public inited;
    uint256 public lastWinnerPeriod;

    address pauseMover;

    function init( address _to) external {
        // Only init once
        assert(!inited);
        inited = true;

        // Sanity checks
        assert(address(heap) == address(0));

        // Create Heap
        heap = new Heap();

        // Init contract variables and mint
        // entire token balance
        emit Transfer(address(0), _to, totalSupply);
        _setBalance(_to, totalSupply);

        lastWinnerPeriod = _getCurrentPeriod();
    }


    ///
    // initial token pause
    ///

    function unpause() external {
        require(msg.sender == owner || msg.sender == pauseMover, "only owner or pauser");
        paused = false;
    }

    function setPauseMover(address _addr)  external {
        require(msg.sender == owner || msg.sender == pauseMover, "only owner or pauser");
        pauseMover = _addr;
    }

    ///
    // Storage access functions
    ///

    // Getters

    function _toKey(address a) internal pure returns (bytes32) {
        return bytes32(uint256(a));
    }

    function _balanceOf(address _addr) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(BALANCE_KEY));
    }

    function _allowance(address _addr, address _spender) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(keccak256(abi.encodePacked("allowance", _spender))));
    }

    function _nonce(address _addr, uint256 _cat) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(keccak256(abi.encodePacked("nonce", _cat))));
    }

    // Setters

    function _setAllowance(address _addr, address _spender, uint256 _value) internal {
        _toKey(_addr).write(keccak256(abi.encodePacked("allowance", _spender)), bytes32(_value));
    }

    function _setNonce(address _addr, uint256 _cat, uint256 _value) internal {
        _toKey(_addr).write(keccak256(abi.encodePacked("nonce", _cat)), bytes32(_value));
    }

    function _setBalance(address _addr, uint256 _balance) internal {
        assert(_addr != address(0));    // should never happen
        _toKey(_addr).write(BALANCE_KEY, bytes32(_balance));
        // lottery pot (this contract) address doesnt enter lottery
        if (!blacklistLottery[_addr] && _addr != address(this))
            heap.update(_addr, _balance);
    }


    ///
    // Lottery external methods
    ///

    function isTopHolder(address _addr) external view returns (bool) {
        return heapHas(_addr);
    }

    // any user can call and earn rewards
    function doLottery() external {
        require(paused == false  || msg.sender == owner || msg.sender == pauseMover, "transfers are still paused");

        require(heapHas(msg.sender), "Only one of the 420 top holders may raid the stash!");
        uint256 thisPeriod = _getCurrentPeriod();
        // should  never be <
        require(thisPeriod > lastWinnerPeriod, "Not time to raid the stash yet!");
        lastWinnerPeriod = lastWinnerPeriod.add(1);
        _doLottery(msg.sender);
    }


    ///
    // Internal methods
    ///

    function _isWhitelistedTransfer(address _from, address _to) internal view returns (bool) {
        return whitelistFrom[_from]||whitelistTo[_to];
    }

    function _random(address _s1, uint256 _s2, uint256 _s3, uint256 _max) internal pure returns (uint256) {
        uint256 rand = uint256(keccak256(abi.encodePacked(_s1, _s2, _s3)));
        return rand % (_max + 1);
    }

    function _pickWinner(address _from, uint256 _value) internal returns (address) {
        // Get order of magnitude of the tx
        uint256 magnitude = Math.orderOfMagnitude(_value);
        // Pull nonce for a given order of magnitude
        uint256 nonce = _nonce(_from, magnitude);
        _setNonce(_from, magnitude, nonce + 1);
        // pick entry from heap
        uint256 hsize = heap.size();
        require(hsize != 0, "no holders whitelisted for lottery"); // should never happen in the wild
        return heap.addressAt(_random(_from, nonce, magnitude, hsize - 1));
    }

    function _doLottery(address _from) internal {
        // Pick winner pseudo-randomly
        address selfAddress = address(this);
        uint256 lotteryAmount = _balanceOf(selfAddress);
        address winner = _pickWinner(_from, lotteryAmount);
        require(lotteryAmount != 0, "nothing to raid yet");

        // reward caller
        uint256 callerReward = lotteryAmount.divRound(CALLER_REWARD_FEE);
       _setBalance(_from, _balanceOf(_from).add(callerReward));
        emit Transfer(selfAddress, _from, callerReward);

        // Transfer balance to winner
        uint256 lotteryWinnings = lotteryAmount.sub(callerReward);
        _setBalance(winner, _balanceOf(winner).add(lotteryWinnings));
        emit Winner(winner, lotteryWinnings);
        emit Transfer(selfAddress, winner, lotteryWinnings);
    }

    function _transferFrom(address _operator, address _from, address _to, uint256 _value, bool _payFee) internal {
        require(_to != address(0), "transfers to 0x0 not allowed");
        require(paused == false  || msg.sender == owner || msg.sender == pauseMover, "transfers are still paused");

        // If transfer amount is zero
        // emit event and stop execution
        if (_value == 0) {
            emit Transfer(_from, _to, 0);
            return;
        }

        // Load sender balance
        uint256 balanceFrom = _balanceOf(_from);
        require(balanceFrom >= _value, "balance not enough");

        // Check if operator is sender
        if (_from != _operator) {
            // If not, validate allowance
            uint256 allowanceFrom = _allowance(_from, _operator);
            // If allowance is not 2 ** 256 - 1, consume allowance
            if (allowanceFrom != uint(-1)) {
                // Check allowance and save new one
                require(allowanceFrom >= _value, "allowance not enough");
                _setAllowance(_from, _operator, allowanceFrom.sub(_value));
            }
        }

        // Calculate receiver balance
        // initial receive is full value
        uint256 receiveVal = _value;
        uint256 burnAmount = 0;
        uint256 lott = 0;

        // Change sender balance
        _setBalance(_from, balanceFrom.sub(_value));

        // If the transaction is not whitelisted
        // or if sender requested to pay the fee
        // calculate fees
        if (_payFee || !_isWhitelistedTransfer(_from, _to)) {
            uint256 fee = DEFAULT_FEE;
            if (fromAddressFees[_from] != 0)
                fee = fromAddressFees[_from];
            if (toAddressFees[_to] != 0 && toAddressFees[_to] < fee) // *higher* fee
                fee = toAddressFees[_to];

            // Fee is the same for BURN and LOTT
            // If we are sending value one
            // give priority to BURN
            burnAmount = _value.divRound(fee);
            lott = _value == 1 ? 0 : burnAmount;

            // Subtract fees from receiver amount
            receiveVal = receiveVal.sub(burnAmount.add(lott));

            // Burn tokens. same as ERC20Burnable from OpenZepplin
            totalSupply = totalSupply.sub(burnAmount);
            emit Transfer(_from, address(0), burnAmount);

            // Keep lottery amount until it's time for the lottery
            address selfAddress = address(this);
            // Transfer balance to winner
            _setBalance(selfAddress, _balanceOf(selfAddress).add(lott));
            emit Transfer(_from, selfAddress, lott);
        }

        // Sanity checks
        // no tokens where created
        assert(burnAmount.add(lott).add(receiveVal) == _value);

        // Add tokens to receiver
        _setBalance(_to, _balanceOf(_to).add(receiveVal));
        emit Transfer(_from, _to, receiveVal);
    }

    ///
    // Managment
    ///

    function setWhitelistedTo(address _addr, bool _whitelisted) external onlyOwner {
        emit SetWhitelistedTo(_addr, _whitelisted);
        whitelistTo[_addr] = _whitelisted;
    }

    function setWhitelistedFrom(address _addr, bool _whitelisted) external onlyOwner {
        emit SetWhitelistedFrom(_addr, _whitelisted);
        whitelistFrom[_addr] = _whitelisted;
    }

    function setBlacklistedLottery(address _addr, bool _blacklisted) external onlyOwner {
        emit SetBlacklistedLottery(_addr, _blacklisted);
        blacklistLottery[_addr] = _blacklisted;
        if (_blacklisted)
            heap.update(_addr, 0);	// pops address from heap, if it's there
    }

    function setToAddressFee(address _addr, uint256 _fee) external onlyOwner {
        emit SetToAddressFee(_addr, _fee);
        toAddressFees[_addr] = _fee;
    }

    function setFromAddressFee(address _addr, uint256 _fee) external onlyOwner {
        emit SetFromAddressFee(_addr, _fee);
        fromAddressFees[_addr] = _fee;
    }

    // days since epoch 1/1/1970 + offset of/to 20:20 UTC (4:20 beijing time)
    function _getCurrentPeriod() internal view returns(uint256) {
        return block.timestamp.sub(periodOffset).div(periodSeconds);
    }


    /////
    // Heap methods
    /////

    function heapHas(address _addr) internal view returns (bool) {
        return heap.indexOf(_addr) != 0;
    }

    function topSize() external view returns (uint256) {
        return heap.topSize();
    }

    function heapSize() external view returns (uint256) {
        return heap.size();
    }

    function heapEntry(uint256 _i) external view returns (address, uint256) {
        return heap.entry(_i);
    }

    function heapTop() external view returns (address, uint256) {
        return heap.top();
    }

    function heapIndex(address _addr) external view returns (uint256) {
        return heap.indexOf(_addr);
    }

    function getNonce(address _addr, uint256 _cat) external view returns (uint256) {
        return _nonce(_addr, _cat);
    }

    /////
    // ERC20
    /////

    function balanceOf(address _addr) external view returns (uint256) {
        return _balanceOf(_addr);
    }

    function allowance(address _addr, address _spender) external view returns (uint256) {
        return _allowance(_addr, _spender);
    }

    function approve(address _spender, uint256 _value) external returns (bool) {
        emit Approval(msg.sender, _spender, _value);
        _setAllowance(msg.sender, _spender, _value);
        return true;
    }

    function transfer(address _to, uint256 _value) external  returns (bool) {
        _transferFrom(msg.sender, msg.sender, _to, _value, false);
        return true;
    }

    function transferWithFee(address _to, uint256 _value) external  returns (bool) {
        _transferFrom(msg.sender, msg.sender, _to, _value, true);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) external  returns (bool) {
        _transferFrom(msg.sender, _from, _to, _value, false);
        return true;
    }

    function transferFromWithFee(address _from, address _to, uint256 _value) external  returns (bool) {
        _transferFrom(msg.sender, _from, _to, _value, true);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_i","type":"uint256"}],"name":"heapEntry","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelistTo","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setPauseMover","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastWinnerPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelistFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inited","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heapTop","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isTopHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"doLottery","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_blacklisted","type":"bool"}],"name":"setBlacklistedLottery","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_fee","type":"uint256"}],"name":"setFromAddressFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"topSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"fromAddressFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_cat","type":"uint256"}],"name":"getNonce","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFromWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"toAddressFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_whitelisted","type":"bool"}],"name":"setWhitelistedTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"heapIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CALLER_REWARD_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blacklistLottery","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_fee","type":"uint256"}],"name":"setToAddressFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"periodSeconds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodOffset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heapSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_whitelisted","type":"bool"}],"name":"setWhitelistedFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_addr","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Winner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_whitelisted","type":"bool"}],"name":"SetWhitelistedFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_whitelisted","type":"bool"}],"name":"SetWhitelistedTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_whitelisted","type":"bool"}],"name":"SetBlacklistedLottery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"}],"name":"SetFromAddressFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_fee","type":"uint256"}],"name":"SetToAddressFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"}]

60806040526b015b6a759f4835dc240000006002556201518060035562011df06004556001600a60006101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600033604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16158cc806101246000396000f3fe60806040523480156200001157600080fd5b5060043610620002985760003560e01c80636a266e471162000165578063a486309d11620000d5578063dd62ed3e1162000093578063dd62ed3e1462000d9c578063f1f38deb1462000e17578063f4514fa31462000e68578063f855d3381462000e88578063fa7e8dc71462000ea8578063ff12bbf41462000ec85762000298565b8063a486309d1462000c06578063a9059cbb1462000c59578063b00cf0491462000cc2578063c56c36871462000d1d578063cf7249991462000d3d5762000298565b806389f35468116200012357806389f354681462000a025780638da5cb5b1462000a8b5780639192e6bf1462000ad757806395d89b411462000b32578063a12ab7701462000bba5762000298565b80636a266e47146200087657806370a0823114620008c75780637c32cdd114620009225780637e17a3f4146200094257806389535803146200099d5762000298565b806332cf46e6116200020d5780634849f5c811620001cb5780634849f5c814620007215780634fcc1def1462000774578063514e89771462000794578063583fa3a814620007f35780635a488d0714620007ff5780635c975abb14620008525762000298565b806332cf46e6146200062b5780633f4ba83a146200067257806341b87b27146200067e57806343684b21146200069e57806343c885ba14620006fd5762000298565b806316b627d1116200025b57806316b627d114620004b657806318160ddd146200051557806319ab453c146200053557806323b872dd146200057c578063313ce56714620006055762000298565b806306fdde03146200029d57806308acece2146200032557806308eaae4d146200038e578063095ea7b3146200040657806313af4035146200046f575b600080fd5b620002a762000f1b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015620002e9578082015181840152602081019050620002cc565b50505050905090810190601f168015620003175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b62000374600480360360408110156200033d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062000f54565b604051808215151515815260200191505060405180910390f35b620003bd60048036036020811015620003a657600080fd5b810190808035906020019092919050505062000f70565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b62000455600480360360408110156200041e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001036565b604051808215151515815260200191505060405180910390f35b620004b4600480360360208110156200048757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010b4565b005b620004fb60048036036020811015620004ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001272565b604051808215151515815260200191505060405180910390f35b6200051f62001292565b6040518082815260200191505060405180910390f35b6200057a600480360360208110156200054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001298565b005b620005eb600480360360608110156200059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001419565b604051808215151515815260200191505060405180910390f35b6200060f62001436565b604051808260ff1660ff16815260200191505060405180910390f35b62000670600480360360208110156200064357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200143b565b005b6200067c6200159b565b005b62000688620016d4565b6040518082815260200191505060405180910390f35b620006e360048036036020811015620006b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620016da565b604051808215151515815260200191505060405180910390f35b62000707620016fa565b604051808215151515815260200191505060405180910390f35b6200072b6200170d565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6200077e620017c7565b6040518082815260200191505060405180910390f35b620007d960048036036020811015620007ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620017cc565b604051808215151515815260200191505060405180910390f35b620007fd620017e0565b005b62000850600480360360408110156200081757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505062001a2f565b005b6200085c62001c88565b604051808215151515815260200191505060405180910390f35b620008c5600480360360408110156200088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001c9b565b005b6200090c60048036036020811015620008df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001e11565b6040518082815260200191505060405180910390f35b6200092c62001e25565b6040518082815260200191505060405180910390f35b62000987600480360360208110156200095a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001ed2565b6040518082815260200191505060405180910390f35b620009ec60048036036040811015620009b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001eea565b6040518082815260200191505060405180910390f35b62000a716004803603606081101562000a1a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001f00565b604051808215151515815260200191505060405180910390f35b62000a9562001f1d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000b1c6004803603602081101562000aef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001f42565b6040518082815260200191505060405180910390f35b62000b3c62001f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000b7e57808201518184015260208101905062000b61565b50505050905090810190601f16801562000bac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b62000bc462001f93565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000c576004803603604081101562000c1e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505062001fb9565b005b62000ca86004803603604081101562000c7157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062002146565b604051808215151515815260200191505060405180910390f35b62000d076004803603602081101562000cda57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062002162565b6040518082815260200191505060405180910390f35b62000d2762002248565b6040518082815260200191505060405180910390f35b62000d826004803603602081101562000d5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200224d565b604051808215151515815260200191505060405180910390f35b62000e016004803603604081101562000db457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200226d565b6040518082815260200191505060405180910390f35b62000e666004803603604081101562000e2f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062002283565b005b62000e72620023f9565b6040518082815260200191505060405180910390f35b62000e92620023ff565b6040518082815260200191505060405180910390f35b62000eb262002405565b6040518082815260200191505060405180910390f35b62000f196004803603604081101562000ee057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050620024b2565b005b6040518060400160405280600a81526020017f4e75677320546f6b656e0000000000000000000000000000000000000000000081525081565b600062000f663333858560016200263f565b6001905092915050565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2095c07846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801562000fe657600080fd5b505afa15801562000ffb573d6000803e3d6000fd5b505050506040513d60408110156200101257600080fd5b81019080805190602001909291908051906020019092919050505091509150915091565b60008273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3620010aa33848462002e13565b6001905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60025481565b600a60159054906101000a900460ff1615620012b057fe5b6001600a60156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200132457fe5b604051620013329062004170565b604051809103906000f0801580156200134f573d6000803e3d6000fd5b50600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6002546040518082815260200191505060405180910390a3620014068160025462002eb9565b620014106200309f565b600b8190555050565b60006200142b3385858560006200263f565b600190509392505050565b601281565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480620014e45750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b62001557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c79206f776e6572206f722070617573657200000000000000000000000081525060200191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480620016445750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b620016b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c79206f776e6572206f722070617573657200000000000000000000000081525060200191505060405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b600b5481565b60076020528060005260406000206000915054906101000a900460ff1681565b600a60159054906101000a900460ff1681565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fe6dcdba6040518163ffffffff1660e01b8152600401604080518083038186803b1580156200177857600080fd5b505afa1580156200178d573d6000803e3d6000fd5b505050506040513d6040811015620017a457600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b60c881565b6000620017d982620030d3565b9050919050565b60001515600a60009054906101000a900460ff16151514806200184f57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80620018a85750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6200191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7472616e736665727320617265207374696c6c2070617573656400000000000081525060200191505060405180910390fd5b6200192633620030d3565b6200197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180620058436033913960400191505060405180910390fd5b6000620019896200309f565b9050600b54811162001a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f742074696d6520746f20726169642074686520737461736820796574210081525060200191505060405180910390fd5b62001a1b6001600b54620031bc90919063ffffffff16565b600b8190555062001a2c3362003245565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fb681219831604b3b6fc8e46a8ccd24d83b78c6ca62a38b83aa27ca27b555962a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801562001c8457600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2d83b5e8360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801562001c6a57600080fd5b505af115801562001c7f573d6000803e3d6000fd5b505050505b5050565b600a60009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f0fcd385e1ee450f67d3308128f0289ecce033117ff89880b3ca76f37bb6b9dfb8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a180600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600062001e1e8262003488565b9050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c32cdd16040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e9057600080fd5b505afa15801562001ea5573d6000803e3d6000fd5b505050506040513d602081101562001ebc57600080fd5b8101908080519060200190929190505050905090565b60056020528060005260406000206000915090505481565b600062001ef88383620034e8565b905092915050565b600062001f123385858560016200263f565b600190509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915090505481565b6040518060400160405280600481526020017f4e5547530000000000000000000000000000000000000000000000000000000081525081565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f432f867513ff7aae52f8cd435bea765a6d5187a3cec30838d1f32298e98632308282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000620021583333858560006200263f565b6001905092915050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd6aad25836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156200220457600080fd5b505afa15801562002219573d6000803e3d6000fd5b505050506040513d60208110156200223057600080fd5b81019080805190602001909291905050509050919050565b603281565b60096020528060005260406000206000915054906101000a900460ff1681565b60006200227b838362003562565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462002346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f20e5d11e900eaeca1ddeb6acba8ab9bef75ee9a47b5f45b92d070dcb019b35df8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a180600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60035481565b60045481565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200247057600080fd5b505afa15801562002485573d6000803e3d6000fd5b505050506040513d60208110156200249c57600080fd5b8101908080519060200190929190505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462002575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7ffe5e521975f0ba8de90d801c5fa34fa051ea9c7b85b06d07f36b11ad8ad53f038282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620026e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f7472616e736665727320746f20307830206e6f7420616c6c6f7765640000000081525060200191505060405180910390fd5b60001515600a60009054906101000a900460ff16151514806200275257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80620027ab5750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6200281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7472616e736665727320617265207374696c6c2070617573656400000000000081525060200191505060405180910390fd5b600082141562002894578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006040518082815260200191505060405180910390a362002e0c565b6000620028a18562003488565b9050828110156200291a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f62616c616e6365206e6f7420656e6f756768000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161462002a215760006200295c868862003562565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811462002a1f5783811015620029fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c6c6f77616e6365206e6f7420656e6f75676800000000000000000000000081525060200191505060405180910390fd5b62002a1e868862002a1887856200360b90919063ffffffff16565b62002e13565b5b505b60008390506000809050600080905062002a508862002a4a88876200360b90919063ffffffff16565b62002eb9565b848062002a66575062002a6488886200368f565b155b1562002d4657600060c890506000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462002afd57600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801562002b8c575080600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b1562002bd557600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b62002bea81886200373b90919063ffffffff16565b92506001871462002bfc578262002bff565b60005b915062002c2a62002c1a8385620031bc90919063ffffffff16565b856200360b90919063ffffffff16565b935062002c43836002546200360b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600030905062002cde8162002cd88562002cc98562003488565b620031bc90919063ffffffff16565b62002eb9565b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a350505b8562002d708462002d618486620031bc90919063ffffffff16565b620031bc90919063ffffffff16565b1462002d7857fe5b62002da28762002d9c8562002d8d8b62003488565b620031bc90919063ffffffff16565b62002eb9565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505b5050505050565b62002eb48260405160200180807f616c6c6f77616e636500000000000000000000000000000000000000000000008152506009018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401915050604051602081830303815290604052805190602001208260001b62002ea486620037e7565b6200380a9092919063ffffffff16565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562002ef157fe5b62002f4a60405180807f62616c616e636500000000000000000000000000000000000000000000000000815250600701905060405180910390208260001b62002f3a85620037e7565b6200380a9092919063ffffffff16565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801562002fd157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156200309b57600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2d83b5e83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156200308157600080fd5b505af115801562003096573d6000803e3d6000fd5b505050505b5050565b6000620030ce600354620030bf600454426200360b90919063ffffffff16565b62003a0290919063ffffffff16565b905090565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd6aad25846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156200317657600080fd5b505afa1580156200318b573d6000803e3d6000fd5b505050506040513d6020811015620031a257600080fd5b810190808051906020019092919050505014159050919050565b6000808284019050838110156200323b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f416464206f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b8091505092915050565b60003090506000620032578262003488565b9050600062003267848362003a8e565b90506000821415620032e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7468696e6720746f2072616964207965740000000000000000000000000081525060200191505060405180910390fd5b6000620032f96032846200373b90919063ffffffff16565b905062003325856200331f83620033108962003488565b620031bc90919063ffffffff16565b62002eb9565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000620033a182856200360b90919063ffffffff16565b9050620033cd83620033c783620033b88762003488565b620031bc90919063ffffffff16565b62002eb9565b8273ffffffffffffffffffffffffffffffffffffffff167f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e20826040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050505050565b6000620034de60405180807f62616c616e63650000000000000000000000000000000000000000000000000081525060070190506040518091039020620034cf84620037e7565b62003c9090919063ffffffff16565b60001c9050919050565b6000620035578260405160200180807f6e6f6e6365000000000000000000000000000000000000000000000000000000815250600501828152602001915050604051602081830303815290604052805190602001206200354885620037e7565b62003c9090919063ffffffff16565b60001c905092915050565b6000620036008260405160200180807f616c6c6f77616e636500000000000000000000000000000000000000000000008152506009018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120620035f185620037e7565b62003c9090919063ffffffff16565b60001c905092915050565b60008183101562003684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f53756220756e646572666c6f770000000000000000000000000000000000000081525060200191505060405180910390fd5b818303905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620037335750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b600080821415620037b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f446976206279207a65726f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000828481620037c057fe5b0490506000838581620037cf57fe5b0614620037dd576001810190505b8091505092915050565b60008173ffffffffffffffffffffffffffffffffffffffff1660001b9050919050565b6000620038178462003eaf565b9050620038248162003f9d565b6200383557620038348462003fe3565b5b60008173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663e2e52ec1905060e01b85856040516024018083815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106200391a5780518252602082019150602081019050602083039250620038f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146200397e576040519150601f19603f3d011682016040523d82523d6000602084013e62003983565b606091505b5050905080620039fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6572726f722077726974696e672073746f72616765000000000000000000000081525060200191505060405180910390fd5b5050505050565b60008082141562003a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f446976206279207a65726f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b81838162003a8557fe5b04905092915050565b60008062003a9c836200401c565b9050600062003aac8583620034e8565b905062003abe85836001840162004072565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b815260040160206040518083038186803b15801562003b2957600080fd5b505afa15801562003b3e573d6000803e3d6000fd5b505050506040513d602081101562003b5557600080fd5b81019080805190602001909291905050509050600081141562003bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620058766022913960400191505060405180910390fd5b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630af2b3e562003c1388858760018703620040e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562003c4857600080fd5b505afa15801562003c5d573d6000803e3d6000fd5b505050506040513d602081101562003c7457600080fd5b8101908080519060200190929190505050935050505092915050565b60008062003c9e8462003eaf565b905062003cab8162003f9d565b62003cbd576000801b91505062003ea9565b600060608273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166361da1439905060e01b8660405160240180828152602001915050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831062003d9c578051825260208201915060208101905060208303925062003d77565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811462003dfe576040519150601f19603f3d011682016040523d82523d6000602084013e62003e03565b606091505b50915091508162003e7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6572726f722072656164696e672073746f72616765000000000000000000000081525060200191505060405180910390fd5b80806020019051602081101562003e9257600080fd5b810190808051906020019092919050505093505050505b92915050565b600060ff60f81b30836040518060200162003eca906200417e565b6020820181038252601f19601f820116604052508051906020012060405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050919050565b600080823f90506000801b811415801562003fdb57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b8114155b915050919050565b60606040518060200162003ff7906200417e565b6020820181038252601f19601f820116604052509050818151602083016000f5505050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060008390505b600a81816200405357fe5b0490508180600101925050600081141562004048578192505050919050565b620040e48260405160200180807f6e6f6e6365000000000000000000000000000000000000000000000000000000815250600501828152602001915050604051602081830303815290604052805190602001208260001b620040d486620037e7565b6200380a9092919063ffffffff16565b505050565b600080858585604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200193505050506040516020818303038152906040528051906020012060001c90506001830181816200416457fe5b06915050949350505050565b6114da806200418d83390190565b6101dc80620056678339019056fe608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600033604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16100fd600161010260201b6112361760201c565b6101b1565b600081600001805490501461017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b806000016000908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b61131a806101c06000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063949d225d11610066578063949d225d146101db578063a2d83b5e146101f9578063e2095c0714610247578063fd6aad25146102bc578063fe6dcdba146103145761009e565b80630af2b3e5146100a357806313af40351461011157806331fb7127146101555780637c32cdd1146101735780638da5cb5b14610191575b600080fd5b6100cf600480360360208110156100b957600080fd5b8101908080359060200190929190505050610365565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101536004803603602081101561012757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610385565b005b61015d610542565b6040518082815260200191505060405180910390f35b61017b610548565b6040518082815260200191505060405180910390f35b610199610552565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e3610577565b6040518082815260200191505060405180910390f35b6102456004803603604081101561020f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610588565b005b6102736004803603602081101561025d57600080fd5b810190808035906020019092919050505061089a565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6102fe600480360360208110156102d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108ba565b6040518082815260200191505060405180910390f35b61031c610905565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b600061037b82600161091a90919063ffffffff16565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101a481565b60006101a4905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610583600161094d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461064a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000610656600161094d565b9050600081148015610669575060008214155b156106e1578273ffffffffffffffffffffffffffffffffffffffff167fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93836000604051808381526020018281526020019250505060405180910390a26106db838360016109619092919063ffffffff16565b50610896565b60006106ed6001610ac7565b915050610704846001610b1990919063ffffffff16565b156107915761071f84846001610b689092919063ffffffff16565b600083141561078c576107326001610d1b565b50508373ffffffffffffffffffffffffffffffffffffffff167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e7600084604051808381526020018281526020019250505060405180910390a25b610893565b600083141580156107ad57506101a48210806107ac57508281105b5b15610892576101a48210610825576000806107c86001610d1b565b915091508173ffffffffffffffffffffffffffffffffffffffff167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e78286604051808381526020018281526020019250505060405180910390a250505b61083b848460016109619092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff167fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff938484604051808381526020018281526020019250505060405180910390a25b5b50505b5050565b6000806108b183600161091a90919063ffffffff16565b91509150915091565b60006001800160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806109126001610ac7565b915091509091565b60008061094284600001600185018154811061093257fe5b9060005260206000200154610efa565b915091509250929050565b600060018260000180549050039050919050565b60008360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54686520656e74727920616c726561647920657869737473000000000000000081525060200191505060405180910390fd5b6000610a248383610f24565b905083600001819080600181540180825580915050906001820390600052602060002001600090919290919091505550600060018560000180549050039050610a78818387610f4b9092919063ffffffff16565b9050808560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b600080600283600001805490501015610aec5760008081915080905091509150610b14565b610b0f83600001600181548110610aff57fe5b9060005260206000200154610efa565b915091505b915091565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415905092915050565b60008360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610c25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f54686520656e74727920646f6573206e6f74206578697374730000000000000081525060200191505060405180910390fd5b6000610c318484610f24565b90506000856000018381548110610c4457fe5b90600052602060002001549050600081831015610c7757610c708484896110749092919063ffffffff16565b9050610ca5565b81831115610c9b57610c94848489610f4b9092919063ffffffff16565b9050610ca4565b50505050610d16565b5b82876000018281548110610cb557fe5b9060005260206000200181905550838114610d1157808760010160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505b505050565b60008060008360000180549050905060018111610da0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546865206865617020646f6573206e6f7420657869737473000000000000000081525060200191505060405180910390fd5b610dc384600001600181548110610db357fe5b9060005260206000200154610efa565b809350819450505060008460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002811415610e325760018460000181610e2c91906111e5565b50610ef4565b6000846000016001830381548110610e4657fe5b906000526020600020015490508085600001600181548110610e6457fe5b9060005260206000200181905550600182038560000181610e8591906111e5565b50600060019050610ea18183886110749092919063ffffffff16565b905080866001016000610eb3856111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b50915091565b600080821973ffffffffffffffffffffffffffffffffffffffff811692508060a01c915050915091565b60008160a01b8373ffffffffffffffffffffffffffffffffffffffff161719905092915050565b60008290506001811461106d5760008460000160028381610f6857fe5b0481548110610f7357fe5b906000526020600020015490505b8281101561106b5782818660000160028581610f9957fe5b0481548110610fa457fe5b906000526020600020016000886000018681548110610fbf57fe5b90600052602060002001600084919050558391905055505081856001016000610fe7846111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002828161102f57fe5b04915060018214156110405761106b565b846000016002838161104e57fe5b048154811061105957fe5b90600052602060002001549050610f81565b505b9392505050565b600082905060008460000180549050905060006001820390505b816002840210156111bb57600060028402905060008760000182815481106110b257fe5b9060005260206000200154905060008284111561110a5760008960000160018501815481106110dd57fe5b906000526020600020015490508083101561110057809150600184019350611104565b8291505b5061110e565b8190505b8087111561111e575050506111bb565b80878a600001888154811061112f57fe5b9060005260206000200160008c600001878154811061114a57fe5b90600052602060002001600084919050558391905055505085896001016000611172846111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082955050505061108e565b50509392505050565b600073ffffffffffffffffffffffffffffffffffffffff8219169050919050565b81548183558181111561120c5781836000526020600020918201910161120b9190611211565b5b505050565b61123391905b8082111561122f576000816000905550600101611217565b5090565b90565b60008160000180549050146112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b80600001600090806001815401808255809150509060018203906000526020600020016000909192909190915055505056fea265627a7a72305820aa7488443deddaf81def4253f723399c7a57c76480575c0ce76d35bb26279f4564736f6c634300050a0032608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061017c806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806361da14391461003b578063e2e52ec11461007d575b600080fd5b6100676004803603602081101561005157600080fd5b81019080803590602001909291905050506100b5565b6040518082815260200191505060405180910390f35b6100b36004803603604081101561009357600080fd5b8101908080359060200190929190803590602001909291905050506100d2565b005b600060016000838152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461012b57600080fd5b806001600084815260200190815260200160002081905550505056fea265627a7a72305820838c40e8544fd57690fa2fcf0958553f59bdf1d1ebb5792ea61fb8929ca9679764736f6c634300050a00324f6e6c79206f6e65206f66207468652034323020746f7020686f6c64657273206d6179207261696420746865207374617368216e6f20686f6c646572732077686974656c697374656420666f72206c6f7474657279a265627a7a723058200d5a1e4888cf5ae6d37478eaa75fa6bd7e038bedac38647aa664b870bef8792264736f6c634300050a0032

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620002985760003560e01c80636a266e471162000165578063a486309d11620000d5578063dd62ed3e1162000093578063dd62ed3e1462000d9c578063f1f38deb1462000e17578063f4514fa31462000e68578063f855d3381462000e88578063fa7e8dc71462000ea8578063ff12bbf41462000ec85762000298565b8063a486309d1462000c06578063a9059cbb1462000c59578063b00cf0491462000cc2578063c56c36871462000d1d578063cf7249991462000d3d5762000298565b806389f35468116200012357806389f354681462000a025780638da5cb5b1462000a8b5780639192e6bf1462000ad757806395d89b411462000b32578063a12ab7701462000bba5762000298565b80636a266e47146200087657806370a0823114620008c75780637c32cdd114620009225780637e17a3f4146200094257806389535803146200099d5762000298565b806332cf46e6116200020d5780634849f5c811620001cb5780634849f5c814620007215780634fcc1def1462000774578063514e89771462000794578063583fa3a814620007f35780635a488d0714620007ff5780635c975abb14620008525762000298565b806332cf46e6146200062b5780633f4ba83a146200067257806341b87b27146200067e57806343684b21146200069e57806343c885ba14620006fd5762000298565b806316b627d1116200025b57806316b627d114620004b657806318160ddd146200051557806319ab453c146200053557806323b872dd146200057c578063313ce56714620006055762000298565b806306fdde03146200029d57806308acece2146200032557806308eaae4d146200038e578063095ea7b3146200040657806313af4035146200046f575b600080fd5b620002a762000f1b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015620002e9578082015181840152602081019050620002cc565b50505050905090810190601f168015620003175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b62000374600480360360408110156200033d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062000f54565b604051808215151515815260200191505060405180910390f35b620003bd60048036036020811015620003a657600080fd5b810190808035906020019092919050505062000f70565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b62000455600480360360408110156200041e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001036565b604051808215151515815260200191505060405180910390f35b620004b4600480360360208110156200048757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010b4565b005b620004fb60048036036020811015620004ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001272565b604051808215151515815260200191505060405180910390f35b6200051f62001292565b6040518082815260200191505060405180910390f35b6200057a600480360360208110156200054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001298565b005b620005eb600480360360608110156200059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001419565b604051808215151515815260200191505060405180910390f35b6200060f62001436565b604051808260ff1660ff16815260200191505060405180910390f35b62000670600480360360208110156200064357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200143b565b005b6200067c6200159b565b005b62000688620016d4565b6040518082815260200191505060405180910390f35b620006e360048036036020811015620006b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620016da565b604051808215151515815260200191505060405180910390f35b62000707620016fa565b604051808215151515815260200191505060405180910390f35b6200072b6200170d565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6200077e620017c7565b6040518082815260200191505060405180910390f35b620007d960048036036020811015620007ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620017cc565b604051808215151515815260200191505060405180910390f35b620007fd620017e0565b005b62000850600480360360408110156200081757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505062001a2f565b005b6200085c62001c88565b604051808215151515815260200191505060405180910390f35b620008c5600480360360408110156200088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001c9b565b005b6200090c60048036036020811015620008df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001e11565b6040518082815260200191505060405180910390f35b6200092c62001e25565b6040518082815260200191505060405180910390f35b62000987600480360360208110156200095a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001ed2565b6040518082815260200191505060405180910390f35b620009ec60048036036040811015620009b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001eea565b6040518082815260200191505060405180910390f35b62000a716004803603606081101562000a1a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001f00565b604051808215151515815260200191505060405180910390f35b62000a9562001f1d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000b1c6004803603602081101562000aef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001f42565b6040518082815260200191505060405180910390f35b62000b3c62001f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101562000b7e57808201518184015260208101905062000b61565b50505050905090810190601f16801562000bac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b62000bc462001f93565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000c576004803603604081101562000c1e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505062001fb9565b005b62000ca86004803603604081101562000c7157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062002146565b604051808215151515815260200191505060405180910390f35b62000d076004803603602081101562000cda57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062002162565b6040518082815260200191505060405180910390f35b62000d2762002248565b6040518082815260200191505060405180910390f35b62000d826004803603602081101562000d5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200224d565b604051808215151515815260200191505060405180910390f35b62000e016004803603604081101562000db457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200226d565b6040518082815260200191505060405180910390f35b62000e666004803603604081101562000e2f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062002283565b005b62000e72620023f9565b6040518082815260200191505060405180910390f35b62000e92620023ff565b6040518082815260200191505060405180910390f35b62000eb262002405565b6040518082815260200191505060405180910390f35b62000f196004803603604081101562000ee057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050620024b2565b005b6040518060400160405280600a81526020017f4e75677320546f6b656e0000000000000000000000000000000000000000000081525081565b600062000f663333858560016200263f565b6001905092915050565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2095c07846040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801562000fe657600080fd5b505afa15801562000ffb573d6000803e3d6000fd5b505050506040513d60408110156200101257600080fd5b81019080805190602001909291908051906020019092919050505091509150915091565b60008273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3620010aa33848462002e13565b6001905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60086020528060005260406000206000915054906101000a900460ff1681565b60025481565b600a60159054906101000a900460ff1615620012b057fe5b6001600a60156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200132457fe5b604051620013329062004170565b604051809103906000f0801580156200134f573d6000803e3d6000fd5b50600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6002546040518082815260200191505060405180910390a3620014068160025462002eb9565b620014106200309f565b600b8190555050565b60006200142b3385858560006200263f565b600190509392505050565b601281565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480620014e45750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b62001557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c79206f776e6572206f722070617573657200000000000000000000000081525060200191505060405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480620016445750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b620016b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c79206f776e6572206f722070617573657200000000000000000000000081525060200191505060405180910390fd5b6000600a60006101000a81548160ff021916908315150217905550565b600b5481565b60076020528060005260406000206000915054906101000a900460ff1681565b600a60159054906101000a900460ff1681565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fe6dcdba6040518163ffffffff1660e01b8152600401604080518083038186803b1580156200177857600080fd5b505afa1580156200178d573d6000803e3d6000fd5b505050506040513d6040811015620017a457600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b60c881565b6000620017d982620030d3565b9050919050565b60001515600a60009054906101000a900460ff16151514806200184f57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80620018a85750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6200191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7472616e736665727320617265207374696c6c2070617573656400000000000081525060200191505060405180910390fd5b6200192633620030d3565b6200197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180620058436033913960400191505060405180910390fd5b6000620019896200309f565b9050600b54811162001a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e6f742074696d6520746f20726169642074686520737461736820796574210081525060200191505060405180910390fd5b62001a1b6001600b54620031bc90919063ffffffff16565b600b8190555062001a2c3362003245565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7fb681219831604b3b6fc8e46a8ccd24d83b78c6ca62a38b83aa27ca27b555962a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801562001c8457600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2d83b5e8360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801562001c6a57600080fd5b505af115801562001c7f573d6000803e3d6000fd5b505050505b5050565b600a60009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462001d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f0fcd385e1ee450f67d3308128f0289ecce033117ff89880b3ca76f37bb6b9dfb8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a180600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600062001e1e8262003488565b9050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c32cdd16040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e9057600080fd5b505afa15801562001ea5573d6000803e3d6000fd5b505050506040513d602081101562001ebc57600080fd5b8101908080519060200190929190505050905090565b60056020528060005260406000206000915090505481565b600062001ef88383620034e8565b905092915050565b600062001f123385858560016200263f565b600190509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60066020528060005260406000206000915090505481565b6040518060400160405280600481526020017f4e5547530000000000000000000000000000000000000000000000000000000081525081565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f432f867513ff7aae52f8cd435bea765a6d5187a3cec30838d1f32298e98632308282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000620021583333858560006200263f565b6001905092915050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd6aad25836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156200220457600080fd5b505afa15801562002219573d6000803e3d6000fd5b505050506040513d60208110156200223057600080fd5b81019080805190602001909291905050509050919050565b603281565b60096020528060005260406000206000915054906101000a900460ff1681565b60006200227b838362003562565b905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462002346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f20e5d11e900eaeca1ddeb6acba8ab9bef75ee9a47b5f45b92d070dcb019b35df8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a180600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60035481565b60045481565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200247057600080fd5b505afa15801562002485573d6000803e3d6000fd5b505050506040513d60208110156200249c57600080fd5b8101908080519060200190929190505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462002575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7ffe5e521975f0ba8de90d801c5fa34fa051ea9c7b85b06d07f36b11ad8ad53f038282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a180600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620026e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f7472616e736665727320746f20307830206e6f7420616c6c6f7765640000000081525060200191505060405180910390fd5b60001515600a60009054906101000a900460ff16151514806200275257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80620027ab5750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6200281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7472616e736665727320617265207374696c6c2070617573656400000000000081525060200191505060405180910390fd5b600082141562002894578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006040518082815260200191505060405180910390a362002e0c565b6000620028a18562003488565b9050828110156200291a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f62616c616e6365206e6f7420656e6f756768000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161462002a215760006200295c868862003562565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811462002a1f5783811015620029fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f616c6c6f77616e6365206e6f7420656e6f75676800000000000000000000000081525060200191505060405180910390fd5b62002a1e868862002a1887856200360b90919063ffffffff16565b62002e13565b5b505b60008390506000809050600080905062002a508862002a4a88876200360b90919063ffffffff16565b62002eb9565b848062002a66575062002a6488886200368f565b155b1562002d4657600060c890506000600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462002afd57600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b6000600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415801562002b8c575080600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b1562002bd557600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b62002bea81886200373b90919063ffffffff16565b92506001871462002bfc578262002bff565b60005b915062002c2a62002c1a8385620031bc90919063ffffffff16565b856200360b90919063ffffffff16565b935062002c43836002546200360b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600030905062002cde8162002cd88562002cc98562003488565b620031bc90919063ffffffff16565b62002eb9565b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a350505b8562002d708462002d618486620031bc90919063ffffffff16565b620031bc90919063ffffffff16565b1462002d7857fe5b62002da28762002d9c8562002d8d8b62003488565b620031bc90919063ffffffff16565b62002eb9565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505b5050505050565b62002eb48260405160200180807f616c6c6f77616e636500000000000000000000000000000000000000000000008152506009018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401915050604051602081830303815290604052805190602001208260001b62002ea486620037e7565b6200380a9092919063ffffffff16565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562002ef157fe5b62002f4a60405180807f62616c616e636500000000000000000000000000000000000000000000000000815250600701905060405180910390208260001b62002f3a85620037e7565b6200380a9092919063ffffffff16565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801562002fd157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156200309b57600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2d83b5e83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156200308157600080fd5b505af115801562003096573d6000803e3d6000fd5b505050505b5050565b6000620030ce600354620030bf600454426200360b90919063ffffffff16565b62003a0290919063ffffffff16565b905090565b600080600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd6aad25846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156200317657600080fd5b505afa1580156200318b573d6000803e3d6000fd5b505050506040513d6020811015620031a257600080fd5b810190808051906020019092919050505014159050919050565b6000808284019050838110156200323b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f416464206f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b8091505092915050565b60003090506000620032578262003488565b9050600062003267848362003a8e565b90506000821415620032e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6f7468696e6720746f2072616964207965740000000000000000000000000081525060200191505060405180910390fd5b6000620032f96032846200373b90919063ffffffff16565b905062003325856200331f83620033108962003488565b620031bc90919063ffffffff16565b62002eb9565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000620033a182856200360b90919063ffffffff16565b9050620033cd83620033c783620033b88762003488565b620031bc90919063ffffffff16565b62002eb9565b8273ffffffffffffffffffffffffffffffffffffffff167f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e20826040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050505050565b6000620034de60405180807f62616c616e63650000000000000000000000000000000000000000000000000081525060070190506040518091039020620034cf84620037e7565b62003c9090919063ffffffff16565b60001c9050919050565b6000620035578260405160200180807f6e6f6e6365000000000000000000000000000000000000000000000000000000815250600501828152602001915050604051602081830303815290604052805190602001206200354885620037e7565b62003c9090919063ffffffff16565b60001c905092915050565b6000620036008260405160200180807f616c6c6f77616e636500000000000000000000000000000000000000000000008152506009018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120620035f185620037e7565b62003c9090919063ffffffff16565b60001c905092915050565b60008183101562003684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f53756220756e646572666c6f770000000000000000000000000000000000000081525060200191505060405180910390fd5b818303905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620037335750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b600080821415620037b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f446976206279207a65726f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000828481620037c057fe5b0490506000838581620037cf57fe5b0614620037dd576001810190505b8091505092915050565b60008173ffffffffffffffffffffffffffffffffffffffff1660001b9050919050565b6000620038178462003eaf565b9050620038248162003f9d565b6200383557620038348462003fe3565b5b60008173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663e2e52ec1905060e01b85856040516024018083815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106200391a5780518252602082019150602081019050602083039250620038f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146200397e576040519150601f19603f3d011682016040523d82523d6000602084013e62003983565b606091505b5050905080620039fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6572726f722077726974696e672073746f72616765000000000000000000000081525060200191505060405180910390fd5b5050505050565b60008082141562003a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f446976206279207a65726f00000000000000000000000000000000000000000081525060200191505060405180910390fd5b81838162003a8557fe5b04905092915050565b60008062003a9c836200401c565b9050600062003aac8583620034e8565b905062003abe85836001840162004072565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b815260040160206040518083038186803b15801562003b2957600080fd5b505afa15801562003b3e573d6000803e3d6000fd5b505050506040513d602081101562003b5557600080fd5b81019080805190602001909291905050509050600081141562003bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620058766022913960400191505060405180910390fd5b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630af2b3e562003c1388858760018703620040e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562003c4857600080fd5b505afa15801562003c5d573d6000803e3d6000fd5b505050506040513d602081101562003c7457600080fd5b8101908080519060200190929190505050935050505092915050565b60008062003c9e8462003eaf565b905062003cab8162003f9d565b62003cbd576000801b91505062003ea9565b600060608273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166361da1439905060e01b8660405160240180828152602001915050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b6020831062003d9c578051825260208201915060208101905060208303925062003d77565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811462003dfe576040519150601f19603f3d011682016040523d82523d6000602084013e62003e03565b606091505b50915091508162003e7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6572726f722072656164696e672073746f72616765000000000000000000000081525060200191505060405180910390fd5b80806020019051602081101562003e9257600080fd5b810190808051906020019092919050505093505050505b92915050565b600060ff60f81b30836040518060200162003eca906200417e565b6020820181038252601f19601f820116604052508051906020012060405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050919050565b600080823f90506000801b811415801562003fdb57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b8114155b915050919050565b60606040518060200162003ff7906200417e565b6020820181038252601f19601f820116604052509050818151602083016000f5505050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060008390505b600a81816200405357fe5b0490508180600101925050600081141562004048578192505050919050565b620040e48260405160200180807f6e6f6e6365000000000000000000000000000000000000000000000000000000815250600501828152602001915050604051602081830303815290604052805190602001208260001b620040d486620037e7565b6200380a9092919063ffffffff16565b505050565b600080858585604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140183815260200182815260200193505050506040516020818303038152906040528051906020012060001c90506001830181816200416457fe5b06915050949350505050565b6114da806200418d83390190565b6101dc80620056678339019056fe608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600033604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16100fd600161010260201b6112361760201c565b6101b1565b600081600001805490501461017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b806000016000908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b61131a806101c06000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063949d225d11610066578063949d225d146101db578063a2d83b5e146101f9578063e2095c0714610247578063fd6aad25146102bc578063fe6dcdba146103145761009e565b80630af2b3e5146100a357806313af40351461011157806331fb7127146101555780637c32cdd1146101735780638da5cb5b14610191575b600080fd5b6100cf600480360360208110156100b957600080fd5b8101908080359060200190929190505050610365565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101536004803603602081101561012757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610385565b005b61015d610542565b6040518082815260200191505060405180910390f35b61017b610548565b6040518082815260200191505060405180910390f35b610199610552565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e3610577565b6040518082815260200191505060405180910390f35b6102456004803603604081101561020f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610588565b005b6102736004803603602081101561025d57600080fd5b810190808035906020019092919050505061089a565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b6102fe600480360360208110156102d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108ba565b6040518082815260200191505060405180910390f35b61031c610905565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b600061037b82600161091a90919063ffffffff16565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101a481565b60006101a4905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610583600161094d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461064a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f6f6e6c79206f776e65720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000610656600161094d565b9050600081148015610669575060008214155b156106e1578273ffffffffffffffffffffffffffffffffffffffff167fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93836000604051808381526020018281526020019250505060405180910390a26106db838360016109619092919063ffffffff16565b50610896565b60006106ed6001610ac7565b915050610704846001610b1990919063ffffffff16565b156107915761071f84846001610b689092919063ffffffff16565b600083141561078c576107326001610d1b565b50508373ffffffffffffffffffffffffffffffffffffffff167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e7600084604051808381526020018281526020019250505060405180910390a25b610893565b600083141580156107ad57506101a48210806107ac57508281105b5b15610892576101a48210610825576000806107c86001610d1b565b915091508173ffffffffffffffffffffffffffffffffffffffff167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e78286604051808381526020018281526020019250505060405180910390a250505b61083b848460016109619092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff167fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff938484604051808381526020018281526020019250505060405180910390a25b5b50505b5050565b6000806108b183600161091a90919063ffffffff16565b91509150915091565b60006001800160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806109126001610ac7565b915091509091565b60008061094284600001600185018154811061093257fe5b9060005260206000200154610efa565b915091509250929050565b600060018260000180549050039050919050565b60008360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54686520656e74727920616c726561647920657869737473000000000000000081525060200191505060405180910390fd5b6000610a248383610f24565b905083600001819080600181540180825580915050906001820390600052602060002001600090919290919091505550600060018560000180549050039050610a78818387610f4b9092919063ffffffff16565b9050808560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b600080600283600001805490501015610aec5760008081915080905091509150610b14565b610b0f83600001600181548110610aff57fe5b9060005260206000200154610efa565b915091505b915091565b6000808360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415905092915050565b60008360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610c25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f54686520656e74727920646f6573206e6f74206578697374730000000000000081525060200191505060405180910390fd5b6000610c318484610f24565b90506000856000018381548110610c4457fe5b90600052602060002001549050600081831015610c7757610c708484896110749092919063ffffffff16565b9050610ca5565b81831115610c9b57610c94848489610f4b9092919063ffffffff16565b9050610ca4565b50505050610d16565b5b82876000018281548110610cb557fe5b9060005260206000200181905550838114610d1157808760010160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505b505050565b60008060008360000180549050905060018111610da0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546865206865617020646f6573206e6f7420657869737473000000000000000081525060200191505060405180910390fd5b610dc384600001600181548110610db357fe5b9060005260206000200154610efa565b809350819450505060008460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002811415610e325760018460000181610e2c91906111e5565b50610ef4565b6000846000016001830381548110610e4657fe5b906000526020600020015490508085600001600181548110610e6457fe5b9060005260206000200181905550600182038560000181610e8591906111e5565b50600060019050610ea18183886110749092919063ffffffff16565b905080866001016000610eb3856111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505b50915091565b600080821973ffffffffffffffffffffffffffffffffffffffff811692508060a01c915050915091565b60008160a01b8373ffffffffffffffffffffffffffffffffffffffff161719905092915050565b60008290506001811461106d5760008460000160028381610f6857fe5b0481548110610f7357fe5b906000526020600020015490505b8281101561106b5782818660000160028581610f9957fe5b0481548110610fa457fe5b906000526020600020016000886000018681548110610fbf57fe5b90600052602060002001600084919050558391905055505081856001016000610fe7846111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002828161102f57fe5b04915060018214156110405761106b565b846000016002838161104e57fe5b048154811061105957fe5b90600052602060002001549050610f81565b505b9392505050565b600082905060008460000180549050905060006001820390505b816002840210156111bb57600060028402905060008760000182815481106110b257fe5b9060005260206000200154905060008284111561110a5760008960000160018501815481106110dd57fe5b906000526020600020015490508083101561110057809150600184019350611104565b8291505b5061110e565b8190505b8087111561111e575050506111bb565b80878a600001888154811061112f57fe5b9060005260206000200160008c600001878154811061114a57fe5b90600052602060002001600084919050558391905055505085896001016000611172846111c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082955050505061108e565b50509392505050565b600073ffffffffffffffffffffffffffffffffffffffff8219169050919050565b81548183558181111561120c5781836000526020600020918201910161120b9190611211565b5b505050565b61123391905b8082111561122f576000816000905550600101611217565b5090565b90565b60008160000180549050146112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f616c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b80600001600090806001815401808255809150509060018203906000526020600020016000909192909190915055505056fea265627a7a72305820aa7488443deddaf81def4253f723399c7a57c76480575c0ce76d35bb26279f4564736f6c634300050a0032608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061017c806100606000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806361da14391461003b578063e2e52ec11461007d575b600080fd5b6100676004803603602081101561005157600080fd5b81019080803590602001909291905050506100b5565b6040518082815260200191505060405180910390f35b6100b36004803603604081101561009357600080fd5b8101908080359060200190929190803590602001909291905050506100d2565b005b600060016000838152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461012b57600080fd5b806001600084815260200190815260200160002081905550505056fea265627a7a72305820838c40e8544fd57690fa2fcf0958553f59bdf1d1ebb5792ea61fb8929ca9679764736f6c634300050a00324f6e6c79206f6e65206f66207468652034323020746f7020686f6c64657273206d6179207261696420746865207374617368216e6f20686f6c646572732077686974656c697374656420666f72206c6f7474657279a265627a7a723058200d5a1e4888cf5ae6d37478eaa75fa6bd7e038bedac38647aa664b870bef8792264736f6c634300050a0032

Deployed Bytecode Sourcemap

16710:13169:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16710:13169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17700:42;;;:::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;17700:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29310:176;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29310:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28136:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28136:112:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28911:213;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28911:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;408:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;408:134:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18127:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18127:43:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17281:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18488:475;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18488:475:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29494:184;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29494:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17794:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19181:176;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19181:176:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;19021:152;;;:::i;:::-;;18421:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18075:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18075:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18396:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28256:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17407:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20900:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20900:105:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21056:503;;;:::i;:::-;;26890:303;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26890:303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18307:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27372:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27372:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28649:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28649:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27940:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17903:50;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17903:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28479:124;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28479:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29686:190;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29686:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;94:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17960:48;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17960:48:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17749:38;;;:::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;17749:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18354:16;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26500:184;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26500:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29132:170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29132:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28360:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28360:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17463:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18250:48;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18250:48:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28766:137;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28766:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27201:163;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27201:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17524:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17587:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28039:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26692:190;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26692:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17700:42;;;;;;;;;;;;;;;;;;;:::o;29310:176::-;29383:4;29400:56;29414:10;29426;29438:3;29443:6;29451:4;29400:13;:56::i;:::-;29474:4;29467:11;;29310:176;;;;:::o;28136:112::-;28190:7;28199;28226:4;;;;;;;;;;;:10;;;28237:2;28226:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28226:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28226:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28226:14:0;;;;;;;;;;;;;;;;;;;;;;;;;28219:21;;;;28136:112;;;:::o;28911:213::-;28980:4;29023:8;29002:38;;29011:10;29002:38;;;29033:6;29002:38;;;;;;;;;;;;;;;;;;29051:43;29065:10;29077:8;29087:6;29051:13;:43::i;:::-;29112:4;29105:11;;28911:213;;;;:::o;408:134::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;477:32;495:5;;;;;;;;;;;502:6;477:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;528:6;520:5;;:14;;;;;;;;;;;;;;;;;;408:134;:::o;18127:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;17281:49::-;;;;:::o;18488:475::-;18571:6;;;;;;;;;;;18570:7;18563:15;;;;18598:4;18589:6;;:13;;;;;;;;;;;;;;;;;;18673:1;18648:27;;18656:4;;;;;;;;;;;18648:27;;;18641:35;;;;18720:10;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18720:10:0;18713:4;;:17;;;;;;;;;;;;;;;;;;18847:3;18826:38;;18843:1;18826:38;;;18852:11;;18826:38;;;;;;;;;;;;;;;;;;18875:29;18887:3;18892:11;;18875;:29::i;:::-;18936:19;:17;:19::i;:::-;18917:16;:38;;;;18488:475;:::o;29494:184::-;29579:4;29596:52;29610:10;29622:5;29629:3;29634:6;29642:5;29596:13;:52::i;:::-;29666:4;29659:11;;29494:184;;;;;:::o;17794:35::-;17827:2;17794:35;:::o;19181:176::-;19262:5;;;;;;;;;;;19248:19;;:10;:19;;;:47;;;;19285:10;;;;;;;;;;;19271:24;;:10;:24;;;19248:47;19240:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19344:5;19331:10;;:18;;;;;;;;;;;;;;;;;;19181:176;:::o;19021:152::-;19082:5;;;;;;;;;;;19068:19;;:10;:19;;;:47;;;;19105:10;;;;;;;;;;;19091:24;;:10;:24;;;19068:47;19060:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19160:5;19151:6;;:14;;;;;;;;;;;;;;;;;;19021:152::o;18421:31::-;;;;:::o;18075:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;18396:18::-;;;;;;;;;;;;;:::o;28256:96::-;28298:7;28307;28334:4;;;;;;;;;;;:8;;;:10;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28334:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28334:10:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28334:10:0;;;;;;;;;;;;;;;;;;;;;;;;;28327:17;;;;28256:96;;:::o;17407:41::-;17445:3;17407:41;:::o;20900:105::-;20959:4;20983:14;20991:5;20983:7;:14::i;:::-;20976:21;;20900:105;;;:::o;21056:503::-;21115:5;21105:15;;:6;;;;;;;;;;;:15;;;:39;;;;21139:5;;;;;;;;;;;21125:19;;:10;:19;;;21105:39;:67;;;;21162:10;;;;;;;;;;;21148:24;;:10;:24;;;21105:67;21097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21224:19;21232:10;21224:7;:19::i;:::-;21216:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21310:18;21331:19;:17;:19::i;:::-;21310:40;;21413:16;;21400:10;:29;21392:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21495:23;21516:1;21495:16;;:20;;:23;;;;:::i;:::-;21476:16;:42;;;;21529:22;21540:10;21529;:22::i;:::-;21056:503;:::o;26890:303::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26990;27012:5;27019:12;26990:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27069:12;27043:16;:23;27060:5;27043:23;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;27096:12;27092:52;;;27123:4;;;;;;;;;;;:11;;;27135:5;27142:1;27123:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27123:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27123:21:0;;;;27092:52;26890:303;;:::o;18307:25::-;;;;;;;;;;;;;:::o;27372:169::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27463:30;27481:5;27488:4;27463:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;27529:4;27504:15;:22;27520:5;27504:22;;;;;;;;;;;;;;;:29;;;;27372:169;;:::o;28649:109::-;28706:7;28733:17;28744:5;28733:10;:17::i;:::-;28726:24;;28649:109;;;:::o;27940:91::-;27982:7;28009:4;;;;;;;;;;;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28009:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28009:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28009:14:0;;;;;;;;;;;;;;;;28002:21;;27940:91;:::o;17903:50::-;;;;;;;;;;;;;;;;;:::o;28479:124::-;28549:7;28576:19;28583:5;28590:4;28576:6;:19::i;:::-;28569:26;;28479:124;;;;:::o;29686:190::-;29778:4;29795:51;29809:10;29821:5;29828:3;29833:6;29841:4;29795:13;:51::i;:::-;29864:4;29857:11;;29686:190;;;;;:::o;94:20::-;;;;;;;;;;;;;:::o;17960:48::-;;;;;;;;;;;;;;;;;:::o;17749:38::-;;;;;;;;;;;;;;;;;;;:::o;18354:16::-;;;;;;;;;;;;;:::o;26500:184::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26595:37;26612:5;26619:12;26595:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26664:12;26643:11;:18;26655:5;26643:18;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;26500:184;;:::o;29132:170::-;29198:4;29215:57;29229:10;29241;29253:3;29258:6;29266:5;29215:13;:57::i;:::-;29290:4;29283:11;;29132:170;;;;:::o;28360:111::-;28417:7;28444:4;;;;;;;;;;;:12;;;28457:5;28444:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28444:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28444:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28444:19:0;;;;;;;;;;;;;;;;28437:26;;28360:111;;;:::o;17463:46::-;17507:2;17463:46;:::o;18250:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;28766:137::-;28841:7;28868:27;28879:5;28886:8;28868:10;:27::i;:::-;28861:34;;28766:137;;;;:::o;27201:163::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27290:28;27306:5;27313:4;27290:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;27352:4;27329:13;:20;27343:5;27329:20;;;;;;;;;;;;;;;:27;;;;27201:163;;:::o;17524:36::-;;;;:::o;17587:43::-;;;;:::o;28039:89::-;28082:7;28109:4;;;;;;;;;;;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28109:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28109:11:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28109:11:0;;;;;;;;;;;;;;;;28102:18;;28039:89;:::o;26692:190::-;360:5;;;;;;;;;;;346:19;;:10;:19;;;338:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26789:39;26808:5;26815:12;26789:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26862:12;26839:13;:20;26853:5;26839:20;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;26692:190;;:::o;23451:3003::-;23594:1;23579:17;;:3;:17;;;;23571:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23658:5;23648:15;;:6;;;;;;;;;;;:15;;;:39;;;;23682:5;;;;;;;;;;;23668:19;;:10;:19;;;23648:39;:67;;;;23705:10;;;;;;;;;;;23691:24;;:10;:24;;;23648:67;23640:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23854:1;23844:6;:11;23840:93;;;23893:3;23877:23;;23886:5;23877:23;;;23898:1;23877:23;;;;;;;;;;;;;;;;;;23915:7;;23840:93;23977:19;23999:17;24010:5;23999:10;:17::i;:::-;23977:39;;24050:6;24035:11;:21;;24027:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24145:9;24136:18;;:5;:18;;;24132:480;;24214:21;24238:28;24249:5;24256:9;24238:10;:28::i;:::-;24214:52;;24375:2;24353:13;:25;24349:252;;24477:6;24460:13;:23;;24452:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24527:58;24541:5;24548:9;24559:25;24577:6;24559:13;:17;;:25;;;;:::i;:::-;24527:13;:58::i;:::-;24349:252;24132:480;;24705:18;24726:6;24705:27;;24743:18;24764:1;24743:22;;24776:12;24791:1;24776:16;;24839:43;24851:5;24858:23;24874:6;24858:11;:15;;:23;;;;:::i;:::-;24839:11;:43::i;:::-;25026:7;:46;;;;25038:34;25061:5;25068:3;25038:22;:34::i;:::-;25037:35;25026:46;25022:1151;;;25089:11;17445:3;25089:25;;25159:1;25133:15;:22;25149:5;25133:22;;;;;;;;;;;;;;;;:27;25129:78;;25185:15;:22;25201:5;25185:22;;;;;;;;;;;;;;;;25179:28;;25129:78;25248:1;25226:13;:18;25240:3;25226:18;;;;;;;;;;;;;;;;:23;;:51;;;;;25274:3;25253:13;:18;25267:3;25253:18;;;;;;;;;;;;;;;;:24;25226:51;25222:114;;;25318:13;:18;25332:3;25318:18;;;;;;;;;;;;;;;;25312:24;;25222:114;25498:20;25514:3;25498:6;:15;;:20;;;;:::i;:::-;25485:33;;25550:1;25540:6;:11;:28;;25558:10;25540:28;;;25554:1;25540:28;25533:35;;25649:36;25664:20;25679:4;25664:10;:14;;:20;;;;:::i;:::-;25649:10;:14;;:36;;;;:::i;:::-;25636:49;;25784:27;25800:10;25784:11;;:15;;:27;;;;:::i;:::-;25770:11;:41;;;;25855:1;25831:39;;25840:5;25831:39;;;25859:10;25831:39;;;;;;;;;;;;;;;;;;25955:19;25985:4;25955:35;;26048:59;26060:11;26073:33;26101:4;26073:23;26084:11;26073:10;:23::i;:::-;:27;;:33;;;;:::i;:::-;26048:11;:59::i;:::-;26143:11;26127:34;;26136:5;26127:34;;;26156:4;26127:34;;;;;;;;;;;;;;;;;;25022:1151;;;26294:6;26254:36;26279:10;26254:20;26269:4;26254:10;:14;;:20;;;;:::i;:::-;:24;;:36;;;;:::i;:::-;:46;26247:54;;;;26349:49;26361:3;26366:31;26386:10;26366:15;26377:3;26366:10;:15::i;:::-;:19;;:31;;;;:::i;:::-;26349:11;:49::i;:::-;26430:3;26414:32;;26423:5;26414:32;;;26435:10;26414:32;;;;;;;;;;;;;;;;;;23451:3003;;;;;;;;;;:::o;20087:188::-;20179:88;20239:8;20209:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20209:39:0;;;20199:50;;;;;;20259:6;20251:15;;20179:13;20186:5;20179:6;:13::i;:::-;:19;;:88;;;;;:::i;:::-;20087:188;;;:::o;20463:374::-;20561:1;20544:19;;:5;:19;;;;20537:27;;;;20601:51;17378:20;;;;;;;;;;;;;;;;;;;20642:8;20634:17;;20601:13;20608:5;20601:6;:13::i;:::-;:19;;:51;;;;;:::i;:::-;20737:16;:23;20754:5;20737:23;;;;;;;;;;;;;;;;;;;;;;;;;20736:24;:50;;;;;20781:4;20764:22;;:5;:22;;;;20736:50;20732:97;;;20801:4;;;;;;;;;;;:11;;;20813:5;20820:8;20801:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20801:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20801:28:0;;;;20732:97;20463:374;;:::o;27628:138::-;27679:7;27706:52;27744:13;;27706:33;27726:12;;27706:15;:19;;:33;;;;:::i;:::-;:37;;:52;;;;:::i;:::-;27699:59;;27628:138;:::o;27821:111::-;27876:4;27923:1;27900:4;;;;;;;;;;;:12;;;27913:5;27900:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27900:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27900:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27900:19:0;;;;;;;;;;;;;;;;:24;;27893:31;;27821:111;;;:::o;3607:164::-;3665:7;3685:9;3701:1;3697;:5;3685:17;;3726:1;3721;:6;;3713:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3762:1;3755:8;;;3607:164;;;;:::o;22610:833::-;22705:19;22735:4;22705:35;;22751:21;22775:23;22786:11;22775:10;:23::i;:::-;22751:47;;22809:14;22826:33;22838:5;22845:13;22826:11;:33::i;:::-;22809:50;;22895:1;22878:13;:18;;22870:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22959:20;22982:41;17507:2;22982:13;:22;;:41;;;;:::i;:::-;22959:64;;23033:55;23045:5;23052:35;23074:12;23052:17;23063:5;23052:10;:17::i;:::-;:21;;:35;;;;:::i;:::-;23033:11;:55::i;:::-;23126:5;23104:42;;23113:11;23104:42;;;23133:12;23104:42;;;;;;;;;;;;;;;;;;23198:23;23224:31;23242:12;23224:13;:17;;:31;;;;:::i;:::-;23198:57;;23266:60;23278:6;23286:39;23309:15;23286:18;23297:6;23286:10;:18::i;:::-;:22;;:39;;;;:::i;:::-;23266:11;:60::i;:::-;23349:6;23342:31;;;23357:15;23342:31;;;;;;;;;;;;;;;;;;23411:6;23389:46;;23398:11;23389:46;;;23419:15;23389:46;;;;;;;;;;;;;;;;;;22610:833;;;;;;:::o;19548:133::-;19606:7;19641:31;17378:20;;;;;;;;;;;;;;;;;;;19641:13;19648:5;19641:6;:13::i;:::-;:18;;:31;;;;:::i;:::-;19633:40;;19626:47;;19548:133;;;:::o;19887:174::-;19955:7;19990:62;20045:4;20019:31;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20019:31:0;;;20009:42;;;;;;19990:13;19997:5;19990:6;:13::i;:::-;:18;;:62;;;;:::i;:::-;19982:71;;19975:78;;19887:174;;;;:::o;19689:190::-;19765:7;19800:70;19859:8;19829:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;19829:39:0;;;19819:50;;;;;;19800:13;19807:5;19800:6;:13::i;:::-;:18;;:70;;;;:::i;:::-;19792:79;;19785:86;;19689:190;;;;:::o;3779:141::-;3837:7;3870:1;3865;:6;;3857:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3911:1;3907;:5;3900:12;;3779:141;;;;:::o;21614:153::-;21697:4;21721:13;:20;21735:5;21721:20;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;21743:11;:16;21755:3;21743:16;;;;;;;;;;;;;;;;;;;;;;;;;21721:38;21714:45;;21614:153;;;;:::o;4312:232::-;4375:7;4408:1;4403;:6;;4395:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4436:9;4452:1;4448;:5;;;;;;4436:17;;4477:1;4472;4468;:5;;;;;;:10;4464:52;;4503:1;4499;:5;4495:9;;4464:52;4535:1;4528:8;;;4312:232;;;;:::o;19436:104::-;19486:7;19529:1;19521:10;;19513:19;;19506:26;;19436:104;;;:::o;2318:569::-;2434:17;2466:21;2479:7;2466:12;:21::i;:::-;2434:54;;2504:37;2534:5;2504:21;:37::i;:::-;2499:86;;2558:15;2565:7;2558:6;:15::i;:::-;2499:86;2638:12;2664:5;2656:19;;2731:5;:11;;;:20;;;;2770:4;2793:6;2690:124;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2690:124:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;2690:124:0;2656:169;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2656:169:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;2637:188:0;;;2846:7;2838:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2318:569;;;;;:::o;4165:139::-;4223:7;4256:1;4251;:6;;4243:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4295:1;4291;:5;;;;;;4284:12;;4165:139;;;;:::o;22005:597::-;22075:7;22140:17;22160:29;22182:6;22160:21;:29::i;:::-;22140:49;;22254:13;22270:24;22277:5;22284:9;22270:6;:24::i;:::-;22254:40;;22305:38;22315:5;22322:9;22341:1;22333:5;:9;22305;:38::i;:::-;22387:13;22403:4;;;;;;;;;;;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22403:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22403:11:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22403:11:0;;;;;;;;;;;;;;;;22387:27;;22442:1;22433:5;:10;;22425:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22535:4;;;;;;;;;;;:14;;;22550:43;22558:5;22565;22572:9;22591:1;22583:5;:9;22550:7;:43::i;:::-;22535:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22535:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22535:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22535:59:0;;;;;;;;;;;;;;;;22528:66;;;;;22005:597;;;;:::o;2895:610::-;2988:7;3008:17;3040:21;3053:7;3040:12;:21::i;:::-;3008:54;;3078:37;3108:5;3078:21;:37::i;:::-;3073:88;;3147:1;3139:10;;3132:17;;;;;3073:88;3214:12;3228:17;3257:5;3249:25;;3330:5;:10;;;:19;;;;3368:4;3289:98;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3289:98:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;3289:98:0;3249:149;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3249:149:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3213:185:0;;;;3419:7;3411:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3481:4;3470:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3470:27:0;;;;;;;;;;;;;;;;3463:34;;;;;2895:610;;;;;:::o;1625:439::-;1686:7;1841:4;1836:10;;1881:4;1913:7;1957:30;;;;;;;;:::i;:::-;41:4:-1;34:5;30:16;25:3;21:26;14:5;7:41;87:2;83:7;78:2;73:3;69:12;65:26;61:2;54:38;1957:30:0;1947:41;;;;;;1793:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1793:218:0;;;1761:269;;;;;;1735:310;;1706:350;;1625:439;;;:::o;1178:323::-;1236:4;1253:16;1355:5;1343:18;1331:30;;1400:1;1392:10;;1380:8;:22;;:113;;;;;1426:66;1418:75;;1406:8;:87;;1380:113;1373:120;;;1178:323;;;:::o;2072:238::-;2124:21;2148:30;;;;;;;;:::i;:::-;41:4:-1;34:5;30:16;25:3;21:26;14:5;7:41;87:2;83:7;78:2;73:3;69:12;65:26;61:2;54:38;2148:30:0;2124:54;;2292:7;2281:8;2275:15;2268:4;2258:8;2254:19;2251:1;2243:57;2239:62;2237:66;;:::o;4950:270::-;5014:7;5033:15;5056:2;5033:26;;5070:12;5085:5;5070:20;;5103:83;5129:2;5121:10;;;;;;;;;5146:9;;;;;;;5183:1;5175:4;:9;;5103:83;;5205:7;5198:14;;;;4950:270;;;:::o;20283:172::-;20367:80;20423:4;20397:31;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20397:31:0;;;20387:42;;;;;;20439:6;20431:15;;20367:13;20374:5;20367:6;:13::i;:::-;:19;;:80;;;;;:::i;:::-;20283:172;;;:::o;21775:222::-;21868:7;21888:12;21938:3;21943;21948;21921:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21921:31:0;;;21911:42;;;;;;21903:51;;21888:66;;21987:1;21980:4;:8;21972:4;:17;;;;;;21965:24;;;21775:222;;;;;;:::o;16710:13169::-;;;;;;;;:::o;:::-;;;;;;;;:::o

Swarm Source

bzzr://0d5a1e4888cf5ae6d37478eaa75fa6bd7e038bedac38647aa664b870bef87922
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.