ETH Price: $2,687.83 (-4.91%)

Token

HEXPOOL (POOL)
 

Overview

Max Total Supply

116,799.365 POOL

Holders

102

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
100 POOL

Value
$0.00
0xa07936123bB2472042A488d5A98A8ed356a003aE
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:
HEXPOOL

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: HEXPOOL.sol
//HEXPOOL.sol
//
//

pragma solidity ^0.5.13;

import "./SafeMath.sol";
import "./IERC20.sol";
import "./HEX.sol";

////////////////////////////////////////////////
////////////////////EVENTS/////////////////////
//////////////////////////////////////////////
contract PoolEvents {

//when a user enters a pool
    event PoolEntry(
        address indexed user,//msg.sender
        uint indexed heartValue,
        uint indexed entryId,
        uint poolId
    );
    
//when a user exits a pool
    event PoolExit(
        address indexed user,//msg.sender
        uint indexed heartValue,
        uint indexed entryId,
        uint poolId
    );

//when a pool starts staking
    event PoolStartStake(
        uint heartValue,//always 150m
        uint indexed dayLength,
        uint indexed poolId,
        uint hexStakeId
    );

//when a pool ends stake
    event PoolEndStake(
        uint heartValue,//always 150m
        uint indexed stakeProfit,
        uint indexed dayLength,
        uint indexed poolId,
        uint hexStakeId
    );

//when an ended stakes rewards are withdrawn
    event Withdrawal(
        address indexed user,
        uint indexed heartValue
    );
}

contract TokenEvents {

//when a user freezes tokens
    event TokenFreeze(
        address indexed user,
        uint indexed value
    );

//when a user unfreezes tokens
    event TokenUnfreeze(
        address indexed user,
        uint indexed value
    );
}

//////////////////////////////////////
//////////POOL TOKEN CONTRACT////////
////////////////////////////////////
contract POOL is IERC20, TokenEvents{

    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    bool internal mintBlock;//stops any more tokens ever being minted once _totalSupply reaches _maxSupply - allows for burn rate to take full effect
    uint256 internal _maxSupply = 10000000000000000000;// max supply @ 100B
    uint256 internal _totalSupply;
    string public constant name = "HEXPOOL";
    string public constant symbol = "POOL";
    uint public constant decimals = 8;

    //BUDDY SYSTEM
    uint public buddyDiv;
    //FREEZING
    uint public totalFrozen;
    mapping (address => uint) public tokenFrozenBalances;//balance of POOL frozen mapped by user

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        //1% burn rate
        uint burnt = amount.div(100);
        uint newAmt = amount.sub(burnt);
        _balances[sender] = _balances[sender].sub(newAmt, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(newAmt);
        _burn(sender, burnt);
        emit Transfer(sender, recipient, newAmt);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        uint256 amt = amount;
        require(account != address(0), "ERC20: mint to the zero address");
        if(!mintBlock){
            if(_totalSupply < _maxSupply){
                if(_totalSupply.add(amt) > _maxSupply){
                    amt = _maxSupply.sub(_totalSupply);
                    _totalSupply = _maxSupply;
                    mintBlock = true;
                }
                else{
                    _totalSupply = _totalSupply.add(amt);
                }
                _balances[account] = _balances[account].add(amt);
                emit Transfer(address(0), account, amt);
            }
        }
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
    }

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    //mint POOL to msg.sender
    function mintPool(uint hearts)
        internal
        returns(bool)
    {
        uint amt = hearts.div(100);
        address minter = msg.sender;
        _mint(minter, amt);//mint POOL - 1% of total heart value before fees @ 10 POOL for 1000 HEX
        return true;
    }

    ////////////////////////////////////////////////////////
    /////////////////PUBLIC FACING - POOL CONTROL//////////
    //////////////////////////////////////////////////////

    //freeze POOL to contract
    function FreezeTokens(uint amt)
        public
    {
        require(amt > 0, "zero input");
        require(tokenBalance() >= amt, "Error: insufficient balance");//ensure user has enough funds
        //update balances (allow for 1% burn)
        tokenFrozenBalances[msg.sender] = tokenFrozenBalances[msg.sender].add(amt.sub(amt.div(100)));
        totalFrozen = totalFrozen.add(amt.sub(amt.div(100)));
        _transfer(msg.sender, address(this), amt);//make transfer and burn
        emit TokenFreeze(msg.sender, amt);
    }

    //unfreeze POOL from contract
    function UnfreezeTokens(uint amt)
        public
    {
        require(amt > 0, "zero input");
        require(tokenFrozenBalances[msg.sender] >= amt,"Error: unsufficient frozen balance");//ensure user has enough frozen funds
        tokenFrozenBalances[msg.sender] = tokenFrozenBalances[msg.sender].sub(amt);//update balances
        totalFrozen = totalFrozen.sub(amt);
        _transfer(address(this), msg.sender, amt);//make transfer and burn
        emit TokenUnfreeze(msg.sender, amt);
    }

    ///////////////////////////////
    ////////VIEW ONLY//////////////
    ///////////////////////////////

    //total POOL frozen in contract
    function totalFrozenTokenBalance()
        public
        view
        returns (uint256)
    {
        return totalFrozen;
    }

    //pool balance of caller
    function tokenBalance()
        public
        view
        returns (uint256)
    {
        return balanceOf(msg.sender);
    }
}

contract HEXPOOL is POOL, PoolEvents {

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////CONTRACT SETUP///////////////////////
    ////////////////////////////////////////////////////////////////////
    using SafeMath for uint256;

    HEX hexInterface;

    //HEXPOOL
    address payable constant hexAddress = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;

    address payable devAddress;//set in constructor
    address payable constant devAddress2 = 0xD30BC4859A79852157211E6db19dE159673a67E2;

    uint constant fee = 100; //1%;
    uint constant devFee = 2; // 50% of 1% @ 0.5%;
    uint constant devFee2 = 4; // 25% of 1% @ 0.25%;
    uint constant refFee = 4; // 25% of 1% @ 0.25%; - 100% goes to buddyDiv if no ref, 50% if ref;

    uint public last_pool_entry_id;// pool entry id
    uint public last_pool_id;// pool id
    uint public last_stake_id;// stake id

    uint public minEntryHearts;//minimum entry value

    mapping (address => UserInfo) public users;
    mapping (uint => EntryInfo) public entries;
    mapping (uint => PoolInfo) public pools;

    mapping (uint => uint) internal poolUserCount;
    mapping (uint => uint[]) internal poolEntryIds;
    mapping (address => uint[]) internal userEntryIds;

    bool locked;
    bool ready;

    struct UserInfo {
        uint     totalHeartsEntered;
        address  userAddress;
    }

    struct EntryInfo {
        uint     heartValue;
        uint     poolId;
        uint     entryId;
        address payable userAddress;
        address payable refferer;
    }

    struct PoolInfo {
        uint     poolStakeThreshold;//hearts
        uint     poolStakeDayLength;
        uint     poolValue;//hearts
        uint     poolId;
        uint     poolType;
        mapping  (address => bool) poolParticipant;
        mapping  (address => uint) userHeartValue;
        uint     stakeId;
        uint40   hexStakeId;
        bool     isStaking;
        bool     isActive;
        uint256  poolStakeStartTimestamp;
        uint     stakeValue;
        uint     stakeProfit;
        bool     stakeEnded;
    }

    modifier onlyOwner {
        require(msg.sender == devAddress, "notOwner");
        _;
    }

    modifier canEnter(uint id, uint hearts) {
        require(isPoolActive(id), "cannot enter, poolId not active");
        require(id <= last_pool_id, "Error: poolId out of range");
        require(hearts > minEntryHearts, "Error: value must be greater than minEntryHearts");
        _;
    }

    modifier isReady {
        require(ready, "cannot enter, pools not initialized");
        _;
    }

    modifier synchronized {
        require(!locked, "Sync lock");
        locked = true;
        _;
        locked = false;
    }

    constructor() public {
        devAddress = msg.sender;
        hexInterface = HEX(hexAddress);
        initializePools();
    }

    function() external payable {
        require(false); //refunds any eth accidently sent to contract;
    }

    function initializePools()
        internal
        onlyOwner
    {
        require(!ready, "cannot reinitialize");
        //create one of each pool on deployment
        for(uint i = 0; i < 3; i++){
            newPool(i, 0, address(0));
        }
        setMinEntry(100000000000);//1000 HEX @ contract launch, may change dependant on price.
        ready = true;
    }

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////HEXPOOL CORE//////////////////////////
    ////////////////////////////////////////////////////////////////////

    //creates a new pool - called on initializePools and when a poolValue reachs its poolStakeThreshold
    function newPool(uint poolType, uint remainderHearts, address payable ref)
       internal
       returns (bool)
    {
        uint threshold;
        uint dayLength;

        if(poolType == 0){
            threshold = 15000000000000000;//150M BPB @ 10% - 36 DAYS
            dayLength = 36;//~1 month
        }
        else if(poolType == 1){
            threshold = 15000000000000000;//150M BPB @ 10% - 365 DAYS
            dayLength = 365;//1 year
        }
        else if(poolType == 2){
            threshold = 15000000000000000;//150M BPB @ 10% - 3650 DAYS
            dayLength = 3650;//10 years (max rewards)
        }
        else{
            revert("invalid poolType");
        }
        uint id = _next_pool_id();
        PoolInfo storage pool = pools[id];
        pool.poolStakeThreshold = threshold;//hearts
        pool.poolStakeDayLength = dayLength;
        pool.poolValue = remainderHearts;//hearts
        pool.poolId = id;
        pool.poolType = poolType;
        pool.isActive = true;
        if(remainderHearts > 0){//update pool, user and entry data as the new pool now has 1 participant
            poolUserCount[id]++;
            pool.poolParticipant[msg.sender] = true;
            pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].add(remainderHearts);
            //user info
            updateUserData(remainderHearts);
            //entry info
            updateEntryData(remainderHearts, id, ref);
        }
        pools[id] = pool;
        return true;
    }

    //enters pool - transfers HEX from user to contract - approval needed
    function enterPool(uint hearts, uint poolId, address payable ref)
        internal
        returns(bool)
    {
        PoolInfo storage pool = pools[poolId];
        require(hearts <= pool.poolStakeThreshold, "amount over threshold - only 1 new pool to be created per tx");
        require(!pool.isStaking, "pool is staking");
        //calc amounts
        uint _fee = hearts.div(fee);
        uint _devFee = _fee.div(devFee);
        uint _devFee2 = _fee.div(devFee2);
        uint _refFee = _fee.div(refFee);
        uint _hearts = hearts.sub(_fee);
        pool.poolValue = pool.poolValue.add(_hearts);//increment pool value with heart value after fees
        if(!pool.poolParticipant[msg.sender]){
            pool.poolParticipant[msg.sender] = true;
            poolUserCount[poolId]++;
        }
         //TOTAL amount of hearts this user has input in THIS pool after fees (EntryInfo for individual pool entries)
        pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].add(_hearts);
        //buddy divs
        if(buddyDiv > 0){
            require(hexInterface.transfer(msg.sender, buddyDiv), "Transfer failed");//send hex as buddy div to user
        }
        if(ref == address(0)){//no ref
            //hex refFee to buddyDivs
            buddyDiv = _refFee;
        }
        else{//ref
            //hex refFee to ref
            buddyDiv = _refFee.div(2);
            require(hexInterface.transferFrom(msg.sender, ref, _refFee.div(2)), "Ref transfer failed");//send hex to refferer
        }
        //send
        require(hexInterface.transferFrom(msg.sender, address(this), _hearts.add(buddyDiv)), "Transfer failed");//send hex from user to contract + buddyDivs to remain in contract
        require(hexInterface.transferFrom(msg.sender, devAddress, _devFee), "Dev1 transfer failed");//send hex to dev
        require(hexInterface.transferFrom(msg.sender, devAddress2, _devFee2), "Dev2 transfer failed");//send hex to dev2
        //check for pool overflow
        if(pool.poolValue > pool.poolStakeThreshold){
            uint remainderHearts = pool.poolValue.sub(pool.poolStakeThreshold);//get remainder
            //user info
            updateUserData(_hearts.sub(remainderHearts));//remainder to be rolled to next pool
            //entry info
            updateEntryData(_hearts.sub(remainderHearts), pool.poolId, ref);//remainder to be rolled to next pool
            pool.poolValue = pool.poolStakeThreshold;//set as max
             //Back out the remainder value that is spilling into the next pool
            pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].sub(remainderHearts);
            require(startStake(poolId, pool), "Error: could not start stake");
            require(newPool(pool.poolType, remainderHearts, ref), "Error: could not create new pool");//create new pool with remainder
        }
        else if(pool.poolValue == pool.poolStakeThreshold){
            //user info
            updateUserData(_hearts);
            //entry info
            updateEntryData(_hearts, pool.poolId, ref);
            require(startStake(poolId, pool), "Error: could not start stake");
            require(newPool(pool.poolType, 0, ref), "Error: could not create new pool");//new pool no remainder
        }
        else{
            //user info
            updateUserData(_hearts);
            //entry info
            updateEntryData(_hearts, pool.poolId, ref);
        }
        //mint bonus POOL tokens relative to HEX amount before fees
        require(mintPool(hearts), "Error: could not mint tokens");
        return true;
    }

    //starts staking poolStakeThreshold to the HEX contract
    function startStake(uint poolId, PoolInfo storage pool)
        internal
        returns (bool)
    {
        require(pool.poolValue == pool.poolStakeThreshold, "Stake amount incorrect");
        uint newStakedHearts = pool.poolStakeThreshold;
        uint newStakedDays = pool.poolStakeDayLength;
        hexInterface.stakeStart(newStakedHearts, newStakedDays);
        uint hexStakeIndex = hexInterface.stakeCount(address(this)).sub(1);//get the most recent stakeIndex
        SStore memory stake = getStakeByIndex(address(this), hexStakeIndex); //get stake from address and stakeindex
        //set pool stake id info
        pool.hexStakeId = stake.stakeId;
        pool.stakeId = last_stake_id;
        pool.poolStakeStartTimestamp = now;
        pool.isActive = false;
        pool.isStaking = true;
        _next_stake_id();
        emit PoolStartStake(
            newStakedHearts,
            newStakedDays,
            poolId,
            stake.stakeId
        );
        return true;
    }

    //end a pool stake - cannot emergency unstake - needs testing
    function endStake(uint poolId)
        internal
        returns (bool)
    {
        require(poolId <= last_pool_id, "Error: poolId out of range");
        PoolInfo storage pool = pools[poolId];
        require(pool.isStaking, "Error: pool is not yet staked, or has already ended staking");
        require(isPoolStakeFinished(poolId), "Error: cannot early unstake");

        uint256 oldBalance = getContractBalance();
        //find the stake index then
        //end stake
        hexInterface.stakeEnd(getStakeIndexById(address(this), pool.hexStakeId), pool.hexStakeId);
        pool.isStaking = false;
        pool.stakeEnded = true;
        //calc stakeValue and stakeProfit
        uint256 stakeValue = getContractBalance().sub(oldBalance);
        pool.stakeValue = stakeValue;
        pool.stakeProfit = stakeValue.sub(pool.poolStakeThreshold);
        emit PoolEndStake(
            pool.stakeProfit,
            pool.poolValue,
            pool.poolStakeDayLength,
            pool.poolId,
            pool.hexStakeId
        );
        return true;
    }

    //withdraws any staking rewards - or ends a stake if finished but not yet unstaked
    function withdrawPoolRewards(uint poolId)
        internal
        returns(bool)
    {
        PoolInfo storage pool = pools[poolId];
        require(pool.poolValue > 0, "pool rewards have been drained");
        require(pools[poolId].userHeartValue[msg.sender] > 0, "you have no share in this pool");
        if(!pool.stakeEnded){
            endStake(poolId);
        }
        uint rewards = getWithdrawableRewards(poolId);//calculate pool share
        pool.poolValue = pool.poolValue.sub(pool.userHeartValue[msg.sender]);//reduce pool value
        pool.userHeartValue[msg.sender] = 0;//user has withdrawn rewards from pool
        if(pool.poolValue == 0){
            delete pools[poolId];//delete pool if empty
        }
        require(hexInterface.transfer(msg.sender, rewards), "Transfer failed");//transfer users share
        emit Withdrawal(msg.sender, rewards);
        return true;
    }

    //get any withdrawable staking rewards of caller
    function getWithdrawableRewards(uint poolId)
        public
        view
        returns (uint)
    {
        PoolInfo storage pool = pools[poolId];
        require(pool.stakeEnded, "pool stake has not yet finished");
        if(pool.userHeartValue[msg.sender] == 0){
            return 0;
        }
        uint stakeWithdrawable = pool.stakeValue.mul(pool.userHeartValue[msg.sender]).div(pool.poolStakeThreshold);//withdrawable rewards
        return stakeWithdrawable;
    }

    //exits pool of entry by entryId
    function exitPool(uint entryId)
        internal
        returns (bool)
    {
        EntryInfo memory entry = entries[entryId];
        require(msg.sender == entry.userAddress, "not entry owner, or already exited");
        PoolInfo storage pool = pools[entry.poolId];
        require(pool.poolParticipant[msg.sender], "you are not a pool participant");
        require(!pool.isStaking, "pool is staking, cannot exit");
        users[msg.sender].totalHeartsEntered = users[msg.sender].totalHeartsEntered.sub(entry.heartValue);
        pool.poolValue = pool.poolValue.sub(entry.heartValue); //reduce pool value
        pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].sub(entry.heartValue);//reduce users pool share
        //remove user from pool data if 0 pool share
        if(pool.userHeartValue[msg.sender] == 0){
            pool.poolParticipant[msg.sender] = false;
            poolUserCount[entry.poolId]--;
        }
        delete entries[entryId];
        //calc fee amount
        uint _fee = entry.heartValue.div(fee);
        uint _devFee = _fee.div(devFee);
        uint _devFee2 = _fee.div(devFee2);
        uint _refFee = _fee.div(refFee);
        uint _hearts = entry.heartValue.sub(_fee);
        
        if(buddyDiv > 0){
            require(hexInterface.transfer(devAddress, buddyDiv.div(2)), "Transfer failed");//send hex as buddy div to dev1 as penalty for user exiting pool
            require(hexInterface.transfer(devAddress2, buddyDiv.div(2)), "Transfer failed");//send hex as buddy div to dev2 as penalty for user exiting pool
        }
        if(entry.refferer == address(0)){//no ref
            //set new buddyDivs as hex refFee
            buddyDiv = _refFee;
        }
        else{//ref
            //set new buddyDivs as hex refFee / 2
            buddyDiv = _refFee.div(2);
            require(hexInterface.transfer(entry.refferer, _refFee.div(2)), "Ref transfer failed");//send hex to refferer
        }
        //send
        require(hexInterface.transfer(msg.sender, _hearts), "Transfer failed");//send hex from contract to user
        require(hexInterface.transfer(devAddress, _devFee), "Dev1 transfer failed");//send hex to dev
        require(hexInterface.transfer(devAddress2, _devFee2), "Dev2 transfer failed");//send hex to dev2
        //events
        emit PoolExit(
            entry.userAddress,
            entry.heartValue,
            entry.entryId,
            pool.poolId
        );
        return true;
    }

    //updates user data
    function updateUserData(uint hearts)
        internal
    {
        UserInfo storage user = users[msg.sender];
        user.totalHeartsEntered = user.totalHeartsEntered.add(hearts);//total amount of hearts deposited by this user after fees
        user.userAddress = msg.sender;
    }

    //updates entry data
    function updateEntryData(uint hearts, uint poolId, address payable ref)
        internal
    {
        uint _entryID = _next_pool_entry_id();
        userEntryIds[msg.sender].push(_entryID);//update userEntryIds
        poolEntryIds[poolId].push(_entryID);//update poolEntryIds
        EntryInfo memory entry;
        entry.heartValue = hearts;//amount of hearts deposited in this entry after fees
        entry.poolId = poolId;//poolId this entry has deposited to
        entry.entryId = _entryID;
        entry.userAddress = msg.sender;
        entry.refferer = ref;
        entries[_entryID] = entry;//update entry data
        emit PoolEntry(
            entry.userAddress,
            entry.heartValue,
            entry.entryId,
            poolId
        );
    }

    //get next entry id
    function _next_pool_entry_id()
        internal
        returns (uint)
    {
        last_pool_entry_id++;
        return last_pool_entry_id;
    }

    //get next pool id
    function _next_pool_id()
        internal
        returns (uint)
    {
        last_pool_id++;
        return last_pool_id;
    }

    //get next stake id
    function _next_stake_id()
        internal
        returns (uint)
    {
        last_stake_id++;
        return last_stake_id;
    }

    //////////////////////////////////////////////////////////////////
    ////////////////////////PUBLIC FACING HEXPOOL////////////////////
    ////////////////////////////////////////////////////////////////

    //enter any pool that isActive
    function EnterPool(uint _hearts, uint _poolId, address payable _ref)
        public
        canEnter(_poolId, _hearts)
        synchronized
    {
        require(enterPool(_hearts, _poolId, _ref), "Error: could not enter pool");
    }

    //withdraw funds from pool by entryId - pool cannot be already staking
    function ExitPool(uint _entryId)
        public
        synchronized
    {
        require(exitPool(_entryId), "Error: could not exit pool");
    }

    //ends a staked pool
    function EndPoolStake(uint _poolId)
        public
        synchronized
    {
        require(endStake(_poolId), "Error: could not end stake");
    }

    //withdraws HEX staking rewards
    function WithdrawHEX(uint _poolId)
        public
        synchronized
    {
        require(withdrawPoolRewards(_poolId), "Error: could not withdraw rewards");
    }

    //////////////////////////////////////////
    ////////////VIEW ONLY/////////////////////
    //////////////////////////////////////////

    //only an active pool can be entered or exited
    function isPoolActive(uint poolId)
        public
        view
        isReady
        returns(bool)
    {
        return pools[poolId].isActive;
    }

    //
    function isPoolStaking(uint poolId)
        public
        view
        returns(bool)
    {
        return pools[poolId].isStaking;
    }

    //
    function isPoolStakeFinished(uint poolId)
        public
        view
        returns(bool)
    {
        //add 1 to stakeDayLength to account for stake pending time
        return pools[poolId].poolStakeStartTimestamp.add((pools[poolId].poolStakeDayLength.add(1)).mul(86400)) <= now;
    }

    //
    function isPoolStakeEnded(uint poolId)
        public
        view
        returns(bool)
    {
        return pools[poolId].stakeEnded;
    }

    //general user info
    function getUserInfo(address addr)
        public
        view
        returns(
        uint    totalHeartsEntered,
        uint[] memory _entryIds,
        address userAddress
        )
    {
        return(users[addr].totalHeartsEntered, userEntryIds[addr], users[addr].userAddress);
    }

    //general entry info
    function getEntryInfo(uint entryId)
        public
        view
        returns(
        uint     heartValue,
        uint     poolId,
        address payable userAddress,
        address payable refferer
        )
    {
        return(entries[entryId].heartValue, entries[entryId].poolId, entries[entryId].userAddress, entries[entryId].refferer);
    }

    //general pool info
    function getPoolInfo(uint poolId)
        public
        view
        returns(
        uint     poolStakeThreshold,//hearts
        uint     poolStakeDayLength,
        uint     poolValue,//hearts
        uint     poolType,
        bool     isStaking,
        uint256  poolStakeStartTimestamp,
        bool     stakeEnded
        )
    {
        return(
            pools[poolId].poolStakeThreshold,
            pools[poolId].poolStakeDayLength,
            pools[poolId].poolValue,
            pools[poolId].poolType,
            pools[poolId].isStaking,
            pools[poolId].poolStakeStartTimestamp,
            pools[poolId].stakeEnded
            );
    }

    //returns all entryIds of a pool
    function getPoolEntryIds(uint poolId)
        public
        view
        returns(uint[] memory)
    {
        return poolEntryIds[poolId];
    }

    //return vital stake params
    function getPoolStakeInfo(uint poolId)
        public
        view
        returns(uint stakeId, uint hexStakeIndex, uint40 hexStakeId)
    {
        return(pools[poolId].stakeId, getStakeIndexById(address(this), pools[poolId].hexStakeId), pools[poolId].hexStakeId);
    }

    //returns amount of users by address in a pool
    function getPoolUserCount(uint poolId)
        public
        view
        returns(uint)
    {
        return poolUserCount[poolId];
    }

    //is address a user of pool
    function isPoolParticipant(uint id, address addr)
        public
        view
        returns(bool)
    {
       return pools[id].poolParticipant[addr];
    }

    //returns total hearts a user owns in pool
    function getUserHeartValue(uint id, address addr)
        public
        view
        returns(uint)
    {
       return pools[id].userHeartValue[addr];
    }

    //returns contract HEX balance
    function getContractBalance()
        public
        view
        returns(uint)
    {
        return hexInterface.balanceOf(address(this));
    }

    ///////////////////////////////////////////////
    //////////////////MUTABLE//////////////////////
    //////////////////////////////////////////////

    function setMinEntry(uint hearts)
        public
        onlyOwner
    {
        minEntryHearts = hearts;
    }

    ///////////////////////////////////////////////
    ///////////////////HEX UTILS///////////////////
    ///////////////////////////////////////////////
    //credits to kyle bahr @ https://gist.github.com/kbahr/80e61ab761053849f7fdc6226b85a354

    struct SStore {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;
    }

    struct DailyDataCache {
        uint256 dayPayoutTotal;
        uint256 dayStakeSharesTotal;
        uint256 dayUnclaimedSatoshisTotal;
    }
    uint256 private constant HEARTS_UINT_SHIFT = 72;
    uint256 private constant HEARTS_MASK = (1 << HEARTS_UINT_SHIFT) - 1;
    uint256 private constant SATS_UINT_SHIFT = 56;
    uint256 private constant SATS_MASK = (1 << SATS_UINT_SHIFT) - 1;

    function decodeDailyData(uint256 encDay)
    private
    pure
    returns (DailyDataCache memory)
    {
        uint256 v = encDay;
        uint256 payout = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 shares = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 sats = v & SATS_MASK;
        return DailyDataCache(payout, shares, sats);
    }

    function interestForRange(DailyDataCache[] memory dailyData, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        uint256 len = dailyData.length;
        uint256 total = 0;
        for(uint256 i = 0; i < len; i++){
            total += interestForDay(dailyData[i], myShares);
        }
        return total;
    }

    function interestForDay(DailyDataCache memory dayObj, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        return myShares * dayObj.dayPayoutTotal / dayObj.dayStakeSharesTotal;
    }

    function getDataRange(uint256 b, uint256 e)
    private
    view
    returns (DailyDataCache[] memory)
    {
        uint256[] memory dataRange = hexInterface.dailyDataRange(b, e);
        uint256 len = dataRange.length;
        DailyDataCache[] memory data = new DailyDataCache[](len);
        for(uint256 i = 0; i < len; i++){
            data[i] = decodeDailyData(dataRange[i]);
        }
        return data;
    }

    function getLastDataDay()
    private
    view
    returns(uint256)
    {
        uint256[13] memory globalInfo = hexInterface.globalInfo();
        uint256 lastDay = globalInfo[4];
        return lastDay;
    }

    function getInterestByStake(SStore memory s)
    private
    view
    returns (uint256)
    {
        uint256 b = s.lockedDay;
        uint256 e = getLastDataDay(); // ostensibly "today"

        if (b >= e) {
            //not started - error
            return 0;
        } else {
            DailyDataCache[] memory data = getDataRange(b, e);
            return interestForRange(data, s.stakeShares);
        }
    }

    function getInterestByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory s = getStakeByStakeId(addr, stakeId);

        return getInterestByStake(s);
    }

    function getTotalValueByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory stake = getStakeByStakeId(addr, stakeId);

        uint256 interest = getInterestByStake(stake);
        return stake.stakedHearts + interest;
    }

    function getStakeByIndex(address addr, uint256 idx)
    private
    view
    returns (SStore memory)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, idx);

        return SStore(stakeId,
                        stakedHearts,
                        stakeShares,
                        lockedDay,
                        stakedDays,
                        unlockedDay,
                        isAutoStake);
    }

    function getStakeByStakeId(address addr, uint40 sid)
    private
    view
    returns (SStore memory)
    {

        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return SStore(stakeId,
                                stakedHearts,
                                stakeShares,
                                lockedDay,
                                stakedDays,
                                unlockedDay,
                                isAutoStake);
            }
        }
    }

    function getStakeIndexById(address addr, uint40 sid)
        private
        view
        returns (uint)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return i;
            }
        }
    }
}

File 1 of 4: HEX.sol
pragma solidity 0.5.13;

interface HEX {
   /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
   function stakeStart(uint256 newStakedHearts, uint256 newStakedDays) external;
   function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external;
   function stakeCount(address stakerAddr) external view returns (uint256);
   function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool);
   function currentDay() external view returns (uint256);
   function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory);
   function globalInfo() external view returns (uint256[13] memory);

}

File 3 of 4: IERC20.sol
pragma solidity ^0.5.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
 
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 4: SafeMath.sol
pragma solidity ^0.5.13;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"PoolEndStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolEntry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"PoolStartStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenFreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenUnfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"}],"name":"Withdrawal","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"EndPoolStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_hearts","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address payable","name":"_ref","type":"address"}],"name":"EnterPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_entryId","type":"uint256"}],"name":"ExitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"FreezeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"UnfreezeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"WithdrawHEX","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buddyDiv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"entries","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"entryId","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"entryId","type":"uint256"}],"name":"getEntryInfo","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getInterestByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolEntryIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"uint256","name":"poolStakeThreshold","type":"uint256"},{"internalType":"uint256","name":"poolStakeDayLength","type":"uint256"},{"internalType":"uint256","name":"poolValue","type":"uint256"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"bool","name":"isStaking","type":"bool"},{"internalType":"uint256","name":"poolStakeStartTimestamp","type":"uint256"},{"internalType":"bool","name":"stakeEnded","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolStakeInfo","outputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"hexStakeIndex","type":"uint256"},{"internalType":"uint40","name":"hexStakeId","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolUserCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getTotalValueByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"getUserHeartValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"totalHeartsEntered","type":"uint256"},{"internalType":"uint256[]","name":"_entryIds","type":"uint256[]"},{"internalType":"address","name":"userAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getWithdrawableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"isPoolParticipant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStakeEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStakeFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_pool_entry_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_pool_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_stake_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minEntryHearts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"poolStakeThreshold","type":"uint256"},{"internalType":"uint256","name":"poolStakeDayLength","type":"uint256"},{"internalType":"uint256","name":"poolValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint40","name":"hexStakeId","type":"uint40"},{"internalType":"bool","name":"isStaking","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"poolStakeStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"stakeValue","type":"uint256"},{"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"internalType":"bool","name":"stakeEnded","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"hearts","type":"uint256"}],"name":"setMinEntry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenFrozenBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozenTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"totalHeartsEntered","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052678ac7230489e800006003553480156200001d57600080fd5b50600980546001600160a01b0319908116331790915560088054909116732b591e99afe9f32eaa6214f7b7629768c40eeb39179055620000656001600160e01b036200006b16565b62000716565b6009546001600160a01b03163314620000e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f744f776e6572000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b601454610100900460ff16156200015d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f63616e6e6f74207265696e697469616c697a6500000000000000000000000000604482015290519081900360640190fd5b60005b60038110156200018b5762000181816000806001600160e01b03620001b616565b5060010162000160565b50620001a564174876e8006001600160e01b036200046016565b6014805461ff001916610100179055565b6000808085620001d3575066354a6ba7a180009050602462000276565b8560011415620001f1575066354a6ba7a18000905061016d62000276565b85600214156200020f575066354a6ba7a180009050610e4262000276565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c696420706f6f6c5479706500000000000000000000000000000000604482015290519081900360640190fd5b60006200028b6001600160e01b03620004df16565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805460ff60301b1916660100000000000017905590915086156200036857600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff19169091179055600684018252909120546200032c9189906200232b620004ed821b17901c565b33600090815260068301602052604090205562000352876001600160e01b036200056916565b620003688783886001600160e01b03620005ae16565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815460ff60281b19909116650100000000009182900460ff908116151590920217808455915460ff60301b19909216660100000000000092839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b6009546001600160a01b03163314620004da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f744f776e6572000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d55565b600b80546001019081905590565b6000828201838110156200056257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b336000908152600e602090815260409091208054909162000596919084906200232b620004ed821b17901c565b815560010180546001600160a01b0319163317905550565b6000620005c36001600160e01b03620006c716565b336000908152601360209081526040808320805460018181018355918552838520018590558784526012835290832080549182018155835291200181905590506200060d620006d5565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b600a80546001019081905590565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b614a0780620007266000396000f3fe60806040526004361061027d5760003560e01c8063916808bb1161014f578063ac4afa38116100c1578063c7d0b70e1161007a578063c7d0b70e14610b49578063cc2e5b2814610b73578063d34b0a3e14610bac578063dd62ed3e14610bc1578063ea62167b14610bfc578063f248b86a14610c265761027d565b8063ac4afa3814610955578063ad663e67146109f0578063b0a5df9a14610a3f578063b30906d414610a7f578063bb7a1c3514610ae0578063bbbaf8c814610b1f5761027d565b80639e1a4d19116101135780639e1a4d191461083b578063a391210714610850578063a457c2d714610865578063a87430ba1461089e578063a8dcd03a146108f2578063a9059cbb1461091c5761027d565b8063916808bb1461075b578063922e92a3146107705780639355aea7146107a357806394244039146107fc57806395d89b41146108265761027d565b8063313ce567116101f35780636f9fb98a116101ac5780636f9fb98a1461066a57806370a082311461067f5780637be79cf6146106b25780637e8e3749146106dc5780638094f90d1461071c57806384e56ca2146107465761027d565b8063313ce567146104e857806333590596146104fd578063365a94e8146105365780633950935114610560578063404f1fec146105995780636386c1c7146105c35761027d565b806318160ddd1161024557806318160ddd146103d6578063181f599f146103eb5780631e7f87bc1461040057806323b872dd14610415578063245590da146104585780632f380b35146104825761027d565b80630410808e1461028457806306fdde03146102ab578063095ea7b3146103355780630cdc25d3146103825780630cfd442a146103ac575b600080fd5b005b34801561029057600080fd5b50610299610ca0565b60408051918252519081900360200190f35b3480156102b757600080fd5b506102c0610ca6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fa5781810151838201526020016102e2565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034157600080fd5b5061036e6004803603604081101561035857600080fd5b506001600160a01b038135169060200135610cc9565b604080519115158252519081900360200190f35b34801561038e57600080fd5b50610282600480360360208110156103a557600080fd5b5035610ce0565b3480156103b857600080fd5b50610282600480360360208110156103cf57600080fd5b5035610d98565b3480156103e257600080fd5b50610299610e2d565b3480156103f757600080fd5b50610299610e33565b34801561040c57600080fd5b50610299610e39565b34801561042157600080fd5b5061036e6004803603606081101561043857600080fd5b506001600160a01b03813581169160208101359091169060400135610e3f565b34801561046457600080fd5b506102826004803603602081101561047b57600080fd5b5035610eae565b34801561048e57600080fd5b506104ac600480360360208110156104a557600080fd5b5035610fbf565b6040805197885260208801969096528686019490945260608601929092521515608085015260a0840152151560c0830152519081900360e00190f35b3480156104f457600080fd5b50610299611009565b34801561050957600080fd5b5061036e6004803603604081101561052057600080fd5b50803590602001356001600160a01b031661100e565b34801561054257600080fd5b5061036e6004803603602081101561055957600080fd5b503561103d565b34801561056c57600080fd5b5061036e6004803603604081101561058357600080fd5b506001600160a01b0381351690602001356110a3565b3480156105a557600080fd5b50610299600480360360208110156105bc57600080fd5b50356110df565b3480156105cf57600080fd5b506105f6600480360360208110156105e657600080fd5b50356001600160a01b03166110f1565b6040518084815260200180602001836001600160a01b03166001600160a01b03168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561065457818101518382015260200161063c565b5050505090500194505050505060405180910390f35b34801561067657600080fd5b50610299611186565b34801561068b57600080fd5b50610299600480360360208110156106a257600080fd5b50356001600160a01b0316611202565b3480156106be57600080fd5b50610282600480360360208110156106d557600080fd5b503561121d565b3480156106e857600080fd5b50610299600480360360408110156106ff57600080fd5b5080356001600160a01b0316906020013564ffffffffff1661126c565b34801561072857600080fd5b506102996004803603602081101561073f57600080fd5b5035611293565b34801561075257600080fd5b50610299611357565b34801561076757600080fd5b5061029961135d565b34801561077c57600080fd5b506102996004803603602081101561079357600080fd5b50356001600160a01b0316611363565b3480156107af57600080fd5b506107cd600480360360208110156107c657600080fd5b5035611375565b6040805194855260208501939093526001600160a01b0391821684840152166060830152519081900360800190f35b34801561080857600080fd5b5061036e6004803603602081101561081f57600080fd5b50356113a9565b34801561083257600080fd5b506102c06113c1565b34801561084757600080fd5b506102996113e1565b34801561085c57600080fd5b506102996113f1565b34801561087157600080fd5b5061036e6004803603604081101561088857600080fd5b506001600160a01b0381351690602001356113f7565b3480156108aa57600080fd5b506108d1600480360360208110156108c157600080fd5b50356001600160a01b031661144c565b604080519283526001600160a01b0390911660208301528051918290030190f35b3480156108fe57600080fd5b506102826004803603602081101561091557600080fd5b503561146e565b34801561092857600080fd5b5061036e6004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611519565b34801561096157600080fd5b5061097f6004803603602081101561097857600080fd5b5035611526565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945264ffffffffff90921660c0890152151560e08801521515610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156109fc57600080fd5b50610a1a60048036036020811015610a1357600080fd5b503561159a565b60408051938452602084019290925264ffffffffff1682820152519081900360600190f35b348015610a4b57600080fd5b5061029960048036036040811015610a6257600080fd5b5080356001600160a01b0316906020013564ffffffffff166115ee565b348015610a8b57600080fd5b50610aa960048036036020811015610aa257600080fd5b503561162c565b604080519586526020860194909452848401929092526001600160a01b039081166060850152166080830152519081900360a00190f35b348015610aec57600080fd5b5061028260048036036060811015610b0357600080fd5b50803590602081013590604001356001600160a01b0316611667565b348015610b2b57600080fd5b5061036e60048036036020811015610b4257600080fd5b5035611818565b348015610b5557600080fd5b5061028260048036036020811015610b6c57600080fd5b5035611881565b348015610b7f57600080fd5b5061029960048036036040811015610b9657600080fd5b50803590602001356001600160a01b03166119d3565b348015610bb857600080fd5b506102996119ff565b348015610bcd57600080fd5b5061029960048036036040811015610be457600080fd5b506001600160a01b0381358116916020013516611a05565b348015610c0857600080fd5b5061036e60048036036020811015610c1f57600080fd5b5035611a30565b348015610c3257600080fd5b50610c5060048036036020811015610c4957600080fd5b5035611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8c578181015183820152602001610c74565b505050509050019250505060405180910390f35b60065490565b604051806040016040528060078152602001661211561413d3d360ca1b81525081565b6000610cd6338484611ab1565b5060015b92915050565b60145460ff1615610d24576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610d3a81611b9d565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f7420656e64207374616b65000000000000604482015290519081900360640190fd5b506014805460ff19169055565b60145460ff1615610ddc576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610df281611e0d565b610d8b5760405162461bcd60e51b81526004018080602001828103825260218152602001806148056021913960400191505060405180910390fd5b60045490565b600c5481565b60065481565b6000610e4c8484846120ab565b610ea48433610e9f8560405180606001604052806028815260200161491c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff61224b16565b611ab1565b5060019392505050565b60008111610ef0576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b33600090815260076020526040902054811115610f3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061484c6022913960400191505060405180910390fd5b33600090815260076020526040902054610f5e908263ffffffff6122e216565b33600090815260076020526040902055600654610f81908263ffffffff6122e216565b600655610f8f3033836120ab565b604051819033907fb925ba840e2f36bcb317f8179bd8b5ed01aba4a22abf5f169162c0894dea87ab90600090a350565b6000908152601060205260409020805460018201546002830154600484015460088501546009860154600c909601549496939592949193600160281b90910460ff90811693921690565b600881565b60008281526010602090815260408083206001600160a01b038516845260050190915290205460ff1692915050565b600081815260106020526040812060019081015442916110999161107b91620151809161106f9163ffffffff61232b16565b9063ffffffff61238516565b6000858152601060205260409020600901549063ffffffff61232b16565b111590505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cd6918590610e9f908663ffffffff61232b16565b60009081526011602052604090205490565b6001600160a01b038082166000908152600e6020818152604080842080546013845282862094845260019091015484548351818602810186019094528084529596606096889693959394929091169284919083018282801561117257602002820191906000526020600020905b81548152602001906001019080831161115e575b505050505091509250925092509193909250565b600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b5051905090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611267576040805162461bcd60e51b81526020600482015260086024820152673737ba27bbb732b960c11b604482015290519081900360640190fd5b600d55565b6000611276614681565b61128084846123de565b905061128b816125cb565b949350505050565b6000818152601060205260408120600c81015460ff166112fa576040805162461bcd60e51b815260206004820152601f60248201527f706f6f6c207374616b6520686173206e6f74207965742066696e697368656400604482015290519081900360640190fd5b33600090815260068201602052604090205461131a57600091505061109e565b8054336000908152600683016020526040812054600a840154919261128b92909161134b919063ffffffff61238516565b9063ffffffff61262516565b60055481565b600a5481565b60076020526000908152604090205481565b6000908152600f60205260409020805460018201546003830154600490930154919390926001600160a01b03908116921690565b6000908152601060205260409020600c015460ff1690565b604051806040016040528060048152602001631413d3d360e21b81525081565b60006113ec33611202565b905090565b600b5481565b6000610cd63384610e9f856040518060600160405280602581526020016149ae602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff61224b16565b600e60205260009081526040902080546001909101546001600160a01b031682565b60145460ff16156114b2576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556114c881612667565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f74206578697420706f6f6c000000000000604482015290519081900360640190fd5b6000610cd63384846120ab565b601060205260009081526040902080546001820154600283015460038401546004850154600786015460088701546009880154600a890154600b8a0154600c909a015498999798969795969495939464ffffffffff84169460ff600160281b8604811695600160301b90048116949392168d565b60008181526010602052604081206007810154600890910154829182916115c990309064ffffffffff16612f21565b60009586526010602052604090952060080154909564ffffffffff9091169350915050565b60006115f8614681565b61160284846123de565b9050600061160f826125cb565b60209092015168ffffffffffffffffff1690910191505092915050565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290916001600160a01b03908116911685565b818361167282611818565b6116c3576040805162461bcd60e51b815260206004820152601f60248201527f63616e6e6f7420656e7465722c20706f6f6c4964206e6f742061637469766500604482015290519081900360640190fd5b600b5482111561171a576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b600d54811161175a5760405162461bcd60e51b81526004018080602001828103825260308152602001806148cb6030913960400191505060405180910390fd5b60145460ff161561179e576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556117b68585856130af565b611807576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20636f756c64206e6f7420656e74657220706f6f6c0000000000604482015290519081900360640190fd5b50506014805460ff19169055505050565b601454600090610100900460ff166118615760405162461bcd60e51b815260040180806020018281038252602381526020018061473f6023913960400191505060405180910390fd5b50600090815260106020526040902060080154600160301b900460ff1690565b600081116118c3576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b806118cc6113e1565b101561191f576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b61195f61194361193683606463ffffffff61262516565b839063ffffffff6122e216565b336000908152600760205260409020549063ffffffff61232b16565b3360009081526007602052604090205561199561198661193683606463ffffffff61262516565b6006549063ffffffff61232b16565b6006556119a33330836120ab565b604051819033907f7def9f73ac6a7ac8fe4dc55f5257d48aed7e3f9d5247b0020598b87a5c369d8290600090a350565b60008281526010602090815260408083206001600160a01b038516845260060190915290205492915050565b600d5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600090815260106020526040902060080154600160281b900460ff1690565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611aa557602002820191906000526020600020905b815481526020019060010190808311611a91575b50505050509050919050565b6001600160a01b038316611af65760405162461bcd60e51b815260040180806020018281038252602481526020018061498a6024913960400191505060405180910390fd5b6001600160a01b038216611b3b5760405162461bcd60e51b81526004018080602001828103825260228152602001806147e36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000600b54821115611bf6576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b60008281526010602052604090206008810154600160281b900460ff16611c4e5760405162461bcd60e51b815260040180806020018281038252603b81526020018061486e603b913960400191505060405180910390fd5b611c578361103d565b611ca8576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2063616e6e6f74206561726c7920756e7374616b650000000000604482015290519081900360640190fd5b6000611cb2611186565b60088054908401549192506001600160a01b03169063343009a290611cdf90309064ffffffffff16612f21565b6008850154604080516001600160e01b031960e086901b168152600481019390935264ffffffffff909116602483015251604480830192600092919082900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505060088301805465ff00000000001916905550600c8201805460ff191660011790556000611d8282611d76611186565b9063ffffffff6122e216565b600a84018190558354909150611d9f90829063ffffffff6122e216565b600b840181905560038401546001850154600286015460088701546040805195865264ffffffffff909116602086015280519394929391927f4264c1c4dce9a5bdaf76353b212e051ed6a441a4c184dece2572f8510b007c8f929081900390910190a4506001949350505050565b60008181526010602052604081206002810154611e71576040805162461bcd60e51b815260206004820152601e60248201527f706f6f6c20726577617264732068617665206265656e20647261696e65640000604482015290519081900360640190fd5b6000838152601060209081526040808320338452600601909152902054611edf576040805162461bcd60e51b815260206004820152601e60248201527f796f752068617665206e6f20736861726520696e207468697320706f6f6c0000604482015290519081900360640190fd5b600c81015460ff16611ef657611ef483611b9d565b505b6000611f0184611293565b3360009081526006840160205260409020546002840154919250611f2b919063ffffffff6122e216565b6002830190815533600090815260068401602052604081205554611fb1576000848152601060205260408120818155600181018290556002810182905560038101829055600481018290556007810182905560088101805466ffffffffffffff1916905560098101829055600a8101829055600b810191909155600c01805460ff191690555b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b505050506040513d602081101561202f57600080fd5b5051612074576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604051819033907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6590600090a35060019392505050565b6001600160a01b0383166120f05760405162461bcd60e51b81526004018080602001828103825260258152602001806149656025913960400191505060405180910390fd5b6001600160a01b0382166121355760405162461bcd60e51b81526004018080602001828103825260238152602001806147626023913960400191505060405180910390fd5b600061214882606463ffffffff61262516565b9050600061215c838363ffffffff6122e216565b90506121a181604051806060016040528060268152602001614826602691396001600160a01b038816600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b0380871660009081526020819052604080822093909355908616815220546121d6908263ffffffff61232b16565b6001600160a01b0385166000908152602081905260409020556121f985836139ca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156122da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561229f578181015183820152602001612287565b50505050905090810190601f1680156122cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061232483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061224b565b9392505050565b600082820183811015612324576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261239457506000610cda565b828202828482816123a157fe5b04146123245760405162461bcd60e51b81526004018080602001828103825260218152602001806148fb6021913960400191505060405180910390fd5b6123e6614681565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561245d57600080fd5b505afa158015612471573d6000803e3d6000fd5b505050506040513d602081101561248757600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d60e081101561251457600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156125b45750506040805160e08101825264ffffffffff909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c08201529050610cda565b60010161248e565b50505050505050505092915050565b606081015160009061ffff16816125e0613ac6565b90508082106125f45760009250505061109e565b60606126008383613b64565b905061261b81866040015168ffffffffffffffffff16613d1c565b935050505061109e565b600061232483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d5e565b60006126716146bd565b506000828152600f6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546001600160a01b03908116606083018190526004909301541660808201529033146127095760405162461bcd60e51b81526004018080602001828103825260228152602001806148a96022913960400191505060405180910390fd5b60208082015160009081526010825260408082203383526005810190935290205460ff1661277e576040805162461bcd60e51b815260206004820152601e60248201527f796f7520617265206e6f74206120706f6f6c207061727469636970616e740000604482015290519081900360640190fd5b6008810154600160281b900460ff16156127df576040805162461bcd60e51b815260206004820152601c60248201527f706f6f6c206973207374616b696e672c2063616e6e6f74206578697400000000604482015290519081900360640190fd5b8151336000908152600e60205260409020546128009163ffffffff6122e216565b336000908152600e6020526040902055815160028201546128269163ffffffff6122e216565b6002820155815133600090815260068301602052604090205461284e9163ffffffff6122e216565b3360009081526006830160205260409020819055612898573360009081526005820160209081526040808320805460ff191690558482015183526011909152902080546000190190555b6000848152600f6020526040812081815560018101829055600281018290556003810180546001600160a01b031990811690915560049091018054909116905582516128eb90606463ffffffff61262516565b9050600061290082600263ffffffff61262516565b9050600061291583600463ffffffff61262516565b9050600061292a84600463ffffffff61262516565b8651909150600090612942908663ffffffff6122e216565b60055490915015612b36576008546009546005546001600160a01b039283169263a9059cbb92169061297b90600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b5051612a39576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546005546001600160a01b039091169063a9059cbb9073d30bc4859a79852157211e6db19de159673a67e290612a7890600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b5051612b36576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60808701516001600160a01b0316612b52576005829055612c53565b612b6382600263ffffffff61262516565b60055560085460808801516001600160a01b039091169063a9059cbb90612b9185600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612be057600080fd5b505af1158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b5051612c53576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612ca757600080fd5b505af1158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b5051612d16576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546009546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015612d6f57600080fd5b505af1158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051612de3576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b815273d30bc4859a79852157211e6db19de159673a67e260048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612e4b57600080fd5b505af1158015612e5f573d6000803e3d6000fd5b505050506040513d6020811015612e7557600080fd5b5051612ebf576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b8660400151876000015188606001516001600160a01b03167f998379a72dc64811ce41782d18dd7759dd22de4dd43049986376fada953be82989600301546040518082815260200191505060405180910390a450600198975050505050505050565b6000806000806000806000806000600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612f9a57600080fd5b505afa158015612fae573d6000803e3d6000fd5b505050506040513d6020811015612fc457600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b15801561302757600080fd5b505afa15801561303b573d6000803e3d6000fd5b505050506040513d60e081101561305157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156130a7579850610cda975050505050505050565b600101612fcb565b600082815260106020526040812080548511156130fd5760405162461bcd60e51b815260040180806020018281038252603c815260200180614785603c913960400191505060405180910390fd5b6008810154600160281b900460ff1615613150576040805162461bcd60e51b815260206004820152600f60248201526e706f6f6c206973207374616b696e6760881b604482015290519081900360640190fd5b600061316386606463ffffffff61262516565b9050600061317882600263ffffffff61262516565b9050600061318d83600463ffffffff61262516565b905060006131a284600463ffffffff61262516565b905060006131b68a8663ffffffff6122e216565b60028701549091506131ce908263ffffffff61232b16565b600287015533600090815260058701602052604090205460ff16613221573360009081526005870160209081526040808320805460ff191660019081179091558c84526011909252909120805490910190555b336000908152600687016020526040902054613243908263ffffffff61232b16565b33600090815260068801602052604090205560055415613323576008546005546040805163a9059cbb60e01b81523360048201526024810192909252516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156132b457600080fd5b505af11580156132c8573d6000803e3d6000fd5b505050506040513d60208110156132de57600080fd5b5051613323576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b03881661333b57600582905561344e565b61334c82600263ffffffff61262516565b6005556008546001600160a01b03166323b872dd338a61337386600263ffffffff61262516565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156133db57600080fd5b505af11580156133ef573d6000803e3d6000fd5b505050506040513d602081101561340557600080fd5b505161344e576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546005546001600160a01b03909116906323b872dd903390309061347b90869063ffffffff61232b16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156134e357600080fd5b505af11580156134f7573d6000803e3d6000fd5b505050506040513d602081101561350d57600080fd5b5051613552576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b600854600954604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b5051613625576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b600854604080516323b872dd60e01b815233600482015273d30bc4859a79852157211e6db19de159673a67e260248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b505050506040513d60208110156136bd57600080fd5b5051613707576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b855460028701541115613862578554600287015460009161372e919063ffffffff6122e216565b9050613748613743838363ffffffff6122e216565b613dc3565b61376661375b838363ffffffff6122e216565b88600301548b613dfc565b8654600288015533600090815260068801602052604090205461378f908263ffffffff6122e216565b3360009081526006890160205260409020556137ab8a88613f08565b6137fc576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b61380b8760040154828b61410e565b61385c576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b50613960565b8554600287015414156139485761387881613dc3565b6138878187600301548a613dfc565b6138918987613f08565b6138e2576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b6138f2866004015460008a61410e565b613943576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b613960565b61395181613dc3565b6139608187600301548a613dfc565b6139698a614363565b6139ba576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74206d696e7420746f6b656e7300000000604482015290519081900360640190fd5b5060019998505050505050505050565b6001600160a01b038216613a0f5760405162461bcd60e51b81526004018080602001828103825260218152602001806149446021913960400191505060405180910390fd5b613a52816040518060600160405280602281526020016147c1602291396001600160a01b038516600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b038316600090815260208190526040902055600454613a7e908263ffffffff6122e216565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613ad06146fe565b600860009054906101000a90046001600160a01b03166001600160a01b031663f04b5fa06040518163ffffffff1660e01b81526004016101a06040518083038186803b158015613b1f57600080fd5b505afa158015613b33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a0811015613b5957600080fd5b506080015192915050565b60085460408051633510850760e11b81526004810185905260248101849052905160609283926001600160a01b0390911691636a210a0e91604480820192600092909190829003018186803b158015613bbc57600080fd5b505afa158015613bd0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf957600080fd5b8101908080516040519392919084640100000000821115613c1957600080fd5b908301906020820185811115613c2e57600080fd5b8251866020820283011164010000000082111715613c4b57600080fd5b82525081516020918201928201910280838360005b83811015613c78578181015183820152602001613c60565b505050509050016040525050509050600081519050606081604051908082528060200260200182016040528015613cc957816020015b613cb661471d565b815260200190600190039081613cae5790505b50905060005b82811015613d1257613cf3848281518110613ce657fe5b6020026020010151614384565b828281518110613cff57fe5b6020908102919091010152600101613ccf565b5095945050505050565b815160009081805b82811015613d5557613d49868281518110613d3b57fe5b6020026020010151866143c7565b90910190600101613d24565b50949350505050565b60008183613dad5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561229f578181015183820152602001612287565b506000838581613db957fe5b0495945050505050565b336000908152600e602052604090208054613de4908363ffffffff61232b16565b815560010180546001600160a01b0319163317905550565b6000613e066143e4565b33600090815260136020908152604080832080546001818101835591855283852001859055878452601283529083208054918201815583529120018190559050613e4e6146bd565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b8054600282015460009114613f5d576040805162461bcd60e51b815260206004820152601660248201527514dd185ad948185b5bdd5b9d081a5b98dbdc9c9958dd60521b604482015290519081900360640190fd5b8154600183015460085460408051630a54871760e31b8152600481018590526024810184905290516001600160a01b03909216916352a438b89160448082019260009290919082900301818387803b158015613fb857600080fd5b505af1158015613fcc573d6000803e3d6000fd5b50506008546040805163033060d960e41b815230600482015290516000945061405a93506001926001600160a01b0316916333060d90916024808301926020929190829003018186803b15801561402257600080fd5b505afa158015614036573d6000803e3d6000fd5b505050506040513d602081101561404c57600080fd5b50519063ffffffff6122e216565b9050614064614681565b61406e30836143f2565b805160088801805464ffffffffff90921664ffffffffff1990921691909117808255600c5460078a01554260098a015566ffff00000000001916600160281b17905590506140ba614510565b5080516040805186815264ffffffffff90921660208301528051899286927fe6e27f56b3cdde69e5d0a9bcdef1ef34500823c80d47d320e171687080f8fbb292918290030190a35060019695505050505050565b6000808085614129575066354a6ba7a18000905060246141a1565b8560011415614145575066354a6ba7a18000905061016d6141a1565b8560021415614161575066354a6ba7a180009050610e426141a1565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c696420706f6f6c5479706560801b604482015290519081900360640190fd5b60006141ab61451e565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805466ff0000000000001916600160301b179055909150861561426b57600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff1916909117905560068401909152902054614245908863ffffffff61232b16565b33600090815260068301602052604090205561426087613dc3565b61426b878388613dfc565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815465ff000000000019909116600160281b9182900460ff908116151590920217808455915466ff00000000000019909216600160301b92839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b60008061437783606463ffffffff61262516565b905033610ea4818361452c565b61438c61471d565b506040805160608101825268ffffffffffffffffff8381168252604884901c16602082015260909290921c66ffffffffffffff169082015290565b6000826020015183600001518302816143dc57fe5b049392505050565b600a80546001019081905590565b6143fa614681565b60085460408051632607443b60e01b81526001600160a01b038681166004830152602482018690529151600093849384938493849384938493911691632607443b9160448082019260e092909190829003018186803b15801561445c57600080fd5b505afa158015614470573d6000803e3d6000fd5b505050506040513d60e081101561448657600080fd5b50805160208083015160408085015160608087015160808089015160a0808b015160c09b8c0151885160e081018a5264ffffffffff909c168c5268ffffffffffffffffff998a169a8c019a909a52979095169589019590955261ffff91821692880192909252928316908601529116908301521515918101919091529a9950505050505050505050565b600c80546001019081905590565b600b80546001019081905590565b806001600160a01b038316614588576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025460ff1661467c57600354600454101561467c576003546004546145b4908363ffffffff61232b16565b11156145e9576004546003546145cf9163ffffffff6122e216565b6003546004556002805460ff191660011790559050614600565b6004546145fc908263ffffffff61232b16565b6004555b6001600160a01b038316600090815260208190526040902054614629908263ffffffff61232b16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604051806101a00160405280600d906020820280388339509192915050565b6040518060600160405280600081526020016000815260200160008152509056fe63616e6e6f7420656e7465722c20706f6f6c73206e6f7420696e697469616c697a656445524332303a207472616e7366657220746f20746865207a65726f2061646472657373616d6f756e74206f766572207468726573686f6c64202d206f6e6c792031206e657720706f6f6c20746f20626520637265617465642070657220747845524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f20616464726573734572726f723a20636f756c64206e6f74207769746864726177207265776172647345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654572726f723a20756e73756666696369656e742066726f7a656e2062616c616e63654572726f723a20706f6f6c206973206e6f7420796574207374616b65642c206f722068617320616c726561647920656e646564207374616b696e676e6f7420656e747279206f776e65722c206f7220616c7265616479206578697465644572726f723a2076616c7565206d7573742062652067726561746572207468616e206d696e456e747279486561727473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e9364736f6c634300050d0032

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063916808bb1161014f578063ac4afa38116100c1578063c7d0b70e1161007a578063c7d0b70e14610b49578063cc2e5b2814610b73578063d34b0a3e14610bac578063dd62ed3e14610bc1578063ea62167b14610bfc578063f248b86a14610c265761027d565b8063ac4afa3814610955578063ad663e67146109f0578063b0a5df9a14610a3f578063b30906d414610a7f578063bb7a1c3514610ae0578063bbbaf8c814610b1f5761027d565b80639e1a4d19116101135780639e1a4d191461083b578063a391210714610850578063a457c2d714610865578063a87430ba1461089e578063a8dcd03a146108f2578063a9059cbb1461091c5761027d565b8063916808bb1461075b578063922e92a3146107705780639355aea7146107a357806394244039146107fc57806395d89b41146108265761027d565b8063313ce567116101f35780636f9fb98a116101ac5780636f9fb98a1461066a57806370a082311461067f5780637be79cf6146106b25780637e8e3749146106dc5780638094f90d1461071c57806384e56ca2146107465761027d565b8063313ce567146104e857806333590596146104fd578063365a94e8146105365780633950935114610560578063404f1fec146105995780636386c1c7146105c35761027d565b806318160ddd1161024557806318160ddd146103d6578063181f599f146103eb5780631e7f87bc1461040057806323b872dd14610415578063245590da146104585780632f380b35146104825761027d565b80630410808e1461028457806306fdde03146102ab578063095ea7b3146103355780630cdc25d3146103825780630cfd442a146103ac575b600080fd5b005b34801561029057600080fd5b50610299610ca0565b60408051918252519081900360200190f35b3480156102b757600080fd5b506102c0610ca6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fa5781810151838201526020016102e2565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034157600080fd5b5061036e6004803603604081101561035857600080fd5b506001600160a01b038135169060200135610cc9565b604080519115158252519081900360200190f35b34801561038e57600080fd5b50610282600480360360208110156103a557600080fd5b5035610ce0565b3480156103b857600080fd5b50610282600480360360208110156103cf57600080fd5b5035610d98565b3480156103e257600080fd5b50610299610e2d565b3480156103f757600080fd5b50610299610e33565b34801561040c57600080fd5b50610299610e39565b34801561042157600080fd5b5061036e6004803603606081101561043857600080fd5b506001600160a01b03813581169160208101359091169060400135610e3f565b34801561046457600080fd5b506102826004803603602081101561047b57600080fd5b5035610eae565b34801561048e57600080fd5b506104ac600480360360208110156104a557600080fd5b5035610fbf565b6040805197885260208801969096528686019490945260608601929092521515608085015260a0840152151560c0830152519081900360e00190f35b3480156104f457600080fd5b50610299611009565b34801561050957600080fd5b5061036e6004803603604081101561052057600080fd5b50803590602001356001600160a01b031661100e565b34801561054257600080fd5b5061036e6004803603602081101561055957600080fd5b503561103d565b34801561056c57600080fd5b5061036e6004803603604081101561058357600080fd5b506001600160a01b0381351690602001356110a3565b3480156105a557600080fd5b50610299600480360360208110156105bc57600080fd5b50356110df565b3480156105cf57600080fd5b506105f6600480360360208110156105e657600080fd5b50356001600160a01b03166110f1565b6040518084815260200180602001836001600160a01b03166001600160a01b03168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561065457818101518382015260200161063c565b5050505090500194505050505060405180910390f35b34801561067657600080fd5b50610299611186565b34801561068b57600080fd5b50610299600480360360208110156106a257600080fd5b50356001600160a01b0316611202565b3480156106be57600080fd5b50610282600480360360208110156106d557600080fd5b503561121d565b3480156106e857600080fd5b50610299600480360360408110156106ff57600080fd5b5080356001600160a01b0316906020013564ffffffffff1661126c565b34801561072857600080fd5b506102996004803603602081101561073f57600080fd5b5035611293565b34801561075257600080fd5b50610299611357565b34801561076757600080fd5b5061029961135d565b34801561077c57600080fd5b506102996004803603602081101561079357600080fd5b50356001600160a01b0316611363565b3480156107af57600080fd5b506107cd600480360360208110156107c657600080fd5b5035611375565b6040805194855260208501939093526001600160a01b0391821684840152166060830152519081900360800190f35b34801561080857600080fd5b5061036e6004803603602081101561081f57600080fd5b50356113a9565b34801561083257600080fd5b506102c06113c1565b34801561084757600080fd5b506102996113e1565b34801561085c57600080fd5b506102996113f1565b34801561087157600080fd5b5061036e6004803603604081101561088857600080fd5b506001600160a01b0381351690602001356113f7565b3480156108aa57600080fd5b506108d1600480360360208110156108c157600080fd5b50356001600160a01b031661144c565b604080519283526001600160a01b0390911660208301528051918290030190f35b3480156108fe57600080fd5b506102826004803603602081101561091557600080fd5b503561146e565b34801561092857600080fd5b5061036e6004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611519565b34801561096157600080fd5b5061097f6004803603602081101561097857600080fd5b5035611526565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945264ffffffffff90921660c0890152151560e08801521515610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156109fc57600080fd5b50610a1a60048036036020811015610a1357600080fd5b503561159a565b60408051938452602084019290925264ffffffffff1682820152519081900360600190f35b348015610a4b57600080fd5b5061029960048036036040811015610a6257600080fd5b5080356001600160a01b0316906020013564ffffffffff166115ee565b348015610a8b57600080fd5b50610aa960048036036020811015610aa257600080fd5b503561162c565b604080519586526020860194909452848401929092526001600160a01b039081166060850152166080830152519081900360a00190f35b348015610aec57600080fd5b5061028260048036036060811015610b0357600080fd5b50803590602081013590604001356001600160a01b0316611667565b348015610b2b57600080fd5b5061036e60048036036020811015610b4257600080fd5b5035611818565b348015610b5557600080fd5b5061028260048036036020811015610b6c57600080fd5b5035611881565b348015610b7f57600080fd5b5061029960048036036040811015610b9657600080fd5b50803590602001356001600160a01b03166119d3565b348015610bb857600080fd5b506102996119ff565b348015610bcd57600080fd5b5061029960048036036040811015610be457600080fd5b506001600160a01b0381358116916020013516611a05565b348015610c0857600080fd5b5061036e60048036036020811015610c1f57600080fd5b5035611a30565b348015610c3257600080fd5b50610c5060048036036020811015610c4957600080fd5b5035611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8c578181015183820152602001610c74565b505050509050019250505060405180910390f35b60065490565b604051806040016040528060078152602001661211561413d3d360ca1b81525081565b6000610cd6338484611ab1565b5060015b92915050565b60145460ff1615610d24576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610d3a81611b9d565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f7420656e64207374616b65000000000000604482015290519081900360640190fd5b506014805460ff19169055565b60145460ff1615610ddc576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610df281611e0d565b610d8b5760405162461bcd60e51b81526004018080602001828103825260218152602001806148056021913960400191505060405180910390fd5b60045490565b600c5481565b60065481565b6000610e4c8484846120ab565b610ea48433610e9f8560405180606001604052806028815260200161491c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff61224b16565b611ab1565b5060019392505050565b60008111610ef0576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b33600090815260076020526040902054811115610f3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061484c6022913960400191505060405180910390fd5b33600090815260076020526040902054610f5e908263ffffffff6122e216565b33600090815260076020526040902055600654610f81908263ffffffff6122e216565b600655610f8f3033836120ab565b604051819033907fb925ba840e2f36bcb317f8179bd8b5ed01aba4a22abf5f169162c0894dea87ab90600090a350565b6000908152601060205260409020805460018201546002830154600484015460088501546009860154600c909601549496939592949193600160281b90910460ff90811693921690565b600881565b60008281526010602090815260408083206001600160a01b038516845260050190915290205460ff1692915050565b600081815260106020526040812060019081015442916110999161107b91620151809161106f9163ffffffff61232b16565b9063ffffffff61238516565b6000858152601060205260409020600901549063ffffffff61232b16565b111590505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cd6918590610e9f908663ffffffff61232b16565b60009081526011602052604090205490565b6001600160a01b038082166000908152600e6020818152604080842080546013845282862094845260019091015484548351818602810186019094528084529596606096889693959394929091169284919083018282801561117257602002820191906000526020600020905b81548152602001906001019080831161115e575b505050505091509250925092509193909250565b600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b5051905090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611267576040805162461bcd60e51b81526020600482015260086024820152673737ba27bbb732b960c11b604482015290519081900360640190fd5b600d55565b6000611276614681565b61128084846123de565b905061128b816125cb565b949350505050565b6000818152601060205260408120600c81015460ff166112fa576040805162461bcd60e51b815260206004820152601f60248201527f706f6f6c207374616b6520686173206e6f74207965742066696e697368656400604482015290519081900360640190fd5b33600090815260068201602052604090205461131a57600091505061109e565b8054336000908152600683016020526040812054600a840154919261128b92909161134b919063ffffffff61238516565b9063ffffffff61262516565b60055481565b600a5481565b60076020526000908152604090205481565b6000908152600f60205260409020805460018201546003830154600490930154919390926001600160a01b03908116921690565b6000908152601060205260409020600c015460ff1690565b604051806040016040528060048152602001631413d3d360e21b81525081565b60006113ec33611202565b905090565b600b5481565b6000610cd63384610e9f856040518060600160405280602581526020016149ae602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff61224b16565b600e60205260009081526040902080546001909101546001600160a01b031682565b60145460ff16156114b2576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556114c881612667565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f74206578697420706f6f6c000000000000604482015290519081900360640190fd5b6000610cd63384846120ab565b601060205260009081526040902080546001820154600283015460038401546004850154600786015460088701546009880154600a890154600b8a0154600c909a015498999798969795969495939464ffffffffff84169460ff600160281b8604811695600160301b90048116949392168d565b60008181526010602052604081206007810154600890910154829182916115c990309064ffffffffff16612f21565b60009586526010602052604090952060080154909564ffffffffff9091169350915050565b60006115f8614681565b61160284846123de565b9050600061160f826125cb565b60209092015168ffffffffffffffffff1690910191505092915050565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290916001600160a01b03908116911685565b818361167282611818565b6116c3576040805162461bcd60e51b815260206004820152601f60248201527f63616e6e6f7420656e7465722c20706f6f6c4964206e6f742061637469766500604482015290519081900360640190fd5b600b5482111561171a576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b600d54811161175a5760405162461bcd60e51b81526004018080602001828103825260308152602001806148cb6030913960400191505060405180910390fd5b60145460ff161561179e576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556117b68585856130af565b611807576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20636f756c64206e6f7420656e74657220706f6f6c0000000000604482015290519081900360640190fd5b50506014805460ff19169055505050565b601454600090610100900460ff166118615760405162461bcd60e51b815260040180806020018281038252602381526020018061473f6023913960400191505060405180910390fd5b50600090815260106020526040902060080154600160301b900460ff1690565b600081116118c3576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b806118cc6113e1565b101561191f576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b61195f61194361193683606463ffffffff61262516565b839063ffffffff6122e216565b336000908152600760205260409020549063ffffffff61232b16565b3360009081526007602052604090205561199561198661193683606463ffffffff61262516565b6006549063ffffffff61232b16565b6006556119a33330836120ab565b604051819033907f7def9f73ac6a7ac8fe4dc55f5257d48aed7e3f9d5247b0020598b87a5c369d8290600090a350565b60008281526010602090815260408083206001600160a01b038516845260060190915290205492915050565b600d5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600090815260106020526040902060080154600160281b900460ff1690565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611aa557602002820191906000526020600020905b815481526020019060010190808311611a91575b50505050509050919050565b6001600160a01b038316611af65760405162461bcd60e51b815260040180806020018281038252602481526020018061498a6024913960400191505060405180910390fd5b6001600160a01b038216611b3b5760405162461bcd60e51b81526004018080602001828103825260228152602001806147e36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000600b54821115611bf6576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b60008281526010602052604090206008810154600160281b900460ff16611c4e5760405162461bcd60e51b815260040180806020018281038252603b81526020018061486e603b913960400191505060405180910390fd5b611c578361103d565b611ca8576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2063616e6e6f74206561726c7920756e7374616b650000000000604482015290519081900360640190fd5b6000611cb2611186565b60088054908401549192506001600160a01b03169063343009a290611cdf90309064ffffffffff16612f21565b6008850154604080516001600160e01b031960e086901b168152600481019390935264ffffffffff909116602483015251604480830192600092919082900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505060088301805465ff00000000001916905550600c8201805460ff191660011790556000611d8282611d76611186565b9063ffffffff6122e216565b600a84018190558354909150611d9f90829063ffffffff6122e216565b600b840181905560038401546001850154600286015460088701546040805195865264ffffffffff909116602086015280519394929391927f4264c1c4dce9a5bdaf76353b212e051ed6a441a4c184dece2572f8510b007c8f929081900390910190a4506001949350505050565b60008181526010602052604081206002810154611e71576040805162461bcd60e51b815260206004820152601e60248201527f706f6f6c20726577617264732068617665206265656e20647261696e65640000604482015290519081900360640190fd5b6000838152601060209081526040808320338452600601909152902054611edf576040805162461bcd60e51b815260206004820152601e60248201527f796f752068617665206e6f20736861726520696e207468697320706f6f6c0000604482015290519081900360640190fd5b600c81015460ff16611ef657611ef483611b9d565b505b6000611f0184611293565b3360009081526006840160205260409020546002840154919250611f2b919063ffffffff6122e216565b6002830190815533600090815260068401602052604081205554611fb1576000848152601060205260408120818155600181018290556002810182905560038101829055600481018290556007810182905560088101805466ffffffffffffff1916905560098101829055600a8101829055600b810191909155600c01805460ff191690555b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b505050506040513d602081101561202f57600080fd5b5051612074576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604051819033907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6590600090a35060019392505050565b6001600160a01b0383166120f05760405162461bcd60e51b81526004018080602001828103825260258152602001806149656025913960400191505060405180910390fd5b6001600160a01b0382166121355760405162461bcd60e51b81526004018080602001828103825260238152602001806147626023913960400191505060405180910390fd5b600061214882606463ffffffff61262516565b9050600061215c838363ffffffff6122e216565b90506121a181604051806060016040528060268152602001614826602691396001600160a01b038816600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b0380871660009081526020819052604080822093909355908616815220546121d6908263ffffffff61232b16565b6001600160a01b0385166000908152602081905260409020556121f985836139ca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156122da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561229f578181015183820152602001612287565b50505050905090810190601f1680156122cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061232483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061224b565b9392505050565b600082820183811015612324576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261239457506000610cda565b828202828482816123a157fe5b04146123245760405162461bcd60e51b81526004018080602001828103825260218152602001806148fb6021913960400191505060405180910390fd5b6123e6614681565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561245d57600080fd5b505afa158015612471573d6000803e3d6000fd5b505050506040513d602081101561248757600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d60e081101561251457600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156125b45750506040805160e08101825264ffffffffff909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c08201529050610cda565b60010161248e565b50505050505050505092915050565b606081015160009061ffff16816125e0613ac6565b90508082106125f45760009250505061109e565b60606126008383613b64565b905061261b81866040015168ffffffffffffffffff16613d1c565b935050505061109e565b600061232483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d5e565b60006126716146bd565b506000828152600f6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546001600160a01b03908116606083018190526004909301541660808201529033146127095760405162461bcd60e51b81526004018080602001828103825260228152602001806148a96022913960400191505060405180910390fd5b60208082015160009081526010825260408082203383526005810190935290205460ff1661277e576040805162461bcd60e51b815260206004820152601e60248201527f796f7520617265206e6f74206120706f6f6c207061727469636970616e740000604482015290519081900360640190fd5b6008810154600160281b900460ff16156127df576040805162461bcd60e51b815260206004820152601c60248201527f706f6f6c206973207374616b696e672c2063616e6e6f74206578697400000000604482015290519081900360640190fd5b8151336000908152600e60205260409020546128009163ffffffff6122e216565b336000908152600e6020526040902055815160028201546128269163ffffffff6122e216565b6002820155815133600090815260068301602052604090205461284e9163ffffffff6122e216565b3360009081526006830160205260409020819055612898573360009081526005820160209081526040808320805460ff191690558482015183526011909152902080546000190190555b6000848152600f6020526040812081815560018101829055600281018290556003810180546001600160a01b031990811690915560049091018054909116905582516128eb90606463ffffffff61262516565b9050600061290082600263ffffffff61262516565b9050600061291583600463ffffffff61262516565b9050600061292a84600463ffffffff61262516565b8651909150600090612942908663ffffffff6122e216565b60055490915015612b36576008546009546005546001600160a01b039283169263a9059cbb92169061297b90600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b5051612a39576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546005546001600160a01b039091169063a9059cbb9073d30bc4859a79852157211e6db19de159673a67e290612a7890600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b5051612b36576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60808701516001600160a01b0316612b52576005829055612c53565b612b6382600263ffffffff61262516565b60055560085460808801516001600160a01b039091169063a9059cbb90612b9185600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612be057600080fd5b505af1158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b5051612c53576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612ca757600080fd5b505af1158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b5051612d16576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546009546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015612d6f57600080fd5b505af1158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051612de3576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b815273d30bc4859a79852157211e6db19de159673a67e260048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612e4b57600080fd5b505af1158015612e5f573d6000803e3d6000fd5b505050506040513d6020811015612e7557600080fd5b5051612ebf576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b8660400151876000015188606001516001600160a01b03167f998379a72dc64811ce41782d18dd7759dd22de4dd43049986376fada953be82989600301546040518082815260200191505060405180910390a450600198975050505050505050565b6000806000806000806000806000600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612f9a57600080fd5b505afa158015612fae573d6000803e3d6000fd5b505050506040513d6020811015612fc457600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b15801561302757600080fd5b505afa15801561303b573d6000803e3d6000fd5b505050506040513d60e081101561305157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156130a7579850610cda975050505050505050565b600101612fcb565b600082815260106020526040812080548511156130fd5760405162461bcd60e51b815260040180806020018281038252603c815260200180614785603c913960400191505060405180910390fd5b6008810154600160281b900460ff1615613150576040805162461bcd60e51b815260206004820152600f60248201526e706f6f6c206973207374616b696e6760881b604482015290519081900360640190fd5b600061316386606463ffffffff61262516565b9050600061317882600263ffffffff61262516565b9050600061318d83600463ffffffff61262516565b905060006131a284600463ffffffff61262516565b905060006131b68a8663ffffffff6122e216565b60028701549091506131ce908263ffffffff61232b16565b600287015533600090815260058701602052604090205460ff16613221573360009081526005870160209081526040808320805460ff191660019081179091558c84526011909252909120805490910190555b336000908152600687016020526040902054613243908263ffffffff61232b16565b33600090815260068801602052604090205560055415613323576008546005546040805163a9059cbb60e01b81523360048201526024810192909252516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156132b457600080fd5b505af11580156132c8573d6000803e3d6000fd5b505050506040513d60208110156132de57600080fd5b5051613323576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b03881661333b57600582905561344e565b61334c82600263ffffffff61262516565b6005556008546001600160a01b03166323b872dd338a61337386600263ffffffff61262516565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156133db57600080fd5b505af11580156133ef573d6000803e3d6000fd5b505050506040513d602081101561340557600080fd5b505161344e576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546005546001600160a01b03909116906323b872dd903390309061347b90869063ffffffff61232b16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156134e357600080fd5b505af11580156134f7573d6000803e3d6000fd5b505050506040513d602081101561350d57600080fd5b5051613552576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b600854600954604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b5051613625576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b600854604080516323b872dd60e01b815233600482015273d30bc4859a79852157211e6db19de159673a67e260248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b505050506040513d60208110156136bd57600080fd5b5051613707576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b855460028701541115613862578554600287015460009161372e919063ffffffff6122e216565b9050613748613743838363ffffffff6122e216565b613dc3565b61376661375b838363ffffffff6122e216565b88600301548b613dfc565b8654600288015533600090815260068801602052604090205461378f908263ffffffff6122e216565b3360009081526006890160205260409020556137ab8a88613f08565b6137fc576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b61380b8760040154828b61410e565b61385c576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b50613960565b8554600287015414156139485761387881613dc3565b6138878187600301548a613dfc565b6138918987613f08565b6138e2576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b6138f2866004015460008a61410e565b613943576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b613960565b61395181613dc3565b6139608187600301548a613dfc565b6139698a614363565b6139ba576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74206d696e7420746f6b656e7300000000604482015290519081900360640190fd5b5060019998505050505050505050565b6001600160a01b038216613a0f5760405162461bcd60e51b81526004018080602001828103825260218152602001806149446021913960400191505060405180910390fd5b613a52816040518060600160405280602281526020016147c1602291396001600160a01b038516600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b038316600090815260208190526040902055600454613a7e908263ffffffff6122e216565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613ad06146fe565b600860009054906101000a90046001600160a01b03166001600160a01b031663f04b5fa06040518163ffffffff1660e01b81526004016101a06040518083038186803b158015613b1f57600080fd5b505afa158015613b33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a0811015613b5957600080fd5b506080015192915050565b60085460408051633510850760e11b81526004810185905260248101849052905160609283926001600160a01b0390911691636a210a0e91604480820192600092909190829003018186803b158015613bbc57600080fd5b505afa158015613bd0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf957600080fd5b8101908080516040519392919084640100000000821115613c1957600080fd5b908301906020820185811115613c2e57600080fd5b8251866020820283011164010000000082111715613c4b57600080fd5b82525081516020918201928201910280838360005b83811015613c78578181015183820152602001613c60565b505050509050016040525050509050600081519050606081604051908082528060200260200182016040528015613cc957816020015b613cb661471d565b815260200190600190039081613cae5790505b50905060005b82811015613d1257613cf3848281518110613ce657fe5b6020026020010151614384565b828281518110613cff57fe5b6020908102919091010152600101613ccf565b5095945050505050565b815160009081805b82811015613d5557613d49868281518110613d3b57fe5b6020026020010151866143c7565b90910190600101613d24565b50949350505050565b60008183613dad5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561229f578181015183820152602001612287565b506000838581613db957fe5b0495945050505050565b336000908152600e602052604090208054613de4908363ffffffff61232b16565b815560010180546001600160a01b0319163317905550565b6000613e066143e4565b33600090815260136020908152604080832080546001818101835591855283852001859055878452601283529083208054918201815583529120018190559050613e4e6146bd565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b8054600282015460009114613f5d576040805162461bcd60e51b815260206004820152601660248201527514dd185ad948185b5bdd5b9d081a5b98dbdc9c9958dd60521b604482015290519081900360640190fd5b8154600183015460085460408051630a54871760e31b8152600481018590526024810184905290516001600160a01b03909216916352a438b89160448082019260009290919082900301818387803b158015613fb857600080fd5b505af1158015613fcc573d6000803e3d6000fd5b50506008546040805163033060d960e41b815230600482015290516000945061405a93506001926001600160a01b0316916333060d90916024808301926020929190829003018186803b15801561402257600080fd5b505afa158015614036573d6000803e3d6000fd5b505050506040513d602081101561404c57600080fd5b50519063ffffffff6122e216565b9050614064614681565b61406e30836143f2565b805160088801805464ffffffffff90921664ffffffffff1990921691909117808255600c5460078a01554260098a015566ffff00000000001916600160281b17905590506140ba614510565b5080516040805186815264ffffffffff90921660208301528051899286927fe6e27f56b3cdde69e5d0a9bcdef1ef34500823c80d47d320e171687080f8fbb292918290030190a35060019695505050505050565b6000808085614129575066354a6ba7a18000905060246141a1565b8560011415614145575066354a6ba7a18000905061016d6141a1565b8560021415614161575066354a6ba7a180009050610e426141a1565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c696420706f6f6c5479706560801b604482015290519081900360640190fd5b60006141ab61451e565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805466ff0000000000001916600160301b179055909150861561426b57600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff1916909117905560068401909152902054614245908863ffffffff61232b16565b33600090815260068301602052604090205561426087613dc3565b61426b878388613dfc565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815465ff000000000019909116600160281b9182900460ff908116151590920217808455915466ff00000000000019909216600160301b92839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b60008061437783606463ffffffff61262516565b905033610ea4818361452c565b61438c61471d565b506040805160608101825268ffffffffffffffffff8381168252604884901c16602082015260909290921c66ffffffffffffff169082015290565b6000826020015183600001518302816143dc57fe5b049392505050565b600a80546001019081905590565b6143fa614681565b60085460408051632607443b60e01b81526001600160a01b038681166004830152602482018690529151600093849384938493849384938493911691632607443b9160448082019260e092909190829003018186803b15801561445c57600080fd5b505afa158015614470573d6000803e3d6000fd5b505050506040513d60e081101561448657600080fd5b50805160208083015160408085015160608087015160808089015160a0808b015160c09b8c0151885160e081018a5264ffffffffff909c168c5268ffffffffffffffffff998a169a8c019a909a52979095169589019590955261ffff91821692880192909252928316908601529116908301521515918101919091529a9950505050505050505050565b600c80546001019081905590565b600b80546001019081905590565b806001600160a01b038316614588576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025460ff1661467c57600354600454101561467c576003546004546145b4908363ffffffff61232b16565b11156145e9576004546003546145cf9163ffffffff6122e216565b6003546004556002805460ff191660011790559050614600565b6004546145fc908263ffffffff61232b16565b6004555b6001600160a01b038316600090815260208190526040902054614629908263ffffffff61232b16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604051806101a00160405280600d906020820280388339509192915050565b6040518060600160405280600081526020016000815260200160008152509056fe63616e6e6f7420656e7465722c20706f6f6c73206e6f7420696e697469616c697a656445524332303a207472616e7366657220746f20746865207a65726f2061646472657373616d6f756e74206f766572207468726573686f6c64202d206f6e6c792031206e657720706f6f6c20746f20626520637265617465642070657220747845524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f20616464726573734572726f723a20636f756c64206e6f74207769746864726177207265776172647345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654572726f723a20756e73756666696369656e742066726f7a656e2062616c616e63654572726f723a20706f6f6c206973206e6f7420796574207374616b65642c206f722068617320616c726561647920656e646564207374616b696e676e6f7420656e747279206f776e65722c206f7220616c7265616479206578697465644572726f723a2076616c7565206d7573742062652067726561746572207468616e206d696e456e747279486561727473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e9364736f6c634300050d0032

Deployed Bytecode Sourcemap

12356:28491:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15402:14;;;;12356:28491;12044:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12044:134:1;;;:::i;:::-;;;;;;;;;;;;;;;;2116:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2116:39:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2116:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3476:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3476:150:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3476:150:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30354:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30354:154:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30354:154:1;;:::i;30553:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30553:171:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30553:171:1;;:::i;2499:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2499:91:1;;;:::i;13273:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13273:25:1;;;:::i;2312:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2312:23:1;;;:::i;4098:300::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4098:300:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4098:300:1;;;;;;;;;;;;;;;;;:::i;11381:505::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11381:505:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11381:505:1;;:::i;32488:686::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32488:686:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32488:686:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2207:33:1;;;:::i;33935:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33935:164:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33935:164:1;;;;;;-1:-1:-1;;;;;33935:164:1;;:::i;31263:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31263:297:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31263:297:1;;:::i;4807:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4807:206:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4807:206:1;;;;;;;;:::i;33750:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33750:144:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33750:144:1;;:::i;31756:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31756:301:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31756:301:1;-1:-1:-1;;;;;31756:301:1;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31756:301:1;-1:-1:-1;;;;;31756:301:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31756:301:1;;;;;;;;;;;;;;;;;;;34362:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34362:151:1;;;:::i;2653:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2653:110:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2653:110:1;-1:-1:-1;;;;;2653:110:1;;:::i;34681:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34681:116:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34681:116:1;;:::i;37770:220::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37770:220:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37770:220:1;;-1:-1:-1;;;;;37770:220:1;;;;;;;;:::i;24847:489::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24847:489:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24847:489:1;;:::i;2269:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2269:20:1;;;:::i;13179:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13179:30:1;;;:::i;2342:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2342:52:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2342:52:1;-1:-1:-1;;;;;2342:52:1;;:::i;32091:364::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32091:364:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32091:364:1;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32091:364:1;;;;;;;;;;;;;;;;;;;;;31576:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31576:147:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31576:147:1;;:::i;2162:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2162:38:1;;;:::i;12216:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12216:133:1;;;:::i;13232:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13232:24:1;;;:::i;5516:257::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5516:257:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5516:257:1;;;;;;;;:::i;13374:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13374:42:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13374:42:1;-1:-1:-1;;;;;13374:42:1;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13374:42:1;;;;;;;;;;;;;;;;30168:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30168:152:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30168:152:1;;:::i;2976:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2976:156:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2976:156:1;;;;;;;;:::i;13472:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13472:39:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13472:39:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33412:278;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33412:278:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33412:278:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37998:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37998:289:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37998:289:1;;-1:-1:-1;;;;;37998:289:1;;;;;;;;:::i;13423:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13423:42:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13423:42:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13423:42:1;;;;;;;;;;;;;;;;;;;;;29844:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29844:240:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29844:240:1;;;;;;;;;;;-1:-1:-1;;;;;29844:240:1;;:::i;30930:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30930:158:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30930:158:1;;:::i;10801:537::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10801:537:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10801:537:1;;:::i;34155:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34155:163:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34155:163:1;;;;;;-1:-1:-1;;;;;34155:163:1;;:::i;13318:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13318:26:1;;;:::i;3195:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3195:134:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3195:134:1;;;;;;;;;;:::i;31104:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31104:143:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31104:143:1;;:::i;33220:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33220:151:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33220:151:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33220:151:1;;;;;;;;;;;;;;;;;12044:134;12159:11;;12044:134;:::o;2116:39::-;;;;;;;;;;;;;;-1:-1:-1;;;2116:39:1;;;;:::o;3476:150::-;3542:4;3559:37;3568:10;3580:7;3589:6;3559:8;:37::i;:::-;-1:-1:-1;3614:4:1;3476:150;;;;;:::o;30354:154::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30452:17;30461:7;30452:8;:17::i;:::-;30444:56;;;;;-1:-1:-1;;;30444:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15193:6:1;:14;;-1:-1:-1;;15193:14:1;;;30354:154::o;30553:171::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30650:28;30670:7;30650:19;:28::i;:::-;30642:74;;;;-1:-1:-1;;;30642:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2499:91;2570:12;;2499:91;:::o;13273:25::-;;;;:::o;2312:23::-;;;;:::o;4098:300::-;4187:4;4204:36;4214:6;4222:9;4233:6;4204:9;:36::i;:::-;4251:117;4260:6;4268:10;4280:87;4316:6;4280:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4280:19:1;;;;;;:11;:19;;;;;;;;4300:10;4280:31;;;;;;;;;:87;;:35;:87;:::i;:::-;4251:8;:117::i;:::-;-1:-1:-1;4386:4:1;4098:300;;;;;:::o;11381:505::-;11461:1;11455:3;:7;11447:30;;;;;-1:-1:-1;;;11447:30:1;;;;;;;;;;;;-1:-1:-1;;;11447:30:1;;;;;;;;;;;;;;;11516:10;11496:31;;;;:19;:31;;;;;;:38;-1:-1:-1;11496:38:1;11488:84;;;;-1:-1:-1;;;11488:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11674:10;11654:31;;;;:19;:31;;;;;;:40;;11690:3;11654:40;:35;:40;:::i;:::-;11640:10;11620:31;;;;:19;:31;;;;;:74;11736:11;;:20;;11752:3;11736:20;:15;:20;:::i;:::-;11722:11;:34;11767:41;11785:4;11792:10;11804:3;11767:9;:41::i;:::-;11848:30;;11874:3;;11862:10;;11848:30;;;;;11381:505;:::o;32488:686::-;32579:27;32868:13;;;:5;:13;;;;;:32;;32915;;;;32962:23;;;;33000:22;;;;33037:23;;;;33075:37;;;;33127:24;;;;;32868:32;;32915;;32962:23;;33000:22;;-1:-1:-1;;;33037:23:1;;;;;;;;33075:37;33127:24;;32488:686::o;2207:33::-;2239:1;2207:33;:::o;33935:164::-;34032:4;34060:9;;;:5;:9;;;;;;;;-1:-1:-1;;;;;34060:31:1;;;;:25;;:31;;;;;;;;33935:164;;;;:::o;31263:297::-;31352:4;31493:13;;;:5;:13;;;;;31530:1;31493:32;;;;31549:3;;31450:95;;31492:52;;31538:5;;31493:39;;;:36;:39;:::i;:::-;31492:45;:52;:45;:52;:::i;:::-;31450:13;;;;:5;:13;;;;;:37;;;;:95;:41;:95;:::i;:::-;:102;;31443:109;;31263:297;;;;:::o;4807:206::-;4913:10;4887:4;4934:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4934:32:1;;;;;;;;;;4887:4;;4904:79;;4925:7;;4934:48;;4971:10;4934:48;:36;:48;:::i;33750:144::-;33836:4;33865:21;;;:13;:21;;;;;;;33750:144::o;31756:301::-;-1:-1:-1;;;;;31973:11:1;;;31848:26;31973:11;;;:5;:11;;;;;;;;:30;;32005:12;:18;;;;;32025:11;;;:23;;;;;31966:83;;;;;;;;;;;;;;;;;31848:26;;31885:23;;31848:26;;31973:30;;32005:18;;32025:23;;;;;32005:18;;31966:83;;;32005:18;31966:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31756:301;;;;;:::o;34362:151::-;34468:12;;:37;;;-1:-1:-1;;;34468:37:1;;34499:4;34468:37;;;;;;34439:4;;-1:-1:-1;;;;;34468:12:1;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;34468:37:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34468:37:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34468:37:1;;-1:-1:-1;34362:151:1;:::o;2653:110::-;-1:-1:-1;;;;;2737:18:1;2710:7;2737:18;;;;;;;;;;;;2653:110::o;34681:116::-;14622:10;;-1:-1:-1;;;;;14622:10:1;14608;:24;14600:45;;;;;-1:-1:-1;;;14600:45:1;;;;;;;;;;;;-1:-1:-1;;;14600:45:1;;;;;;;;;;;;;;;34766:14;:23;34681:116::o;37770:220::-;37866:7;37891:15;;:::i;:::-;37909:32;37927:4;37933:7;37909:17;:32::i;:::-;37891:50;;37961:21;37980:1;37961:18;:21::i;:::-;37954:28;37770:220;-1:-1:-1;;;;37770:220:1:o;24847:489::-;24940:4;24986:13;;;:5;:13;;;;;25018:15;;;;;;25010:59;;;;;-1:-1:-1;;;25010:59:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25103:10;25083:31;;;;:19;;;:31;;;;;;25080:75;;25142:1;25135:8;;;;;25080:75;25247:23;;25230:10;25165:22;25210:31;;;:19;;;:31;;;;;;25190:15;;;;25165:22;;25190:81;;25247:23;;25190:52;;:15;:52;:19;:52;:::i;:::-;:56;:81;:56;:81;:::i;2269:20::-;;;;:::o;13179:30::-;;;;:::o;2342:52::-;;;;;;;;;;;;;:::o;32091:364::-;32184:19;32337:16;;;:7;:16;;;;;:27;;32366:23;;;;32391:28;;;;32421:25;;;;;32337:27;;32366:23;;-1:-1:-1;;;;;32391:28:1;;;;32421:25;;32091:364::o;31576:147::-;31662:4;31691:13;;;:5;:13;;;;;:24;;;;;;31576:147::o;2162:38::-;;;;;;;;;;;;;;-1:-1:-1;;;2162:38:1;;;;:::o;12216:133::-;12288:7;12320:21;12330:10;12320:9;:21::i;:::-;12313:28;;12216:133;:::o;13232:24::-;;;;:::o;5516:257::-;5601:4;5618:125;5627:10;5639:7;5648:94;5685:15;5648:94;;;;;;;;;;;;;;;;;5660:10;5648:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;5648:32:1;;;;;;;;;;;:94;;:36;:94;:::i;13374:42::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13374:42:1;;:::o;30168:152::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30263:18;30272:8;30263;:18::i;:::-;30255:57;;;;;-1:-1:-1;;;30255:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;2976:156;3045:4;3062:40;3072:10;3084:9;3095:6;3062:9;:40::i;13472:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13472:39:1;;;;;-1:-1:-1;;;13472:39:1;;;;;;;;;:::o;33412:278::-;33498:12;33574:13;;;:5;:13;;;;;:21;;;;33630:24;;;;;33498:12;;;;33597:58;;33623:4;;33630:24;;33597:17;:58::i;:::-;33657:13;;;;:5;:13;;;;;;:24;;;33567:115;;33657:24;;;;;-1:-1:-1;33412:278:1;-1:-1:-1;;33412:278:1:o;37998:289::-;38096:7;38121:19;;:::i;:::-;38143:32;38161:4;38167:7;38143:17;:32::i;:::-;38121:54;;38188:16;38207:25;38226:5;38207:18;:25::i;:::-;38250:18;;;;;:29;;;;;;-1:-1:-1;;37998:289:1;;;;:::o;13423:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13423:42:1;;;;;;:::o;29844:240::-;29947:7;29956;14732:16;14745:2;14732:12;:16::i;:::-;14724:60;;;;;-1:-1:-1;;;14724:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;14809:12;;14803:2;:18;;14795:57;;;;;-1:-1:-1;;;14795:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;14880:14;;14871:6;:23;14863:84;;;;-1:-1:-1;;;14863:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30011:33;30021:7;30030;30039:4;30011:9;:33::i;:::-;30003:73;;;;;-1:-1:-1;;;30003:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15193:6:1;:14;;-1:-1:-1;;15193:14:1;;;-1:-1:-1;;;29844:240:1:o;30930:158::-;15011:5;;31029:4;;15011:5;;;;;15003:53;;;;-1:-1:-1;;;15003:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31058:13:1;;;;:5;:13;;;;;:22;;;-1:-1:-1;;;31058:22:1;;;;;30930:158::o;10801:537::-;10879:1;10873:3;:7;10865:30;;;;;-1:-1:-1;;;10865:30:1;;;;;;;;;;;;-1:-1:-1;;;10865:30:1;;;;;;;;;;;;;;;10932:3;10914:14;:12;:14::i;:::-;:21;;10906:61;;;;;-1:-1:-1;;;10906:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;11089:58;11125:21;11133:12;:3;11141;11133:12;:7;:12;:::i;:::-;11125:3;;:21;:7;:21;:::i;:::-;11109:10;11089:31;;;;:19;:31;;;;;;;:58;:35;:58;:::i;:::-;11075:10;11055:31;;;;:19;:31;;;;;:92;11172:38;11188:21;11196:12;:3;11204;11196:12;:7;:12;:::i;11188:21::-;11172:11;;;:38;:15;:38;:::i;:::-;11158:11;:52;11221:41;11231:10;11251:4;11258:3;11221:9;:41::i;:::-;11302:28;;11326:3;;11314:10;;11302:28;;;;;10801:537;:::o;34155:163::-;34252:4;34280:9;;;:5;:9;;;;;;;;-1:-1:-1;;;;;34280:30:1;;;;:24;;:30;;;;;;34155:163;;;;:::o;13318:26::-;;;;:::o;3195:134::-;-1:-1:-1;;;;;3294:18:1;;;3267:7;3294:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3195:134::o;31104:143::-;31187:4;31216:13;;;:5;:13;;;;;:23;;;-1:-1:-1;;;31216:23:1;;;;;31104:143::o;33220:151::-;33343:20;;;;:12;:20;;;;;;;;;33336:27;;;;;;;;;;;;;;;;;33305:13;;33336:27;;;33343:20;33336:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33220:151;;;:::o;8982:338::-;-1:-1:-1;;;;;9076:19:1;;9068:68;;;;-1:-1:-1;;;9068:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9155:21:1;;9147:68;;;;-1:-1:-1;;;9147:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9228:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9280:32;;;;;;;;;;;;;;;;;8982:338;;;:::o;22675:1093::-;22742:4;22782:12;;22772:6;:22;;22764:61;;;;;-1:-1:-1;;;22764:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;22836:21;22860:13;;;:5;:13;;;;;22892:14;;;;-1:-1:-1;;;22892:14:1;;;;22884:86;;;;-1:-1:-1;;;22884:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22989:27;23009:6;22989:19;:27::i;:::-;22981:67;;;;;-1:-1:-1;;;22981:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;23061:18;23082:20;:18;:20::i;:::-;23171:12;;;23226:15;;;;23061:41;;-1:-1:-1;;;;;;23171:12:1;;:21;;23193:49;;23219:4;;23226:15;;23193:17;:49::i;:::-;23244:15;;;;23171:89;;;-1:-1:-1;;;;;;23171:89:1;;;;;;;;;;;;;;23244:15;;;;23171:89;;;;;;;;;;23244:15;;23171:89;;;;;;;23244:15;23171:89;;;;5:2:-1;;;;30:1;27;20:12;5:2;23171:89:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;23271:14:1;;;:22;;-1:-1:-1;;23271:22:1;;;-1:-1:-1;23304:15:1;;;:22;;-1:-1:-1;;23304:22:1;23271;23304;;;23288:5;23401:36;23426:10;23401:20;:18;:20::i;:::-;:24;:36;:24;:36;:::i;:::-;23448:15;;;:28;;;23521:23;;23380:57;;-1:-1:-1;23506:39:1;;23380:57;;23506:39;:14;:39;:::i;:::-;23487:16;;;:58;;;23686:11;;;;23648:23;;;;23619:14;;;;23712:15;;;;23561:177;;;;;;23712:15;;;;23561:177;;;;;;23686:11;;23648:23;;23619:14;;23561:177;;;;;;;;;;;-1:-1:-1;23756:4:1;;22675:1093;-1:-1:-1;;;;22675:1093:1:o;23864:921::-;23941:4;23987:13;;;:5;:13;;;;;24019:14;;;;24011:61;;;;;-1:-1:-1;;;24011:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;24134:1;24091:13;;;:5;:13;;;;;;;;24120:10;24091:40;;:28;;:40;;;;;;24083:87;;;;;-1:-1:-1;;;24083:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;24185:15;;;;;;24181:63;;24216:16;24225:6;24216:8;:16::i;:::-;;24181:63;24254:12;24269:30;24292:6;24269:22;:30::i;:::-;24388:10;24368:31;;;;:19;;;:31;;;;;;24349:14;;;;24254:45;;-1:-1:-1;24349:51:1;;:14;:51;:18;:51;:::i;:::-;24332:14;;;:68;;;24450:10;24464:1;24430:31;;;:19;;;:31;;;;;:35;24517:14;24514:92;;24559:13;;;;:5;:13;;;;;24552:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24552:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24552:20:1;;;24514:92;24624:12;;:42;;;-1:-1:-1;;;24624:42:1;;24646:10;24624:42;;;;;;;;;;;;-1:-1:-1;;;;;24624:12:1;;;;:21;;:42;;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;24624:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24624:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24624:42:1;24616:70;;;;;-1:-1:-1;;;24616:70:1;;;;;;;;;;;;-1:-1:-1;;;24616:70:1;;;;;;;;;;;;;;;24724:31;;24747:7;;24735:10;;24724:31;;;;;-1:-1:-1;24773:4:1;;23864:921;-1:-1:-1;;;23864:921:1:o;6263:605::-;-1:-1:-1;;;;;6361:20:1;;6353:70;;;;-1:-1:-1;;;6353:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6442:23:1;;6434:71;;;;-1:-1:-1;;;6434:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6540:10;6553:15;:6;6564:3;6553:15;:10;:15;:::i;:::-;6540:28;-1:-1:-1;6579:11:1;6593:17;:6;6540:28;6593:17;:10;:17;:::i;:::-;6579:31;;6641:71;6663:6;6641:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6641:17:1;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;6621:17:1;;;:9;:17;;;;;;;;;;;:91;;;;6746:20;;;;;;;:32;;6771:6;6746:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;6723:20:1;;:9;:20;;;;;;;;;;:55;6789:20;6795:6;6803:5;6789;:20::i;:::-;6842:9;-1:-1:-1;;;;;6825:35:1;6834:6;-1:-1:-1;;;;;6825:35:1;;6853:6;6825:35;;;;;;;;;;;;;;;;;;6263:605;;;;;:::o;1789:192:3:-;1875:7;1911:12;1903:6;;;;1895:29;;;;-1:-1:-1;;;1895:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1895:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1947:5:3;;;1789:192::o;1316:136::-;1374:7;1401:43;1405:1;1408;1401:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1394:50;1316:136;-1:-1:-1;;;1316:136:3:o;860:181::-;918:7;950:5;;;974:6;;;;966:46;;;;;-1:-1:-1;;;966:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;2232:471;2290:7;2535:6;2531:47;;-1:-1:-1;2565:1:3;2558:8;;2531:47;2602:5;;;2606:1;2602;:5;:1;2626:5;;;;;:10;2618:56;;;;-1:-1:-1;;;2618:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39089:1017:1;39179:13;;:::i;:::-;39212:14;39237:19;39267:18;39296:16;39323:17;39351:18;39380:16;39409:18;39430:12;;;;;;;;;-1:-1:-1;;;;;39430:12:1;-1:-1:-1;;;;;39430:23:1;;39454:4;39430:29;;;;;;;;;;;;;-1:-1:-1;;;;;39430:29:1;-1:-1:-1;;;;;39430:29:1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39430:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39430:29:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39430:29:1;;-1:-1:-1;39474:9:1;39470:629;39493:10;39489:1;:14;39470:629;;;39690:12;;:32;;;-1:-1:-1;;;39690:32:1;;-1:-1:-1;;;;;39690:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;39690:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39690:32:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;39690:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;-1:-1:-1;39690:32:1;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;-1:-1:-1;39742:14:1;;;;;;;;39739:349;;;-1:-1:-1;;39783:289:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39776:296:1;;39739:349;39505:3;;39470:629;;;;39089:1017;;;;;;;;;;;;:::o;37328:434::-;37447:11;;;;37410:7;;37435:23;;37410:7;37481:16;:14;:16::i;:::-;37469:28;;37541:1;37536;:6;37532:223;;37601:1;37594:8;;;;;;37532:223;37635:28;37666:18;37679:1;37682;37666:12;:18::i;:::-;37635:49;;37706:37;37723:4;37729:1;:13;;;37706:37;;:16;:37::i;:::-;37699:44;;;;;;;3171:132:3;3229:7;3256:39;3260:1;3263;3256:39;;;;;;;;;;;;;;;;;:3;:39::i;25382:2533:1:-;25450:4;25472:22;;:::i;:::-;-1:-1:-1;25497:16:1;;;;:7;:16;;;;;;;;;25472:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25472:41:1;;;;;;;;;;;;;;;;;;;;25532:10;:31;25524:78;;;;-1:-1:-1;;;25524:78:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25643:12;;;;;25613:21;25637:19;;;:5;:19;;;;;;25696:10;25675:32;;:20;;;:32;;;;;;;;25667:75;;;;;-1:-1:-1;;;25667:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25762:14;;;;-1:-1:-1;;;25762:14:1;;;;25761:15;25753:56;;;;;-1:-1:-1;;;25753:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25900:16;;25865:10;25900:16;25859:17;;;:5;:17;;;;;:36;:58;;;:40;:58;:::i;:::-;25826:10;25820:17;;;;:5;:17;;;;;:97;25964:16;;25945:14;;;;:36;;;:18;:36;:::i;:::-;25928:14;;;:53;26082:16;;26066:10;26082:16;26046:31;;;:19;;;:31;;;;;;:53;;;:35;:53;:::i;:::-;26032:10;26012:31;;;;:19;;;:31;;;;;:87;;;26189:151;;26265:10;26279:5;26244:32;;;:20;;;:32;;;;;;;;:40;;-1:-1:-1;;26244:40:1;;;26313:12;;;;26299:27;;:13;:27;;;;;:29;;-1:-1:-1;;26299:29:1;;;26189:151;26357:16;;;;:7;:16;;;;;26350:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26350:23:1;;;;;;;;;;;;;;;;;26423:16;;:25;;12955:3;26423:25;:20;:25;:::i;:::-;26411:37;-1:-1:-1;26459:12:1;26474:16;26411:37;12994:1;26474:16;:8;:16;:::i;:::-;26459:31;-1:-1:-1;26501:13:1;26517:17;:4;13047:1;26517:17;:8;:17;:::i;:::-;26501:33;-1:-1:-1;26545:12:1;26560:16;:4;13100:1;26560:16;:8;:16;:::i;:::-;26602;;26545:31;;-1:-1:-1;26587:12:1;;26602:26;;26623:4;26602:26;:20;:26;:::i;:::-;26652:8;;26587:41;;-1:-1:-1;26652:12:1;26649:343;;26688:12;;26710:10;;26722:8;;-1:-1:-1;;;;;26688:12:1;;;;:21;;26710:10;;26722:15;;26735:1;26722:15;:12;:15;:::i;:::-;26688:50;;;;;;;;;;;;;-1:-1:-1;;;;;26688:50:1;-1:-1:-1;;;;;26688:50:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26688:50:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26688:50:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26688:50:1;26680:78;;;;;-1:-1:-1;;;26680:78:1;;;;;;;;;;;;-1:-1:-1;;;26680:78:1;;;;;;;;;;;;;;;26845:12;;26880:8;;-1:-1:-1;;;;;26845:12:1;;;;:21;;12884:42;;26880:15;;26893:1;26880:15;:12;:15;:::i;:::-;26845:51;;;;;;;;;;;;;-1:-1:-1;;;;;26845:51:1;-1:-1:-1;;;;;26845:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26845:51:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26845:51:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26845:51:1;26837:79;;;;;-1:-1:-1;;;26837:79:1;;;;;;;;;;;;-1:-1:-1;;;26837:79:1;;;;;;;;;;;;;;;27005:14;;;;-1:-1:-1;;;;;27005:28:1;27002:376;;27104:8;:18;;;27002:376;;;27230:14;:7;27242:1;27230:14;:11;:14;:::i;:::-;27219:8;:25;27267:12;;27289:14;;;;-1:-1:-1;;;;;27267:12:1;;;;:21;;27305:14;:7;27317:1;27305:14;:11;:14;:::i;:::-;27267:53;;;;;;;;;;;;;-1:-1:-1;;;;;27267:53:1;-1:-1:-1;;;;;27267:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27267:53:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27267:53:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27267:53:1;27259:85;;;;;-1:-1:-1;;;27259:85:1;;;;;;;;;;;;-1:-1:-1;;;27259:85:1;;;;;;;;;;;;;;;27412:12;;:42;;;-1:-1:-1;;;27412:42:1;;27434:10;27412:42;;;;;;;;;;;;-1:-1:-1;;;;;27412:12:1;;;;:21;;:42;;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;27412:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27412:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27412:42:1;27404:70;;;;;-1:-1:-1;;;27404:70:1;;;;;;;;;;;;-1:-1:-1;;;27404:70:1;;;;;;;;;;;;;;;27525:12;;27547:10;;27525:42;;;-1:-1:-1;;;27525:42:1;;-1:-1:-1;;;;;27547:10:1;;;27525:42;;;;;;;;;;;;:12;;;;;:21;;:42;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;27525:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27525:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27525:42:1;27517:75;;;;;-1:-1:-1;;;27517:75:1;;;;;;;;;;;;-1:-1:-1;;;27517:75:1;;;;;;;;;;;;;;;27628:12;;:44;;;-1:-1:-1;;;27628:44:1;;12884:42;27628:44;;;;;;;;;;;;-1:-1:-1;;;;;27628:12:1;;;;:21;;:44;;;;;;;;;;;;;;;:12;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;27628:44:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27628:44:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27628:44:1;27620:77;;;;;-1:-1:-1;;;27620:77:1;;;;;;;;;;;;-1:-1:-1;;;27620:77:1;;;;;;;;;;;;;;;27835:5;:13;;;27804:5;:16;;;27772:5;:17;;;-1:-1:-1;;;;;27749:136:1;;27863:4;:11;;;27749:136;;;;;;;;;;;;;;;;;;-1:-1:-1;27903:4:1;;25382:2533;-1:-1:-1;;;;;;;;25382:2533:1:o;40114:730::-;40216:4;40238:14;40263:19;40293:18;40322:16;40349:17;40377:18;40406:16;40435:18;40456:12;;;;;;;;;-1:-1:-1;;;;;40456:12:1;-1:-1:-1;;;;;40456:23:1;;40480:4;40456:29;;;;;;;;;;;;;-1:-1:-1;;;;;40456:29:1;-1:-1:-1;;;;;40456:29:1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40456:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40456:29:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40456:29:1;;-1:-1:-1;40500:9:1;40496:341;40519:10;40515:1;:14;40496:341;;;40716:12;;:32;;;-1:-1:-1;;;40716:32:1;;-1:-1:-1;;;;;40716:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;40716:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40716:32:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;40716:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;-1:-1:-1;40716:32:1;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;-1:-1:-1;40768:14:1;;;;;;;;40765:61;;;40809:1;-1:-1:-1;40802:8:1;;-1:-1:-1;;;;;;;;40802:8:1;40765:61;40531:3;;40496:341;;17838:3669;17939:4;17985:13;;;:5;:13;;;;;18027:23;;18017:33;;;18009:106;;;;-1:-1:-1;;;18009:106:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18135:14;;;;-1:-1:-1;;;18135:14:1;;;;18134:15;18126:43;;;;;-1:-1:-1;;;18126:43:1;;;;;;;;;;;;-1:-1:-1;;;18126:43:1;;;;;;;;;;;;;;;18204:9;18216:15;:6;12955:3;18216:15;:10;:15;:::i;:::-;18204:27;-1:-1:-1;18242:12:1;18257:16;18204:27;12994:1;18257:16;:8;:16;:::i;:::-;18242:31;-1:-1:-1;18284:13:1;18300:17;:4;13047:1;18300:17;:8;:17;:::i;:::-;18284:33;-1:-1:-1;18328:12:1;18343:16;:4;13100:1;18343:16;:8;:16;:::i;:::-;18328:31;-1:-1:-1;18370:12:1;18385:16;:6;18396:4;18385:16;:10;:16;:::i;:::-;18429:14;;;;18370:31;;-1:-1:-1;18429:27:1;;18370:31;18429:27;:18;:27;:::i;:::-;18412:14;;;:44;18542:10;18521:32;;;;:20;;;:32;;;;;;;;18517:141;;18590:10;18569:32;;;;:20;;;:32;;;;;;;;:39;;-1:-1:-1;;18569:39:1;18604:4;18569:39;;;;;;18623:21;;;:13;:21;;;;;;:23;;;;;;;18517:141;18841:10;18821:31;;;;:19;;;:31;;;;;;:44;;18857:7;18821:44;:35;:44;:::i;:::-;18807:10;18787:31;;;;:19;;;:31;;;;;:78;18901:8;;:12;18898:145;;18937:12;;18971:8;;18937:43;;;-1:-1:-1;;;18937:43:1;;18959:10;18937:43;;;;;;;;;;;;-1:-1:-1;;;;;18937:12:1;;;;:21;;:43;;;;;;;;;;;;;;;:12;;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;18937:43:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18937:43:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18937:43:1;18929:71;;;;;-1:-1:-1;;;18929:71:1;;;;;;;;;;;;-1:-1:-1;;;18929:71:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;19056:17:1;;19053:344;;19136:8;:18;;;19053:344;;;19244:14;:7;19256:1;19244:14;:11;:14;:::i;:::-;19233:8;:25;19281:12;;-1:-1:-1;;;;;19281:12:1;:25;19307:10;19319:3;19324:14;:7;19336:1;19324:14;:11;:14;:::i;:::-;19281:58;;;;;;;;;;;;;-1:-1:-1;;;;;19281:58:1;-1:-1:-1;;;;;19281:58:1;;;;;;-1:-1:-1;;;;;19281:58:1;-1:-1:-1;;;;;19281:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19281:58:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19281:58:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19281:58:1;19273:90;;;;;-1:-1:-1;;;19273:90:1;;;;;;;;;;;;-1:-1:-1;;;19273:90:1;;;;;;;;;;;;;;;19431:12;;19496:8;;-1:-1:-1;;;;;19431:12:1;;;;:25;;19457:10;;19477:4;;19484:21;;:7;;:21;:11;:21;:::i;:::-;19431:75;;;;;;;;;;;;;-1:-1:-1;;;;;19431:75:1;-1:-1:-1;;;;;19431:75:1;;;;;;-1:-1:-1;;;;;19431:75:1;-1:-1:-1;;;;;19431:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19431:75:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19431:75:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19431:75:1;19423:103;;;;;-1:-1:-1;;;19423:103:1;;;;;;;;;;;;-1:-1:-1;;;19423:103:1;;;;;;;;;;;;;;;19611:12;;19649:10;;19611:58;;;-1:-1:-1;;;19611:58:1;;19637:10;19611:58;;;;-1:-1:-1;;;;;19649:10:1;;;19611:58;;;;;;;;;;;;:12;;;;;:25;;:58;;;;;;;;;;;;;;:12;;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;19611:58:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19611:58:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19611:58:1;19603:91;;;;;-1:-1:-1;;;19603:91:1;;;;;;;;;;;;-1:-1:-1;;;19603:91:1;;;;;;;;;;;;;;;19730:12;;:60;;;-1:-1:-1;;;19730:60:1;;19756:10;19730:60;;;;12884:42;19730:60;;;;;;;;;;;;-1:-1:-1;;;;;19730:12:1;;;;:25;;:60;;;;;;;;;;;;;;;:12;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;19730:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19730:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19730:60:1;19722:93;;;;;-1:-1:-1;;;19722:93:1;;;;;;;;;;;;-1:-1:-1;;;19722:93:1;;;;;;;;;;;;;;;19899:23;;19882:14;;;;:40;19879:1462;;;19980:23;;19961:14;;;;19938:20;;19961:43;;:14;:43;:18;:43;:::i;:::-;19938:66;-1:-1:-1;20059:44:1;20074:28;:7;19938:66;20074:28;:11;:28;:::i;:::-;20059:14;:44::i;:::-;20181:63;20197:28;:7;20209:15;20197:28;:11;:28;:::i;:::-;20227:4;:11;;;20240:3;20181:15;:63::i;:::-;20313:23;;20296:14;;;:40;20498:10;20313:23;20478:31;;;:19;;;:31;;;;;;:52;;20514:15;20478:52;:35;:52;:::i;:::-;20464:10;20444:31;;;;:19;;;:31;;;;;:86;20553:24;20564:6;20444:4;20553:10;:24::i;:::-;20545:65;;;;;-1:-1:-1;;;20545:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;20633:44;20641:4;:13;;;20656:15;20673:3;20633:7;:44::i;:::-;20625:89;;;;;-1:-1:-1;;;20625:89:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19879:1462;;;;20794:23;;20776:14;;;;:41;20773:568;;;20858:23;20873:7;20858:14;:23::i;:::-;20922:42;20938:7;20947:4;:11;;;20960:3;20922:15;:42::i;:::-;20987:24;20998:6;21006:4;20987:10;:24::i;:::-;20979:65;;;;;-1:-1:-1;;;20979:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;21067:30;21075:4;:13;;;21090:1;21093:3;21067:7;:30::i;:::-;21059:75;;;;;-1:-1:-1;;;21059:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20773:568;;;21223:23;21238:7;21223:14;:23::i;:::-;21287:42;21303:7;21312:4;:11;;;21325:3;21287:15;:42::i;:::-;21428:16;21437:6;21428:8;:16::i;:::-;21420:57;;;;;-1:-1:-1;;;21420:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21495:4:1;;17838:3669;-1:-1:-1;;;;;;;;;17838:3669:1:o;8194:348::-;-1:-1:-1;;;;;8270:21:1;;8262:67;;;;-1:-1:-1;;;8262:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8363:68;8386:6;8363:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8363:18:1;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;8342:18:1;;:9;:18;;;;;;;;;;:89;8457:12;;:24;;8474:6;8457:24;:16;:24;:::i;:::-;8442:12;:39;8497:37;;;;;;;;8523:1;;-1:-1:-1;;;;;8497:37:1;;;;;;;;;;;;8194:348;;:::o;37101:219::-;37163:7;37188:29;;:::i;:::-;37220:12;;;;;;;;;-1:-1:-1;;;;;37220:12:1;-1:-1:-1;;;;;37220:23:1;;:25;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37220:25:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37220:25:1;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;37274:13:1;;;;37101:219;-1:-1:-1;;37101:219:1:o;36663:430::-;36814:12;;:33;;;-1:-1:-1;;;36814:33:1;;;;;;;;;;;;;;;;36744:23;;;;-1:-1:-1;;;;;36814:12:1;;;;:27;;:33;;;;;:12;;:33;;;;;;;;:12;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;36814:33:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36814:33:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;36814:33:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;36814:33:1;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;36814:33:1;;421:4:-1;412:14;;;;36814:33:1;;;;;412:14:-1;36814:33:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36814:33:1;;;;;;;;;;;36785:62;;36858:11;36872:9;:16;36858:30;;36899:28;36951:3;36930:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;36899:56:1;-1:-1:-1;36970:9:1;36966:98;36989:3;36985:1;:7;36966:98;;;37023:29;37039:9;37049:1;37039:12;;;;;;;;;;;;;;37023:15;:29::i;:::-;37013:4;37018:1;37013:7;;;;;;;;;;;;;;;;;:39;36994:3;;36966:98;;;-1:-1:-1;37081:4:1;36663:430;-1:-1:-1;;;;;36663:430:1:o;36091:346::-;36246:16;;36207:7;;;;36301:106;36324:3;36320:1;:7;36301:106;;;36357:38;36372:9;36382:1;36372:12;;;;;;;;;;;;;;36386:8;36357:14;:38::i;:::-;36348:47;;;;36329:3;;36301:106;;;-1:-1:-1;36424:5:1;36091:346;-1:-1:-1;;;;36091:346:1:o;3833:345:3:-;3919:7;4021:12;4014:5;4006:28;;;;-1:-1:-1;;;4006:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4006:28:3;;4045:9;4061:1;4057;:5;;;;;;;3833:345;-1:-1:-1;;;;;3833:345:3:o;27948:290:1:-;28049:10;28019:21;28043:17;;;:5;:17;;;;;28097:23;;:35;;28125:6;28097:35;:27;:35;:::i;:::-;28071:61;;28201:16;;:29;;-1:-1:-1;;;;;;28201:29:1;28220:10;28201:29;;;-1:-1:-1;27948:290:1:o;28272:789::-;28378:13;28394:21;:19;:21::i;:::-;28439:10;28426:24;;;;:12;:24;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;28426:39:1;;;;;;;;;;28497:20;;;:12;:20;;;;;27:10:-1;;23:18;;;45:23;;28497:35:1;;;;;;;;28378:37;-1:-1:-1;28564:22:1;;:::i;:::-;28597:25;;;28686:12;;;;:21;;;28754:13;;;;:24;;;28809:10;28789:17;;;:30;;;-1:-1:-1;;;;;28830:20:1;;;:14;;;:20;;;28597:16;28861:17;;;:7;:17;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28861:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;28921:132;;;;;;;28861:25;;;;28921:132;;;;;;;;;28272:789;;;;;:::o;21576:1024::-;21716:23;;21698:14;;;;21668:4;;21698:41;21690:76;;;;;-1:-1:-1;;;21690:76:1;;;;;;;;;;;;-1:-1:-1;;;21690:76:1;;;;;;;;;;;;;;;21800:23;;21855;;;;21889:12;;:55;;;-1:-1:-1;;;21889:55:1;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21889:12:1;;;;:23;;:55;;;;;21777:20;;21889:55;;;;;;;;21777:20;21889:12;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;21889:55:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21976:12:1;;:38;;;-1:-1:-1;;;21976:38:1;;22008:4;21976:38;;;;;;21955:18;;-1:-1:-1;21976:45:1;;-1:-1:-1;22019:1:1;;-1:-1:-1;;;;;21976:12:1;;:23;;:38;;;;;;;;;;;;;;:12;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;21976:38:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21976:38:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21976:38:1;;:45;:42;:45;:::i;:::-;21955:66;;22064:19;;:::i;:::-;22086:45;22110:4;22117:13;22086:15;:45::i;:::-;22234:13;;22216:15;;;:31;;;;;;-1:-1:-1;;22216:31:1;;;;;;;;;;22273:13;;22258:12;;;:28;22328:3;22297:28;;;:34;-1:-1:-1;;22374:21:1;-1:-1:-1;;;22374:21:1;;;22064:67;-1:-1:-1;22406:16:1;:14;:16::i;:::-;-1:-1:-1;22546:13:1;;22438:132;;;;;;;;;;;;;;;;22525:6;;22497:13;;22438:132;;;;;;;;;-1:-1:-1;22588:4:1;;21576:1024;-1:-1:-1;;;;;;21576:1024:1:o;16204:1551::-;16313:4;;;16390:13;16387:529;;-1:-1:-1;16431:17:1;;-1:-1:-1;16501:2:1;16387:529;;;16543:8;16555:1;16543:13;16540:376;;;-1:-1:-1;16584:17:1;;-1:-1:-1;16655:3:1;16540:376;;;16696:8;16708:1;16696:13;16693:223;;;-1:-1:-1;16737:17:1;;-1:-1:-1;16809:4:1;16693:223;;;16878:26;;;-1:-1:-1;;;16878:26:1;;;;;;;;;;;;-1:-1:-1;;;16878:26:1;;;;;;;;;;;;;;16693:223;16926:7;16936:15;:13;:15::i;:::-;16962:21;16986:9;;;:5;:9;;;;;17006:35;;;17060:23;;;:35;;;17106:14;;;:32;;;17157:11;;;:16;;;17184:13;;;:24;;;17219:13;;;:20;;-1:-1:-1;;17219:20:1;-1:-1:-1;;;17219:20:1;;;16926:25;;-1:-1:-1;17253:19:1;;17250:449;;17360:17;;;;:13;:17;;;;;;;;:19;;;;;;;;;17415:10;17394:32;;:20;;;:32;;;;;:39;;-1:-1:-1;;17394:39:1;;;;;;17482:19;;;:31;;;;;;:52;;17518:15;17482:52;:35;:52;:::i;:::-;17468:10;17448:31;;;;:19;;;:31;;;;;:86;17574:31;17589:15;17574:14;:31::i;:::-;17646:41;17662:15;17679:2;17683:3;17646:15;:41::i;:::-;17709:9;;;;:5;:9;;;;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;-1:-1:-1;;;17709:16:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;-1:-1:-1;;;17709:16:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;;;;;;;;;;;;16204:1551;-1:-1:-1;;;;;;16204:1551:1:o;10294:283::-;10360:4;;10393:15;:6;10404:3;10393:15;:10;:15;:::i;:::-;10382:26;-1:-1:-1;10436:10:1;10457:18;10436:10;10382:26;10457:5;:18::i;35687:396::-;35765:21;;:::i;:::-;-1:-1:-1;36039:36:1;;;;;;;;35528:28;35850:15;;;36039:36;;35480:2;35880:22;;;35930:15;36039:36;;;;35960:22;;;;;35652:26;36008:13;36039:36;;;;;35687:396::o;36445:210::-;36554:7;36621:6;:26;;;36597:6;:21;;;36586:8;:32;:61;;;;;;;36445:210;-1:-1:-1;;;36445:210:1:o;29094:153::-;29183:18;:20;;;;;;;;29094:153;:::o;38295:786::-;38384:13;;:::i;:::-;38778:12;;:34;;;-1:-1:-1;;;38778:34:1;;-1:-1:-1;;;;;38778:34:1;;;;;;;;;;;;;;;38415:14;;;;;;;;;;;;;;38778:12;;;:23;;:34;;;;;;;;;;;;;;;:12;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;38778:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38778:34:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;38778:34:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38832:241;;38778:34;38832:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38295:786;-1:-1:-1;;;;;;;;;;38295:786:1:o;29447:138::-;29531:13;:15;;;;;;;;29447:138;:::o;29279:135::-;29362:12;:14;;;;;;;;29279:135;:::o;7149:713::-;7231:6;-1:-1:-1;;;;;7256:21:1;;7248:65;;;;;-1:-1:-1;;;7248:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;7328:9;;;;7324:531;;7371:10;;7356:12;;:25;7353:491;;;7428:10;;7404:12;;:21;;7421:3;7404:21;:16;:21;:::i;:::-;:34;7401:303;;;7483:12;;7468:10;;:28;;;:14;:28;:::i;:::-;7534:10;;7519:12;:25;7567:9;:16;;-1:-1:-1;;7567:16:1;7579:4;7567:16;;;7462:34;-1:-1:-1;7401:303:1;;;7663:12;;:21;;7680:3;7663:21;:16;:21;:::i;:::-;7648:12;:36;7401:303;-1:-1:-1;;;;;7743:18:1;;:9;:18;;;;;;;;;;;:27;;7766:3;7743:27;:22;:27;:::i;:::-;-1:-1:-1;;;;;7722:18:1;;:9;:18;;;;;;;;;;;:48;;;;7794:34;;;;;;;7722:18;;:9;;7794:34;;;;;;;;;;7353:491;7149:713;;;:::o;12356:28491::-;;;;;;;;;-1:-1:-1;12356:28491:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12356:28491:1;;;;;;-1:-1:-1;;;;;12356:28491:1;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;12356:28491:1;;;-1:-1:-1;;12356:28491:1:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e93
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.