ETH Price: $2,273.14 (-0.72%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Withdraw All And...1468706782026-01-25 11:22:138 days ago1769340133IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000035240.00002253
Withdraw All And...1451692252025-12-17 2:07:0748 days ago1765937227IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000001181170.00100146
Withdraw All And...1451692152025-12-17 2:06:4748 days ago1765937207IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000001181050.00100146
Withdraw All And...1451692072025-12-17 2:06:3148 days ago1765937191IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000001180840.00100146
Withdraw All And...1436733142025-11-12 11:03:2582 days ago1762945405IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000001354210.00100066
Withdraw All And...1429064312025-10-25 17:00:39100 days ago1761411639IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000083240.00010038
Withdraw All And...1429064222025-10-25 17:00:21100 days ago1761411621IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000142340.00010038
Withdraw All And...1420795342025-10-06 13:37:25119 days ago1759757845IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000213170.00010066
Withdraw All And...1418335272025-09-30 20:57:11125 days ago1759265831IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000142270.00010033
Harvest1418335222025-09-30 20:57:01125 days ago1759265821IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000153640.00010033
Withdraw All And...1408216572025-09-07 10:48:11148 days ago1757242091IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000012750.00000036
Harvest1406189582025-09-02 18:11:33153 days ago1756836693IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000077020.00002704
Withdraw All And...1394134032025-08-05 20:26:23181 days ago1754425583IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000199210.00010032
Deposit With Per...1394133832025-08-05 20:25:43181 days ago1754425543IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000283320.00010033
Withdraw All And...1389717102025-07-26 15:03:17191 days ago1753542197IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000174280.00010148
Withdraw All And...1386013412025-07-18 1:17:39200 days ago1752801459IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000623310.00010164
Harvest1386013302025-07-18 1:17:17200 days ago1752801437IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000628260.00010163
Withdraw All And...1380224532025-07-04 15:41:23213 days ago1751643683IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000227710.0001017
Harvest1380224472025-07-04 15:41:11213 days ago1751643671IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000242540.00010169
Withdraw All And...1322947292025-02-22 1:37:15346 days ago1740188235IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000011337750.00010058
Harvest1322947232025-02-22 1:37:03346 days ago1740188223IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000012768150.00010058
Withdraw All And...1322461322025-02-20 22:37:21347 days ago1740091041IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.000000025880.00010228
Deposit With Per...1322450142025-02-20 22:00:05347 days ago1740088805IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000371070.00010265
Withdraw All And...1321187342025-02-17 23:50:45350 days ago1739836245IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000001574090.00110058
Withdraw All And...1306647512025-01-15 8:04:39384 days ago1736928279IN
0x1e2F8e5f...1c1C2Cb0c
0 ETH0.0000000474120.00010054
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1075388262023-07-30 0:20:29919 days ago1690676429
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1075388262023-07-30 0:20:29919 days ago1690676429
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1075388262023-07-30 0:20:29919 days ago1690676429
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073512192023-07-25 16:06:55923 days ago1690301215
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073512192023-07-25 16:06:55923 days ago1690301215
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073512192023-07-25 16:06:55923 days ago1690301215
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073508122023-07-25 15:53:21923 days ago1690300401
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073508122023-07-25 15:53:21923 days ago1690300401
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073508122023-07-25 15:53:21923 days ago1690300401
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073502422023-07-25 15:34:21923 days ago1690299261
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073502422023-07-25 15:34:21923 days ago1690299261
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073502422023-07-25 15:34:21923 days ago1690299261
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073498582023-07-25 15:21:33923 days ago1690298493
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073498582023-07-25 15:21:33923 days ago1690298493
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073498582023-07-25 15:21:33923 days ago1690298493
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073494312023-07-25 15:07:19923 days ago1690297639
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073494312023-07-25 15:07:19923 days ago1690297639
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073494312023-07-25 15:07:19923 days ago1690297639
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073487902023-07-25 14:45:57923 days ago1690296357
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073487902023-07-25 14:45:57923 days ago1690296357
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073487902023-07-25 14:45:57923 days ago1690296357
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073462812023-07-25 13:22:19923 days ago1690291339
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073462812023-07-25 13:22:19923 days ago1690291339
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073462812023-07-25 13:22:19923 days ago1690291339
0x1e2F8e5f...1c1C2Cb0c
0 ETH
1073435932023-07-25 11:52:43923 days ago1690285963
0x1e2F8e5f...1c1C2Cb0c
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZipRewards

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 500 runs

Other Settings:
istanbul EvmVersion, MIT license
File 1 of 8 : ZipRewards.sol
// SPDX-License-Identifier: MIT
// based on MiniChefV2 from Sushiswap, fixed some bugs and added possibility of zapping out

pragma solidity ^0.8.11;

import { Ownable } from "Ownable.sol";
import { BoringBatchableWithPermit } from "BoringBatchable.sol";
import "Math.sol";
import "Pausable.sol";
import "BoringERC20.sol";
import "IERC20.sol";

interface IRewarder {
    function notify_onDeposit(uint pid, uint depositedAmount, uint finalBalance, address sender, address to) external;
    //to may be a zapper contract
    function notify_onWithdrawal(uint pid, uint withdrawnAmount, uint remainingAmount, address user, address to) external;
    function notify_onHarvest(uint pid, uint zipAmount, address user, address recipient) external;
    function pendingTokens(uint256 pid, address user, uint256 rewardAmount) external view returns (IERC20[] memory, uint256[] memory);
}

interface IWithdrawalNotifiable {
    function notify_onWithdrawal(uint amount, bytes calldata data) external;
}

interface IDepositNotifiable {
    function notify_onDeposit(uint amount, bytes calldata data) external;
}

// note: withdrawals can't be paused
contract BaseZipRewards is Ownable, BoringBatchableWithPermit, Pausable  {
    using BoringERC20 for IERC20;

    /// @notice Info of each user.
    /// `amount` LP token amount the user has provided.
    /// `rewardDebt` The amount of zipToken entitled to the user.
    struct UserInfo {
        uint128 amount;
        int128 rewardDebt;
    }

    /// @notice Info of each pool.
    /// `allocPoint` The amount of allocation points assigned to the pool.
    /// Also known as the amount of zipToken to distribute per block.
    struct PoolInfo {
        uint accZipPerShare;
        uint64 lastRewardTime;
        uint64 allocPoint;
    }

    /// @notice Address of zipToken contract.
    IERC20 public immutable zipToken;

    /// @notice Info of each pool.
    PoolInfo[] public poolInfo;
    /// @notice Address of the LP token for each pool.
    IERC20[] public lpToken;
    /// @notice Address of each `IRewarder` contract.
    IRewarder[] public rewarder;

    /// @notice Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;

    /// @dev Tokens added
    mapping (address => bool) public addedTokens;

    /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
    uint public totalAllocPoint;

    uint public zipPerSecond;
    //note: maximum theoretically possible balance of Uni2 LP is 2**112-1
    //accZipPerShare is 256 bit. therefore, the maximum supported reward balance is ~10^25 units (*18 decimals)
    uint private constant ACC_ZIP_PRECISION = 2**112-1;
    uint public totalPaidRewards;
    //timestamp when zip rewards run out given current balance
    uint64 public zipRewardsSpentTime;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
    event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
    event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
    event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accZipPerShare);
    event LogZipPerSecond(uint256 zipPerSecond);

    /// @param _zipToken The zipToken token contract address.
    constructor(IERC20 _zipToken) {
        zipToken = _zipToken;
        assert(ACC_ZIP_PRECISION != 0);
    }

    /// @notice Returns the number of pools.
    function poolLength() public view returns (uint256 pools) {
        pools = poolInfo.length;
    }

    /// @notice View function to see pending zipToken on frontend.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _user Address of user.
    /// @return pending zipToken reward for a given user.
    function pendingReward(uint _pid, address _user) external view returns (uint pending) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint accZipPerShare = pool.accZipPerShare;
        uint lpSupply = lpToken[_pid].balanceOf(address(this));

        if (lpSupply > 0 && totalAllocPoint > 0) {
            uint time;
            if(block.timestamp > zipRewardsSpentTime) {
                if(pool.lastRewardTime < zipRewardsSpentTime) {
                    time = zipRewardsSpentTime - pool.lastRewardTime;
                }
                else {
                    time = 0;
                }
            }
            else {
                    time = block.timestamp - pool.lastRewardTime;
            }
            uint tokenReward = time*zipPerSecond*pool.allocPoint/totalAllocPoint;
            accZipPerShare += tokenReward*ACC_ZIP_PRECISION / lpSupply;
        }
        pending = uint(int(uint(user.amount)*accZipPerShare/ACC_ZIP_PRECISION) - user.rewardDebt);
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        if (block.timestamp > pool.lastRewardTime) {
            uint lpSupply = lpToken[pid].balanceOf(address(this));
            if (lpSupply > 0 && totalAllocPoint > 0) {
                uint time;
                if(block.timestamp > zipRewardsSpentTime) {
                    if(pool.lastRewardTime < zipRewardsSpentTime) {
                        time = zipRewardsSpentTime - pool.lastRewardTime;
                    }
                    else {
                        time = 0;
                    }
                }
                else {
                    time = block.timestamp - pool.lastRewardTime;
                }
                uint tokenReward = time*zipPerSecond*pool.allocPoint/totalAllocPoint;
                pool.accZipPerShare += tokenReward*ACC_ZIP_PRECISION / lpSupply;
            }
            pool.lastRewardTime = uint64(block.timestamp);
            poolInfo[pid] = pool;
            emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accZipPerShare);
        }
    }

    /// @notice Update reward variables for all pools. Be careful of gas spending!
    /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
    function massUpdatePools(uint[] calldata pids) external {
        uint len = pids.length;
        for (uint i = 0; i < len; ++i) {
            PoolInfo memory pool = updatePool(pids[i]);
        }
    }

    /// @notice Deposit LP tokens for zipToken allocation.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to deposit.
    /// @param to The receiver of `amount` deposit benefit.
    function deposit(uint pid, uint128 amount, address to) public whenNotPaused {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][to];

        user.amount += amount;
        uint rewardDebtChange = uint(amount)*pool.accZipPerShare / ACC_ZIP_PRECISION;
        user.rewardDebt += int128(uint128(rewardDebtChange));

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.notify_onDeposit(pid, amount, user.amount, msg.sender, to);
        }

        lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);

        emit Deposit(msg.sender, pid, amount, to);
    }

    /// @notice Withdraw LP tokens.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens.
    /// @param ignoreNotifyThrow if error in secondary rewarder should be ignored
    function withdrawLong(uint pid, uint128 amount, address to, bool ignoreNotifyThrow) public {
        (PoolInfo memory pool, UserInfo storage user, uint accumulatedZip, uint pendingZip) = getUserDataUpdatePool(pid, msg.sender);

        user.rewardDebt -= int128(uint128(uint(amount)*pool.accZipPerShare / ACC_ZIP_PRECISION));
        user.amount -= amount;
        
        
        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            try _rewarder.notify_onWithdrawal(pid, amount, user.amount, msg.sender, to) {}
            catch (bytes memory reason) {
                if(!ignoreNotifyThrow) {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }

        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
    }

    function harvestLong(uint pid, address to, bool ignoreNotifyThrow) public whenNotPaused returns (uint) {
        (PoolInfo memory pool, UserInfo storage user, uint accumulatedZip, uint pendingZip) = getUserDataUpdatePool(pid, msg.sender);

        user.rewardDebt = int128(uint128(accumulatedZip));
        transferReward(pid, to, pendingZip, ignoreNotifyThrow);

        emit Harvest(msg.sender, pid, pendingZip);
        return pendingZip;
    }

    /// @notice Withdraw LP tokens and harvest proceeds for transaction sender.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param stakedTo Receiver of the LP tokens
    /// @param rewardsTo Receiver of the zipToken rewards.
    function withdrawAndHarvestLong(uint pid, uint128 amount, address stakedTo, address rewardsTo) public whenNotPaused returns (uint) {
        (PoolInfo memory pool, UserInfo storage user, uint accumulatedZip, uint pendingZip) = getUserDataUpdatePool(pid, msg.sender);

        user.rewardDebt = int128(int(accumulatedZip)-int(uint(amount)*pool.accZipPerShare / ACC_ZIP_PRECISION));
        user.amount -= amount;

        transferReward(pid, rewardsTo, pendingZip, false);

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.notify_onWithdrawal(pid, amount, user.amount, msg.sender, stakedTo);
        }

        lpToken[pid].safeTransfer(stakedTo, amount);

        emit Withdraw(msg.sender, pid, amount, stakedTo);
        emit Harvest(msg.sender, pid, pendingZip);
        return pendingZip;
    }

    function transferReward(uint pid, address rewardsTo, uint rewardAmount, bool ignoreNotifyThrow) internal {
        if(rewardAmount != 0) {
            totalPaidRewards += rewardAmount;
            zipToken.safeTransfer(rewardsTo, rewardAmount);
        }

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            try _rewarder.notify_onHarvest(pid, rewardAmount, msg.sender, rewardsTo) {}
            catch (bytes memory reason) {
                if(!ignoreNotifyThrow) {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }

    function getUserDataUpdatePool(uint pid, address who) internal returns (PoolInfo memory pool, UserInfo storage user, uint accumulatedZip, uint pendingZip) {
        pool = updatePool(pid);
        user = userInfo[pid][who];
        accumulatedZip = uint(user.amount)*pool.accZipPerShare / ACC_ZIP_PRECISION;
        pendingZip = uint(int(accumulatedZip)-int(user.rewardDebt));
    }

    /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the LP tokens.
    function emergencyWithdraw(uint pid, address to) external returns (uint amount) {
        UserInfo storage user = userInfo[pid][msg.sender];
        amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            try _rewarder.notify_onWithdrawal(pid, amount, 0, msg.sender, to) {}
            catch {}
        }

        // Note: transfer can fail or succeed if `amount` is zero.
        lpToken[pid].safeTransfer(to, amount);
        emit EmergencyWithdraw(msg.sender, pid, amount, to);
    }
}

contract BaseZipRewardsWithOwnerFunctions is BaseZipRewards {
    constructor(IERC20 _zipToken) BaseZipRewards(_zipToken) {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////
    // OWNER FUNCTIONS                                                                                  //
    //////////////////////////////////////////////////////////////////////////////////////////////////////
    // note: owner can't transfer users' deposits or block withdrawals

    //before calling set, add, setZipPerSecond all non-zero alloc pools MUST be updated in the same second

    /// @notice Add a new LP to the pool. Can only be called by the owner.
    /// @param allocPoint AP of the new pool.
    /// @param _lpToken Address of the LP ERC-20 token.
    /// @param _rewarder Address of the rewarder delegate.
    function add(uint allocPoint, IERC20 _lpToken, IRewarder _rewarder) external onlyOwner {
        require(addedTokens[address(_lpToken)] == false, "Token already added");
        totalAllocPoint += allocPoint;
        lpToken.push(_lpToken);
        rewarder.push(_rewarder);

        poolInfo.push(PoolInfo({
            allocPoint: uint64(allocPoint),
            lastRewardTime: uint64(block.timestamp),
            accZipPerShare: 0
        }));
        addedTokens[address(_lpToken)] = true;
        emit LogPoolAddition(lpToken.length-1, allocPoint, _lpToken, _rewarder);
    }

    /// @notice Update the given pool's zipToken allocation point and `IRewarder` contract. Can only be called by the owner.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _allocPoint New AP of the pool.
    /// @param _rewarder Address of the rewarder delegate.
    /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
    function set(uint _pid, uint _allocPoint, IRewarder _rewarder, bool overwrite) external onlyOwner {
        totalAllocPoint = totalAllocPoint-poolInfo[_pid].allocPoint+_allocPoint;
        poolInfo[_pid].allocPoint = uint64(_allocPoint);
        if (overwrite) { rewarder[_pid] = _rewarder; }
        emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
    }

    uint64 public totalAccumulatedRewardsLastSetTimestamp;
    uint public totalAccumulatedZipRewards;
    
    /// @notice Sets the zipToken per second to be distributed. Can only be called by the owner.
    /// @param newZipPerSecond The amount of zipToken to be distributed per second.
    function setZipPerSecond(uint newZipPerSecond) external onlyOwner {
        if(block.timestamp <= zipRewardsSpentTime) {
            //contract didn't run out of rewards
            totalAccumulatedZipRewards += zipPerSecond*(block.timestamp-uint(totalAccumulatedRewardsLastSetTimestamp));
        }
        else {
            //contract has run out of rewards
            if(totalAccumulatedRewardsLastSetTimestamp < zipRewardsSpentTime) {
                totalAccumulatedZipRewards += zipPerSecond*uint(zipRewardsSpentTime-totalAccumulatedRewardsLastSetTimestamp);
            }
        }
        uint unclaimedZip = totalAccumulatedZipRewards-totalPaidRewards;
        uint zipForNewRewards = zipToken.balanceOf(address(this))-unclaimedZip;
        uint secondsRewardsCanLast = zipForNewRewards/newZipPerSecond;
        zipRewardsSpentTime = uint64(block.timestamp+zipForNewRewards/newZipPerSecond);
        zipPerSecond = newZipPerSecond;
        totalAccumulatedRewardsLastSetTimestamp = uint64(block.timestamp);
        emit LogZipPerSecond(newZipPerSecond);
    }

    /*
    failsafe functions can be used to fix an incorrect state that may arise from calling set/add/setZipPerSecond by the owner
    without calling updatePool() on pools with non-zero alloc first.
    Unfortunately, gas limit considerations make it impossible to enforce directly.
    */

    function failsafe_setRewardParams
    (uint newZipPerSecond, bool setNewZipPerSecond,
    uint64 newZipRewardsSpentTime, bool setZipRewardsSpentTime,
    uint64 newTotalAccumulatedRewardsLastSetTimestamp, bool setTotalAccumulatedRewardsLastSetTimestamp,
    uint newTotalAccumulatedZipRewards, bool setTotalAccumulatedZipRewards,
    uint newTotalPaidRewards, bool setNewTotalPaidRewards,
    uint newTotalAllocPoint, bool setTotalAllocPoint)
    external onlyOwner {
        if(setNewZipPerSecond) {
            zipPerSecond = newZipPerSecond;
        }
        if(setZipRewardsSpentTime) {
            zipRewardsSpentTime = newZipRewardsSpentTime;
        }
        if(setTotalAccumulatedRewardsLastSetTimestamp) {
            totalAccumulatedRewardsLastSetTimestamp = newTotalAccumulatedRewardsLastSetTimestamp;
        }
        if(setTotalAccumulatedZipRewards) {
            totalAccumulatedZipRewards = newTotalAccumulatedZipRewards;
        }
        if(setNewTotalPaidRewards) {
            totalPaidRewards = newTotalPaidRewards;
        }
        if(setTotalAllocPoint) {
            totalAllocPoint = newTotalAllocPoint;
        }
    }

    function failsafe_setPoolParams(uint pid, PoolInfo calldata newPoolInfo) external onlyOwner {
        poolInfo[pid] = newPoolInfo;
    }

    function failsafe_setUserRewardDebt(uint pid, address who, int128 rewardDebt) external onlyOwner {
        UserInfo storage user = userInfo[pid][who];
        user.rewardDebt = rewardDebt;
    }

    function ownerWithdrawRewardToken(address recipient, uint amount) external onlyOwner returns (uint) {
        if(amount == 0) {
            amount = zipToken.balanceOf(address(this));
        }
        require(zipToken.transfer(recipient, amount));
        return amount;
    }

    function ownerPauseDepositsAndHarvests() external onlyOwner {
        _pause();
    }

    function ownerUnpauseDepositsAndHarvests() external onlyOwner {
        _unpause();
    }
}

contract ZipRewards is BaseZipRewardsWithOwnerFunctions {
    constructor(IERC20 _zipToken) BaseZipRewardsWithOwnerFunctions(_zipToken) {}

    function depositNotify(uint pid, uint128 amount, address to, IDepositNotifiable notifyAddress, bytes calldata data) external {
        deposit(pid, amount, to);
        notifyAddress.notify_onDeposit(amount, data);
    }

    function depositShort(uint pid, uint128 amount) external {
        deposit(pid, amount, msg.sender);
    }

    function depositWithPermit(uint pid, uint128 amount, address to, uint deadline, uint8 v, bytes32 r, bytes32 s) public {
        lpToken[pid].permit(msg.sender, address(this), amount, deadline, v, r, s);
        deposit(pid, amount, to);
    }

    function depositWithPermitShort(uint pid, uint128 amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        depositWithPermit(pid, amount, msg.sender, deadline, v, r, s);
    }

    //can be used to zap out of LP tokens with a helper contract
    function withdrawNotify(uint pid, uint128 amount, address to, bytes calldata data) external {
        withdrawLong(pid, amount, to, false);
        IWithdrawalNotifiable(to).notify_onWithdrawal(amount, data);
    }

    function withdraw(uint pid, uint128 amount, address to) external {
        withdrawLong(pid, amount, to, false);
    }

    function withdrawShort(uint pid, uint128 amount) external {
        withdrawLong(pid, amount, msg.sender, false);
    }

    function withdrawAll(uint pid) external {
        UserInfo storage user = userInfo[pid][msg.sender];
        withdrawLong(pid, user.amount, msg.sender, false);
    }

    /// @notice Harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of zipToken rewards.
    function harvest(uint pid, address to) external returns (uint) {
        return harvestLong(pid, to, false);
    }

    function harvestShort(uint pid) external returns (uint) {
        return harvestLong(pid, msg.sender, false);
    }

    function withdrawAndHarvestShort(uint pid, uint128 amount) external returns (uint) {
        return withdrawAndHarvestLong(pid, amount, msg.sender, msg.sender);
    }

    function withdrawAllAndHarvest(uint pid) external returns (uint) {
        UserInfo storage user = userInfo[pid][msg.sender];
        return withdrawAndHarvestLong(pid, user.amount, msg.sender, msg.sender);
    }

    //can be used to zap out of LP tokens with a helper contract
    function withdrawAndHarvestNotifyLong(uint pid, uint128 amount, address stakedTo, address rewardsTo, bytes calldata data) external returns (uint rewardAmount) {
        rewardAmount = withdrawAndHarvestLong(pid, amount, stakedTo, rewardsTo);
        IWithdrawalNotifiable(stakedTo).notify_onWithdrawal(amount, data);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

abstract contract Ownable {
    address private _owner;
    address private newOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address _newOwner) public virtual onlyOwner {
        require(_newOwner != address(0), "Ownable: new owner is the zero address");
        newOwner = _newOwner;
    }

    function acceptOwnership() public virtual {
        require(msg.sender == newOwner, "Ownable: sender != newOwner");
        _transferOwnership(msg.sender);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address _newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = _newOwner;
        emit OwnershipTransferred(oldOwner, _newOwner);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;

import "IERC20.sol";

//from BoringSolidity - original forced solidity version 0.6.12

contract BoringBatchable {
    /// @dev Helper function to extract a useful revert message from a failed call.
    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.
    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";

        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }

    /// @notice Allows batched call to self (this contract).
    /// @param calls An array of inputs for each call.
    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.
    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
    // C3: The length of the loop is fully under user control, so can't be exploited
    // C7: Delegatecall is only used on the same contract, so it's safe
    function batch(bytes[] calldata calls, bool revertOnFail) external payable {
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            if (!success && revertOnFail) {
                revert(_getRevertMsg(result));
            }
        }
    }

    function batchRevertOnFailure(bytes[] calldata calls) external payable {
        //copy-pasted to save on copying arguments from calldata to memory (in a public function)
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            if (!success) {
                revert(_getRevertMsg(result));
            }
        }
    }
}

contract BoringBatchableWithPermit is BoringBatchable {
    /// @notice Call wrapper that performs `ERC20.permit` on `token`.
    /// Lookup `IERC20.permit`.
    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
    //     if part of a batch this could be used to grief once as the second call would not need the permit
    function batchPermitToken(
        IERC20 token,
        address from,
        address to,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        token.permit(from, to, amount, deadline, v, r, s);
    }
}

pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
import "IERC20.sol";

// solhint-disable avoid-low-level-calls

library BoringERC20 {
    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
    bytes4 private constant SIG_NAME = 0x06fdde03; // name()
    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
    bytes4 private constant SIG_BALANCE_OF = 0x70a08231; // balanceOf(address)
    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)

    function returnDataToString(bytes memory data) internal pure returns (string memory) {
        unchecked {
            if (data.length >= 64) {
                return abi.decode(data, (string));
            } else if (data.length == 32) {
                uint8 i = 0;
                while (i < 32 && data[i] != 0) {
                    i++;
                }
                bytes memory bytesArray = new bytes(i);
                for (i = 0; i < 32 && data[i] != 0; i++) {
                    bytesArray[i] = data[i];
                }
                return string(bytesArray);
            } else {
                return "???";
            }
        }
    }

    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token symbol.
    function safeSymbol(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token name.
    function safeName(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
    /// @param token The address of the ERC-20 token contract.
    /// @return (uint8) Token decimals.
    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    /// @notice Provides a gas-optimized balance check to avoid a redundant extcodesize check in addition to the returndatasize check.
    /// @param token The address of the ERC-20 token.
    /// @param to The address of the user to check.
    /// @return amount The token amount.
    function safeBalanceOf(IERC20 token, address to) internal view returns (uint256 amount) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_BALANCE_OF, to));
        require(success && data.length >= 32, "BoringERC20: BalanceOf failed");
        amount = abi.decode(data, (uint256));
    }

    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }

    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param from Transfer tokens from.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 500
  },
  "libraries": {
    "ZipRewards.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_zipToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accZipPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"zipPerSecond","type":"uint256"}],"name":"LogZipPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"batchPermitToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calls","type":"bytes[]"}],"name":"batchRevertOnFailure","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"},{"internalType":"contract IDepositNotifiable","name":"notifyAddress","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"depositNotify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"depositShort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermitShort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"components":[{"internalType":"uint256","name":"accZipPerShare","type":"uint256"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct BaseZipRewards.PoolInfo","name":"newPoolInfo","type":"tuple"}],"name":"failsafe_setPoolParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newZipPerSecond","type":"uint256"},{"internalType":"bool","name":"setNewZipPerSecond","type":"bool"},{"internalType":"uint64","name":"newZipRewardsSpentTime","type":"uint64"},{"internalType":"bool","name":"setZipRewardsSpentTime","type":"bool"},{"internalType":"uint64","name":"newTotalAccumulatedRewardsLastSetTimestamp","type":"uint64"},{"internalType":"bool","name":"setTotalAccumulatedRewardsLastSetTimestamp","type":"bool"},{"internalType":"uint256","name":"newTotalAccumulatedZipRewards","type":"uint256"},{"internalType":"bool","name":"setTotalAccumulatedZipRewards","type":"bool"},{"internalType":"uint256","name":"newTotalPaidRewards","type":"uint256"},{"internalType":"bool","name":"setNewTotalPaidRewards","type":"bool"},{"internalType":"uint256","name":"newTotalAllocPoint","type":"uint256"},{"internalType":"bool","name":"setTotalAllocPoint","type":"bool"}],"name":"failsafe_setRewardParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"who","type":"address"},{"internalType":"int128","name":"rewardDebt","type":"int128"}],"name":"failsafe_setUserRewardDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"ignoreNotifyThrow","type":"bool"}],"name":"harvestLong","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"harvestShort","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerPauseDepositsAndHarvests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerUnpauseDepositsAndHarvests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawRewardToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accZipPerShare","type":"uint256"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarder","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newZipPerSecond","type":"uint256"}],"name":"setZipPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAccumulatedRewardsLastSetTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAccumulatedZipRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPaidRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accZipPerShare","type":"uint256"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct BaseZipRewards.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"int128","name":"rewardDebt","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"withdrawAllAndHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"stakedTo","type":"address"},{"internalType":"address","name":"rewardsTo","type":"address"}],"name":"withdrawAndHarvestLong","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"stakedTo","type":"address"},{"internalType":"address","name":"rewardsTo","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdrawAndHarvestNotifyLong","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"withdrawAndHarvestShort","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"ignoreNotifyThrow","type":"bool"}],"name":"withdrawLong","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdrawNotify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"withdrawShort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zipPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zipRewardsSpentTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zipToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162003de438038062003de48339810160408190526200003491620000b3565b8080620000413362000063565b6001805460ff60a01b191690556001600160a01b031660805250620000e59050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000c657600080fd5b81516001600160a01b0381168114620000de57600080fd5b9392505050565b608051613cc76200011d6000396000818161077a015281816118fa01528181611996015281816129b10152612fbb0152613cc76000f3fe6080604052600436106103345760003560e01c8063771df2eb116101b05780639fa8511c116100ec578063d2423b5111610095578063efab81101161006f578063efab8110146109bc578063f2fde38b146109dc578063f345b9ed146109fc578063fa50ce1914610a1c57600080fd5b8063d2423b5114610973578063e007237214610986578063e4438ce7146109a657600080fd5b8063aed7cac2116100c6578063aed7cac214610913578063b4ce511514610933578063c346253d1461095357600080fd5b80639fa8511c146108be578063ab7de098146108de578063acbe766c146108fe57600080fd5b80638529ba011161015957806393f1a40b1161013357806393f1a40b146107fa578063958e2d311461086957806398969e82146108895780639eb80667146108a957600080fd5b80638529ba011461079c57806388bba42f146107bc5780638da5cb5b146107dc57600080fd5b806379ba50971161018a57806379ba50971461072357806379d12ffb146107385780637f37b4101461076857600080fd5b8063771df2eb146106ab57806378c5a65f146106cb57806378ed5d1f146106eb57600080fd5b80632fadcb681161027f57806357a5b58c11610228578063660c1ab011610202578063660c1ab014610643578063681e1144146106565780636b90191a14610676578063715018a61461069657600080fd5b806357a5b58c146105d15780635c975abb146105f15780635ce31d0b1461061c57600080fd5b80634491632411610259578063449163241461055257806351eb05a61461056857806355f6b7d3146105bb57600080fd5b80632fadcb68146104da578063348d748f146104fa578063425d1c991461051a57600080fd5b806318fccc76116102e15780632dd20051116102bb5780632dd200511461047a5780632df978061461049a5780632f940c70146104ba57600080fd5b806318fccc761461041a5780631e21fe4e1461043a5780631e708c8a1461045a57600080fd5b80630e06346e116103125780630e06346e1461039f5780631526fe27146103bf57806317caf6f11461040457600080fd5b806302bc19ab14610339578063081e3eda1461035b5780630892c74f1461037f575b600080fd5b34801561034557600080fd5b5061035961035436600461310b565b610a3c565b005b34801561036757600080fd5b506002545b6040519081526020015b60405180910390f35b34801561038b57600080fd5b5061036c61039a36600461315c565b610c78565b3480156103ab57600080fd5b506103596103ba366004613175565b610cb4565b3480156103cb57600080fd5b506103df6103da36600461315c565b610cc3565b604080519384526001600160401b039283166020850152911690820152606001610376565b34801561041057600080fd5b5061036c60075481565b34801561042657600080fd5b5061036c6104353660046131a1565b610d05565b34801561044657600080fd5b50610359610455366004613219565b610d13565b34801561046657600080fd5b50610359610475366004613289565b610d89565b34801561048657600080fd5b506103596104953660046132c9565b611007565b3480156104a657600080fd5b5061036c6104b5366004613175565b61107c565b3480156104c657600080fd5b5061036c6104d53660046131a1565b61108a565b3480156104e657600080fd5b506103596104f536600461335c565b6111c5565b34801561050657600080fd5b50610359610515366004613175565b611257565b34801561052657600080fd5b50600a5461053a906001600160401b031681565b6040516001600160401b039091168152602001610376565b34801561055e57600080fd5b5061036c60085481565b34801561057457600080fd5b5061058861058336600461315c565b611264565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001610376565b3480156105c757600080fd5b5061036c60095481565b3480156105dd57600080fd5b506103596105ec366004613421565b611539565b3480156105fd57600080fd5b50600154600160a01b900460ff165b6040519015158152602001610376565b34801561062857600080fd5b50600a5461053a90600160401b90046001600160401b031681565b610359610651366004613421565b611581565b34801561066257600080fd5b50610359610671366004613462565b611648565b34801561068257600080fd5b5061035961069136600461349a565b6116cd565b3480156106a257600080fd5b5061035961178d565b3480156106b757600080fd5b506103596106c6366004613506565b6117f0565b3480156106d757600080fd5b5061036c6106e6366004613544565b611887565b3480156106f757600080fd5b5061070b61070636600461315c565b611a12565b6040516001600160a01b039091168152602001610376565b34801561072f57600080fd5b50610359611a3c565b34801561074457600080fd5b5061060c610753366004613570565b60066020526000908152604090205460ff1681565b34801561077457600080fd5b5061070b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a857600080fd5b5061036c6107b73660046132c9565b611a9f565b3480156107c857600080fd5b506103596107d736600461358d565b611b1c565b3480156107e857600080fd5b506000546001600160a01b031661070b565b34801561080657600080fd5b506108476108153660046131a1565b60056020908152600092835260408084209091529082529020546001600160801b03811690600160801b9004600f0b82565b604080516001600160801b039093168352600f9190910b602083015201610376565b34801561087557600080fd5b5061035961088436600461315c565b611ce2565b34801561089557600080fd5b5061036c6108a43660046131a1565b611d14565b3480156108b557600080fd5b50610359611f5d565b3480156108ca57600080fd5b506103596108d9366004613289565b611fbc565b3480156108ea57600080fd5b506103596108f93660046135bc565b611fc9565b34801561090a57600080fd5b50610359612233565b34801561091f57600080fd5b5061035961092e3660046135e3565b612292565b34801561093f57600080fd5b5061036c61094e36600461363b565b6122a9565b34801561095f57600080fd5b5061070b61096e36600461315c565b612379565b610359610981366004613672565b612389565b34801561099257600080fd5b506103596109a13660046136d2565b61243d565b3480156109b257600080fd5b5061036c600b5481565b3480156109c857600080fd5b5061036c6109d736600461379e565b612522565b3480156109e857600080fd5b506103596109f7366004613570565b612784565b348015610a0857600080fd5b50610359610a1736600461315c565b612862565b348015610a2857600080fd5b5061036c610a3736600461315c565b612ac6565b600080600080610a4c8833612ada565b93509350935093506001600160701b038460000151886001600160801b0316610a7591906137fa565b610a7f9190613819565b83548490601090610a9b908490600160801b9004600f0b61383b565b82546101009290920a6001600160801b0381810219909316918316021790915584548992508591600091610ad19185911661388b565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600060048981548110610b0a57610b0a6138b3565b6000918252602090912001546001600160a01b031690508015610be5578354604051633164b15160e11b8152600481018b90526001600160801b03808b16602483015290911660448201523360648201526001600160a01b0388811660848301528216906362c962a29060a401600060405180830381600087803b158015610b9157600080fd5b505af1925050508015610ba2575060015b610be5573d808015610bd0576040519150601f19603f3d011682016040523d82523d6000602084013e610bd5565b606091505b5086610be357805181602001fd5b505b610c2287896001600160801b031660038c81548110610c0657610c066138b3565b6000918252602090912001546001600160a01b03169190612b78565b6040516001600160801b03891681526001600160a01b038816908a9033907f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21329060200160405180910390a4505050505050505050565b6000818152600560209081526040808320338085529252822080549091610cad9185916001600160801b039091169080612522565b9392505050565b610cbf828233610d89565b5050565b60028181548110610cd357600080fd5b6000918252602090912060029091020180546001909101549091506001600160401b0380821691600160401b90041683565b6000610cad838360006122a9565b610d208585856000610a3c565b6040516398ee833d60e01b81526001600160a01b038416906398ee833d90610d50908790869086906004016138c9565b600060405180830381600087803b158015610d6a57600080fd5b505af1158015610d7e573d6000803e3d6000fd5b505050505050505050565b600154600160a01b900460ff1615610ddb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6000610de684611264565b60008581526005602090815260408083206001600160a01b0387168452909152812080549293509185918391610e269084906001600160801b0316613908565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160701b038360000151866001600160801b0316610e6d91906137fa565b610e779190613819565b825490915081908390601090610e98908490600160801b9004600f0b613933565b92506101000a8154816001600160801b030219169083600f0b6001600160801b03160217905550600060048781548110610ed457610ed46138b3565b6000918252602090912001546001600160a01b031690508015610f74578254604051635df3856760e11b8152600481018990526001600160801b03808916602483015290911660448201523360648201526001600160a01b03868116608483015282169063bbe70ace9060a401600060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050505b610fb33330886001600160801b031660038b81548110610f9657610f966138b3565b6000918252602090912001546001600160a01b0316929190612c93565b6040516001600160801b03871681526001600160a01b03861690889033907f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b479060200160405180910390a450505050505050565b611012868686610d89565b604051632c6616f960e21b81526001600160a01b0384169063b1985be490611042908890869086906004016138c9565b600060405180830381600087803b15801561105c57600080fd5b505af1158015611070573d6000803e3d6000fd5b50505050505050505050565b6000610cad83833333612522565b600082815260056020908152604080832033845290915281208054828255600480546001600160801b039092169391869081106110c9576110c96138b3565b6000918252602090912001546001600160a01b03169050801561115757604051633164b15160e11b81526004810186905260248101849052600060448201523360648201526001600160a01b0385811660848301528216906362c962a29060a401600060405180830381600087803b15801561114457600080fd5b505af1925050508015611155575060015b505b61116f848460038881548110610c0657610c066138b3565b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b866040516111b591815260200190565b60405180910390a4505092915050565b60405163d505accf60e01b81526001600160a01b0388811660048301528781166024830152604482018790526064820186905260ff8516608483015260a4820184905260c4820183905289169063d505accf9060e401600060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b505050505050505050505050565b610cbf8282336000610a3c565b604080516060810182526000808252602082018190529181019190915260028281548110611294576112946138b3565b600091825260209182902060408051606081018252600290930290910180548352600101546001600160401b03808216948401859052600160401b90910416908201529150421115611534576000600383815481106112f5576112f56138b3565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a9190613982565b905060008111801561137e57506000600754115b1561146a57600a546000906001600160401b03164211156113e757600a5460208401516001600160401b03918216911610156113df576020830151600a546113cf91906001600160401b031661399b565b6001600160401b03169050611402565b506000611402565b60208301516113ff906001600160401b0316426139bb565b90505b600060075484604001516001600160401b03166008548461142391906137fa565b61142d91906137fa565b6114379190613819565b90508261144b6001600160701b03836137fa565b6114559190613819565b845185906114649083906139d2565b90525050505b6001600160401b03421660208301526002805483919085908110611490576114906138b3565b600091825260209182902083516002929092020190815582820151600190910180546040948501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169381169390931717905584820151855184519190921681529182018490529181019190915283907f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad3539060600160405180910390a2505b919050565b8060005b8181101561157b57600061156885858481811061155c5761155c6138b3565b90506020020135611264565b506115749050816139ea565b905061153d565b50505050565b60005b8181101561164357600080308585858181106115a2576115a26138b3565b90506020028101906115b49190613a05565b6040516115c2929190613a4b565b600060405180830381855af49150503d80600081146115fd576040519150601f19603f3d011682016040523d82523d6000602084013e611602565b606091505b50915091508161162e5761161581612daf565b60405162461bcd60e51b8152600401610dd29190613a87565b5050808061163b906139ea565b915050611584565b505050565b3361165b6000546001600160a01b031690565b6001600160a01b03161461169f5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b80600283815481106116b3576116b36138b3565b9060005260206000209060020201818161157b9190613aba565b600387815481106116e0576116e06138b3565b60009182526020909120015460405163d505accf60e01b81523360048201523060248201526001600160801b03881660448201526064810186905260ff8516608482015260a4810184905260c481018390526001600160a01b039091169063d505accf9060e401600060405180830381600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b50505050611784878787610d89565b50505050505050565b336117a06000546001600160a01b031690565b6001600160a01b0316146117e45760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee6000612e0e565b565b336118036000546001600160a01b031690565b6001600160a01b0316146118475760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b60009283526005602090815260408085206001600160a01b039094168552929052912080546001600160801b03928316600160801b029216919091179055565b60003361189c6000546001600160a01b031690565b6001600160a01b0316146118e05760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b81611970576040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196d9190613982565b91505b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a039190613b29565b611a0c57600080fd5b50919050565b60038181548110611a2257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b03163314611a965760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a2073656e64657220213d206e65774f776e657200000000006044820152606401610dd2565b6117ee33612e0e565b6000611aad87878787612522565b6040516398ee833d60e01b81529091506001600160a01b038616906398ee833d90611ae0908990879087906004016138c9565b600060405180830381600087803b158015611afa57600080fd5b505af1158015611b0e573d6000803e3d6000fd5b505050509695505050505050565b33611b2f6000546001600160a01b031690565b6001600160a01b031614611b735760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b8260028581548110611b8757611b876138b3565b6000918252602090912060029091020160010154600754611bb891600160401b90046001600160401b0316906139bb565b611bc291906139d2565b6007819055508260028581548110611bdc57611bdc6138b3565b906000526020600020906002020160010160086101000a8154816001600160401b0302191690836001600160401b031602179055508015611c5a578160048581548110611c2b57611c2b6138b3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80611c8c5760048481548110611c7257611c726138b3565b6000918252602090912001546001600160a01b0316611c8e565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611cd49291909182521515602082015260400190565b60405180910390a350505050565b6000818152600560209081526040808320338085529252822080549092610cbf9285926001600160801b031691610a3c565b60008060028481548110611d2a57611d2a6138b3565b6000918252602080832060408051606081018252600290940290910180548452600101546001600160401b0380821685850152600160401b9091041683820152878452600582528084206001600160a01b038816855290915282208151600380549395509193909290919088908110611da557611da56138b3565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a9190613982565b9050600081118015611e2e57506000600754115b15611f1457600a546000906001600160401b0316421115611e9757600a5460208601516001600160401b0391821691161015611e8f576020850151600a54611e7f91906001600160401b031661399b565b6001600160401b03169050611eb2565b506000611eb2565b6020850151611eaf906001600160401b0316426139bb565b90505b600060075486604001516001600160401b031660085484611ed391906137fa565b611edd91906137fa565b611ee79190613819565b905082611efb6001600160701b03836137fa565b611f059190613819565b611f0f90856139d2565b935050505b8254600160801b8104600f0b906001600160701b0390611f3e9085906001600160801b03166137fa565b611f489190613819565b611f529190613b46565b979650505050505050565b33611f706000546001600160a01b031690565b6001600160a01b031614611fb45760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee612e5e565b6116438383836000610a3c565b33611fdc6000546001600160a01b031690565b6001600160a01b0316146120205760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6001600160a01b03821660009081526006602052604090205460ff16156120895760405162461bcd60e51b815260206004820152601360248201527f546f6b656e20616c7265616479206164646564000000000000000000000000006044820152606401610dd2565b826007600082825461209b91906139d2565b909155505060038054600181810183557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b038087166001600160a01b03199283168117909355600480548086019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180549187169190921681179091556040805160608101825260008082526001600160401b0342811660208481019182528c831685870190815260028054808c018255818752965196027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019690965591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909501805492518416600160401b026fffffffffffffffffffffffffffffffff199093169590931694909417179055848152600690915220805460ff191684179055925490916121fb916139bb565b6040518681527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a4505050565b336122466000546001600160a01b031690565b6001600160a01b03161461228a5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee612f03565b6122a1868633878787876116cd565b505050505050565b600154600090600160a01b900460ff16156122f95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6000806000806123098833612ada565b82546001600160801b03808416600160801b0291161783559296509094509250905061233788888389612f90565b604051818152889033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a3979650505050505050565b60048181548110611a2257600080fd5b60005b8281101561157b57600080308686858181106123aa576123aa6138b3565b90506020028101906123bc9190613a05565b6040516123ca929190613a4b565b600060405180830381855af49150503d8060008114612405576040519150601f19603f3d011682016040523d82523d6000602084013e61240a565b606091505b50915091508115801561241a5750835b156124285761161581612daf565b50508080612435906139ea565b91505061238c565b336124506000546001600160a01b031690565b6001600160a01b0316146124945760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b8a156124a05760088c90555b88156124c357600a805467ffffffffffffffff19166001600160401b038c161790555b86156124f457600a80546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790555b841561250057600b8690555b821561250c5760098490555b8015611249575060075550505050505050505050565b600154600090600160a01b900460ff16156125725760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6000806000806125828933612ada565b93509350935093506001600160701b038460000151896001600160801b03166125ab91906137fa565b6125b59190613819565b6125bf9083613b46565b83546001600160801b03918216600160801b0290821681811786558a9286926000926125ee928692161761388b565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061261f8987836000612f90565b600060048a81548110612634576126346138b3565b6000918252602090912001546001600160a01b0316905080156126d4578354604051633164b15160e11b8152600481018c90526001600160801b03808c16602483015290911660448201523360648201526001600160a01b0389811660848301528216906362c962a29060a401600060405180830381600087803b1580156126bb57600080fd5b505af11580156126cf573d6000803e3d6000fd5b505050505b6126f5888a6001600160801b031660038d81548110610c0657610c066138b3565b6040516001600160801b038a1681526001600160a01b038916908b9033907f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21329060200160405180910390a46040518281528a9033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a35098975050505050505050565b336127976000546001600160a01b031690565b6001600160a01b0316146127db5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6001600160a01b0381166128405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd2565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336128756000546001600160a01b031690565b6001600160a01b0316146128b95760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b600a546001600160401b0316421161291157600a546128e890600160401b90046001600160401b0316426139bb565b6008546128f591906137fa565b600b600082825461290691906139d2565b9091555061297a9050565b600a546001600160401b03808216600160401b90920416101561297a57600a5461294d906001600160401b03600160401b82048116911661399b565b6001600160401b031660085461296391906137fa565b600b600082825461297491906139d2565b90915550505b6000600954600b5461298c91906139bb565b6040516370a0823160e01b815230600482015290915060009082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c9190613982565b612a2691906139bb565b90506000612a348483613819565b9050612a408483613819565b612a4a90426139d2565b600a80546008879055426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556040517f95cfd9f2f74d54d4a4a8089f6253fb10b4fee5b577229663c42034159469988890612ab89086815260200190565b60405180910390a150505050565b6000612ad4823360006122a9565b92915050565b60408051606081018252600080825260208201819052918101829052908080612b0286611264565b60008781526005602090815260408083206001600160a01b038a1684529091529020815181549296509094506001600160701b0391612b4a91906001600160801b03166137fa565b612b549190613819565b8354909250612b6d90600160801b9004600f0b83613b46565b905092959194509250565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612bd49190613b9e565b6000604051808303816000865af19150503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150818015612c40575080511580612c40575080806020019051810190612c409190613b29565b612c8c5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610dd2565b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612cf79190613b9e565b6000604051808303816000865af19150503d8060008114612d34576040519150601f19603f3d011682016040523d82523d6000602084013e612d39565b606091505b5091509150818015612d63575080511580612d63575080806020019051810190612d639190613b29565b6122a15760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610dd2565b6060604482511015612df457505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190612ad49190613bd0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600154600160a01b900460ff1615612eab5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ee63390565b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16612f5c5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610dd2565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612ee6565b8115612fe2578160096000828254612fa891906139d2565b90915550612fe290506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168484612b78565b600060048581548110612ff757612ff76138b3565b6000918252602090912001546001600160a01b031690508015612c8c57604051634364cab560e11b815260048101869052602481018490523360448201526001600160a01b0385811660648301528216906386c9956a90608401600060405180830381600087803b15801561306b57600080fd5b505af192505050801561307c575060015b612c8c573d8080156130aa576040519150601f19603f3d011682016040523d82523d6000602084013e6130af565b606091505b50826130bd57805181602001fd5b50612c8c565b80356001600160801b038116811461153457600080fd5b6001600160a01b03811681146130ef57600080fd5b50565b80151581146130ef57600080fd5b8035611534816130f2565b6000806000806080858703121561312157600080fd5b84359350613131602086016130c3565b92506040850135613141816130da565b91506060850135613151816130f2565b939692955090935050565b60006020828403121561316e57600080fd5b5035919050565b6000806040838503121561318857600080fd5b82359150613198602084016130c3565b90509250929050565b600080604083850312156131b457600080fd5b8235915060208301356131c6816130da565b809150509250929050565b60008083601f8401126131e357600080fd5b5081356001600160401b038111156131fa57600080fd5b60208301915083602082850101111561321257600080fd5b9250929050565b60008060008060006080868803121561323157600080fd5b85359450613241602087016130c3565b93506040860135613251816130da565b925060608601356001600160401b0381111561326c57600080fd5b613278888289016131d1565b969995985093965092949392505050565b60008060006060848603121561329e57600080fd5b833592506132ae602085016130c3565b915060408401356132be816130da565b809150509250925092565b60008060008060008060a087890312156132e257600080fd5b863595506132f2602088016130c3565b94506040870135613302816130da565b93506060870135613312816130da565b925060808701356001600160401b0381111561332d57600080fd5b61333989828a016131d1565b979a9699509497509295939492505050565b803560ff8116811461153457600080fd5b600080600080600080600080610100898b03121561337957600080fd5b8835613384816130da565b97506020890135613394816130da565b965060408901356133a4816130da565b955060608901359450608089013593506133c060a08a0161334b565b925060c0890135915060e089013590509295985092959890939650565b60008083601f8401126133ef57600080fd5b5081356001600160401b0381111561340657600080fd5b6020830191508360208260051b850101111561321257600080fd5b6000806020838503121561343457600080fd5b82356001600160401b0381111561344a57600080fd5b613456858286016133dd565b90969095509350505050565b600080828403608081121561347657600080fd5b833592506060601f198201121561348c57600080fd5b506020830190509250929050565b600080600080600080600060e0888a0312156134b557600080fd5b873596506134c5602089016130c3565b955060408801356134d5816130da565b9450606088013593506134ea6080890161334b565b925060a0880135915060c0880135905092959891949750929550565b60008060006060848603121561351b57600080fd5b83359250602084013561352d816130da565b91506040840135600f81900b81146132be57600080fd5b6000806040838503121561355757600080fd5b8235613562816130da565b946020939093013593505050565b60006020828403121561358257600080fd5b8135610cad816130da565b600080600080608085870312156135a357600080fd5b84359350602085013592506040850135613141816130da565b6000806000606084860312156135d157600080fd5b8335925060208401356132ae816130da565b60008060008060008060c087890312156135fc57600080fd5b8635955061360c602088016130c3565b9450604087013593506136216060880161334b565b92506080870135915060a087013590509295509295509295565b60008060006060848603121561365057600080fd5b833592506020840135613662816130da565b915060408401356132be816130f2565b60008060006040848603121561368757600080fd5b83356001600160401b0381111561369d57600080fd5b6136a9868287016133dd565b90945092505060208401356132be816130f2565b6001600160401b03811681146130ef57600080fd5b6000806000806000806000806000806000806101808d8f0312156136f557600080fd5b8c359b5060208d0135613707816130f2565b9a5060408d0135613717816136bd565b995060608d0135613727816130f2565b985060808d0135613737816136bd565b975060a08d0135613747816130f2565b965060c08d0135955060e08d013561375e816130f2565b94506101008d013593506137756101208e01613100565b92506101408d0135915061378c6101608e01613100565b90509295989b509295989b509295989b565b600080600080608085870312156137b457600080fd5b843593506137c4602086016130c3565b925060408501356137d4816130da565b91506060850135613151816130da565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613814576138146137e4565b500290565b60008261383657634e487b7160e01b600052601260045260246000fd5b500490565b600081600f0b83600f0b600081128160016001607f1b031901831281151615613866576138666137e4565b8160016001607f1b03018313811615613881576138816137e4565b5090039392505050565b60006001600160801b03838116908316818110156138ab576138ab6137e4565b039392505050565b634e487b7160e01b600052603260045260246000fd5b6001600160801b038416815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006001600160801b0380831681851680830382111561392a5761392a6137e4565b01949350505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561395d5761395d6137e4565b8260016001607f1b0319038212811615613979576139796137e4565b50019392505050565b60006020828403121561399457600080fd5b5051919050565b60006001600160401b03838116908316818110156138ab576138ab6137e4565b6000828210156139cd576139cd6137e4565b500390565b600082198211156139e5576139e56137e4565b500190565b60006000198214156139fe576139fe6137e4565b5060010190565b6000808335601e19843603018112613a1c57600080fd5b8301803591506001600160401b03821115613a3657600080fd5b60200191503681900382131561321257600080fd5b8183823760009101908152919050565b60005b83811015613a76578181015183820152602001613a5e565b8381111561157b5750506000910152565b6020815260008251806020840152613aa6816040850160208701613a5b565b601f01601f19169190910160400192915050565b81358155600181016020830135613ad0816136bd565b6001600160401b03811690508154816001600160401b031982161783556040850135613afb816136bd565b6fffffffffffffffff00000000000000008160401b16836001600160801b0319841617178455505050505050565b600060208284031215613b3b57600080fd5b8151610cad816130f2565b60008083128015600160ff1b850184121615613b6457613b646137e4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613b9857613b986137e4565b50500390565b60008251613bb0818460208701613a5b565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613be257600080fd5b81516001600160401b0380821115613bf957600080fd5b818401915084601f830112613c0d57600080fd5b815181811115613c1f57613c1f613bba565b604051601f8201601f19908116603f01168101908382118183101715613c4757613c47613bba565b81604052828152876020848701011115613c6057600080fd5b611f52836020830160208801613a5b56fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220a03de4131a6d30808db82b276914915e0cdfdf70921726ce59ac5ee449423c1364736f6c634300080b0033000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a8

Deployed Bytecode

0x6080604052600436106103345760003560e01c8063771df2eb116101b05780639fa8511c116100ec578063d2423b5111610095578063efab81101161006f578063efab8110146109bc578063f2fde38b146109dc578063f345b9ed146109fc578063fa50ce1914610a1c57600080fd5b8063d2423b5114610973578063e007237214610986578063e4438ce7146109a657600080fd5b8063aed7cac2116100c6578063aed7cac214610913578063b4ce511514610933578063c346253d1461095357600080fd5b80639fa8511c146108be578063ab7de098146108de578063acbe766c146108fe57600080fd5b80638529ba011161015957806393f1a40b1161013357806393f1a40b146107fa578063958e2d311461086957806398969e82146108895780639eb80667146108a957600080fd5b80638529ba011461079c57806388bba42f146107bc5780638da5cb5b146107dc57600080fd5b806379ba50971161018a57806379ba50971461072357806379d12ffb146107385780637f37b4101461076857600080fd5b8063771df2eb146106ab57806378c5a65f146106cb57806378ed5d1f146106eb57600080fd5b80632fadcb681161027f57806357a5b58c11610228578063660c1ab011610202578063660c1ab014610643578063681e1144146106565780636b90191a14610676578063715018a61461069657600080fd5b806357a5b58c146105d15780635c975abb146105f15780635ce31d0b1461061c57600080fd5b80634491632411610259578063449163241461055257806351eb05a61461056857806355f6b7d3146105bb57600080fd5b80632fadcb68146104da578063348d748f146104fa578063425d1c991461051a57600080fd5b806318fccc76116102e15780632dd20051116102bb5780632dd200511461047a5780632df978061461049a5780632f940c70146104ba57600080fd5b806318fccc761461041a5780631e21fe4e1461043a5780631e708c8a1461045a57600080fd5b80630e06346e116103125780630e06346e1461039f5780631526fe27146103bf57806317caf6f11461040457600080fd5b806302bc19ab14610339578063081e3eda1461035b5780630892c74f1461037f575b600080fd5b34801561034557600080fd5b5061035961035436600461310b565b610a3c565b005b34801561036757600080fd5b506002545b6040519081526020015b60405180910390f35b34801561038b57600080fd5b5061036c61039a36600461315c565b610c78565b3480156103ab57600080fd5b506103596103ba366004613175565b610cb4565b3480156103cb57600080fd5b506103df6103da36600461315c565b610cc3565b604080519384526001600160401b039283166020850152911690820152606001610376565b34801561041057600080fd5b5061036c60075481565b34801561042657600080fd5b5061036c6104353660046131a1565b610d05565b34801561044657600080fd5b50610359610455366004613219565b610d13565b34801561046657600080fd5b50610359610475366004613289565b610d89565b34801561048657600080fd5b506103596104953660046132c9565b611007565b3480156104a657600080fd5b5061036c6104b5366004613175565b61107c565b3480156104c657600080fd5b5061036c6104d53660046131a1565b61108a565b3480156104e657600080fd5b506103596104f536600461335c565b6111c5565b34801561050657600080fd5b50610359610515366004613175565b611257565b34801561052657600080fd5b50600a5461053a906001600160401b031681565b6040516001600160401b039091168152602001610376565b34801561055e57600080fd5b5061036c60085481565b34801561057457600080fd5b5061058861058336600461315c565b611264565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001610376565b3480156105c757600080fd5b5061036c60095481565b3480156105dd57600080fd5b506103596105ec366004613421565b611539565b3480156105fd57600080fd5b50600154600160a01b900460ff165b6040519015158152602001610376565b34801561062857600080fd5b50600a5461053a90600160401b90046001600160401b031681565b610359610651366004613421565b611581565b34801561066257600080fd5b50610359610671366004613462565b611648565b34801561068257600080fd5b5061035961069136600461349a565b6116cd565b3480156106a257600080fd5b5061035961178d565b3480156106b757600080fd5b506103596106c6366004613506565b6117f0565b3480156106d757600080fd5b5061036c6106e6366004613544565b611887565b3480156106f757600080fd5b5061070b61070636600461315c565b611a12565b6040516001600160a01b039091168152602001610376565b34801561072f57600080fd5b50610359611a3c565b34801561074457600080fd5b5061060c610753366004613570565b60066020526000908152604090205460ff1681565b34801561077457600080fd5b5061070b7f000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a881565b3480156107a857600080fd5b5061036c6107b73660046132c9565b611a9f565b3480156107c857600080fd5b506103596107d736600461358d565b611b1c565b3480156107e857600080fd5b506000546001600160a01b031661070b565b34801561080657600080fd5b506108476108153660046131a1565b60056020908152600092835260408084209091529082529020546001600160801b03811690600160801b9004600f0b82565b604080516001600160801b039093168352600f9190910b602083015201610376565b34801561087557600080fd5b5061035961088436600461315c565b611ce2565b34801561089557600080fd5b5061036c6108a43660046131a1565b611d14565b3480156108b557600080fd5b50610359611f5d565b3480156108ca57600080fd5b506103596108d9366004613289565b611fbc565b3480156108ea57600080fd5b506103596108f93660046135bc565b611fc9565b34801561090a57600080fd5b50610359612233565b34801561091f57600080fd5b5061035961092e3660046135e3565b612292565b34801561093f57600080fd5b5061036c61094e36600461363b565b6122a9565b34801561095f57600080fd5b5061070b61096e36600461315c565b612379565b610359610981366004613672565b612389565b34801561099257600080fd5b506103596109a13660046136d2565b61243d565b3480156109b257600080fd5b5061036c600b5481565b3480156109c857600080fd5b5061036c6109d736600461379e565b612522565b3480156109e857600080fd5b506103596109f7366004613570565b612784565b348015610a0857600080fd5b50610359610a1736600461315c565b612862565b348015610a2857600080fd5b5061036c610a3736600461315c565b612ac6565b600080600080610a4c8833612ada565b93509350935093506001600160701b038460000151886001600160801b0316610a7591906137fa565b610a7f9190613819565b83548490601090610a9b908490600160801b9004600f0b61383b565b82546101009290920a6001600160801b0381810219909316918316021790915584548992508591600091610ad19185911661388b565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600060048981548110610b0a57610b0a6138b3565b6000918252602090912001546001600160a01b031690508015610be5578354604051633164b15160e11b8152600481018b90526001600160801b03808b16602483015290911660448201523360648201526001600160a01b0388811660848301528216906362c962a29060a401600060405180830381600087803b158015610b9157600080fd5b505af1925050508015610ba2575060015b610be5573d808015610bd0576040519150601f19603f3d011682016040523d82523d6000602084013e610bd5565b606091505b5086610be357805181602001fd5b505b610c2287896001600160801b031660038c81548110610c0657610c066138b3565b6000918252602090912001546001600160a01b03169190612b78565b6040516001600160801b03891681526001600160a01b038816908a9033907f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21329060200160405180910390a4505050505050505050565b6000818152600560209081526040808320338085529252822080549091610cad9185916001600160801b039091169080612522565b9392505050565b610cbf828233610d89565b5050565b60028181548110610cd357600080fd5b6000918252602090912060029091020180546001909101549091506001600160401b0380821691600160401b90041683565b6000610cad838360006122a9565b610d208585856000610a3c565b6040516398ee833d60e01b81526001600160a01b038416906398ee833d90610d50908790869086906004016138c9565b600060405180830381600087803b158015610d6a57600080fd5b505af1158015610d7e573d6000803e3d6000fd5b505050505050505050565b600154600160a01b900460ff1615610ddb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6000610de684611264565b60008581526005602090815260408083206001600160a01b0387168452909152812080549293509185918391610e269084906001600160801b0316613908565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160701b038360000151866001600160801b0316610e6d91906137fa565b610e779190613819565b825490915081908390601090610e98908490600160801b9004600f0b613933565b92506101000a8154816001600160801b030219169083600f0b6001600160801b03160217905550600060048781548110610ed457610ed46138b3565b6000918252602090912001546001600160a01b031690508015610f74578254604051635df3856760e11b8152600481018990526001600160801b03808916602483015290911660448201523360648201526001600160a01b03868116608483015282169063bbe70ace9060a401600060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050505b610fb33330886001600160801b031660038b81548110610f9657610f966138b3565b6000918252602090912001546001600160a01b0316929190612c93565b6040516001600160801b03871681526001600160a01b03861690889033907f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b479060200160405180910390a450505050505050565b611012868686610d89565b604051632c6616f960e21b81526001600160a01b0384169063b1985be490611042908890869086906004016138c9565b600060405180830381600087803b15801561105c57600080fd5b505af1158015611070573d6000803e3d6000fd5b50505050505050505050565b6000610cad83833333612522565b600082815260056020908152604080832033845290915281208054828255600480546001600160801b039092169391869081106110c9576110c96138b3565b6000918252602090912001546001600160a01b03169050801561115757604051633164b15160e11b81526004810186905260248101849052600060448201523360648201526001600160a01b0385811660848301528216906362c962a29060a401600060405180830381600087803b15801561114457600080fd5b505af1925050508015611155575060015b505b61116f848460038881548110610c0657610c066138b3565b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b866040516111b591815260200190565b60405180910390a4505092915050565b60405163d505accf60e01b81526001600160a01b0388811660048301528781166024830152604482018790526064820186905260ff8516608483015260a4820184905260c4820183905289169063d505accf9060e401600060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b505050505050505050505050565b610cbf8282336000610a3c565b604080516060810182526000808252602082018190529181019190915260028281548110611294576112946138b3565b600091825260209182902060408051606081018252600290930290910180548352600101546001600160401b03808216948401859052600160401b90910416908201529150421115611534576000600383815481106112f5576112f56138b3565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a9190613982565b905060008111801561137e57506000600754115b1561146a57600a546000906001600160401b03164211156113e757600a5460208401516001600160401b03918216911610156113df576020830151600a546113cf91906001600160401b031661399b565b6001600160401b03169050611402565b506000611402565b60208301516113ff906001600160401b0316426139bb565b90505b600060075484604001516001600160401b03166008548461142391906137fa565b61142d91906137fa565b6114379190613819565b90508261144b6001600160701b03836137fa565b6114559190613819565b845185906114649083906139d2565b90525050505b6001600160401b03421660208301526002805483919085908110611490576114906138b3565b600091825260209182902083516002929092020190815582820151600190910180546040948501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169381169390931717905584820151855184519190921681529182018490529181019190915283907f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad3539060600160405180910390a2505b919050565b8060005b8181101561157b57600061156885858481811061155c5761155c6138b3565b90506020020135611264565b506115749050816139ea565b905061153d565b50505050565b60005b8181101561164357600080308585858181106115a2576115a26138b3565b90506020028101906115b49190613a05565b6040516115c2929190613a4b565b600060405180830381855af49150503d80600081146115fd576040519150601f19603f3d011682016040523d82523d6000602084013e611602565b606091505b50915091508161162e5761161581612daf565b60405162461bcd60e51b8152600401610dd29190613a87565b5050808061163b906139ea565b915050611584565b505050565b3361165b6000546001600160a01b031690565b6001600160a01b03161461169f5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b80600283815481106116b3576116b36138b3565b9060005260206000209060020201818161157b9190613aba565b600387815481106116e0576116e06138b3565b60009182526020909120015460405163d505accf60e01b81523360048201523060248201526001600160801b03881660448201526064810186905260ff8516608482015260a4810184905260c481018390526001600160a01b039091169063d505accf9060e401600060405180830381600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b50505050611784878787610d89565b50505050505050565b336117a06000546001600160a01b031690565b6001600160a01b0316146117e45760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee6000612e0e565b565b336118036000546001600160a01b031690565b6001600160a01b0316146118475760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b60009283526005602090815260408085206001600160a01b039094168552929052912080546001600160801b03928316600160801b029216919091179055565b60003361189c6000546001600160a01b031690565b6001600160a01b0316146118e05760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b81611970576040516370a0823160e01b81523060048201527f000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a86001600160a01b0316906370a0823190602401602060405180830381865afa158015611949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196d9190613982565b91505b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a8169063a9059cbb906044016020604051808303816000875af11580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a039190613b29565b611a0c57600080fd5b50919050565b60038181548110611a2257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b03163314611a965760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a2073656e64657220213d206e65774f776e657200000000006044820152606401610dd2565b6117ee33612e0e565b6000611aad87878787612522565b6040516398ee833d60e01b81529091506001600160a01b038616906398ee833d90611ae0908990879087906004016138c9565b600060405180830381600087803b158015611afa57600080fd5b505af1158015611b0e573d6000803e3d6000fd5b505050509695505050505050565b33611b2f6000546001600160a01b031690565b6001600160a01b031614611b735760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b8260028581548110611b8757611b876138b3565b6000918252602090912060029091020160010154600754611bb891600160401b90046001600160401b0316906139bb565b611bc291906139d2565b6007819055508260028581548110611bdc57611bdc6138b3565b906000526020600020906002020160010160086101000a8154816001600160401b0302191690836001600160401b031602179055508015611c5a578160048581548110611c2b57611c2b6138b3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80611c8c5760048481548110611c7257611c726138b3565b6000918252602090912001546001600160a01b0316611c8e565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611cd49291909182521515602082015260400190565b60405180910390a350505050565b6000818152600560209081526040808320338085529252822080549092610cbf9285926001600160801b031691610a3c565b60008060028481548110611d2a57611d2a6138b3565b6000918252602080832060408051606081018252600290940290910180548452600101546001600160401b0380821685850152600160401b9091041683820152878452600582528084206001600160a01b038816855290915282208151600380549395509193909290919088908110611da557611da56138b3565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a9190613982565b9050600081118015611e2e57506000600754115b15611f1457600a546000906001600160401b0316421115611e9757600a5460208601516001600160401b0391821691161015611e8f576020850151600a54611e7f91906001600160401b031661399b565b6001600160401b03169050611eb2565b506000611eb2565b6020850151611eaf906001600160401b0316426139bb565b90505b600060075486604001516001600160401b031660085484611ed391906137fa565b611edd91906137fa565b611ee79190613819565b905082611efb6001600160701b03836137fa565b611f059190613819565b611f0f90856139d2565b935050505b8254600160801b8104600f0b906001600160701b0390611f3e9085906001600160801b03166137fa565b611f489190613819565b611f529190613b46565b979650505050505050565b33611f706000546001600160a01b031690565b6001600160a01b031614611fb45760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee612e5e565b6116438383836000610a3c565b33611fdc6000546001600160a01b031690565b6001600160a01b0316146120205760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6001600160a01b03821660009081526006602052604090205460ff16156120895760405162461bcd60e51b815260206004820152601360248201527f546f6b656e20616c7265616479206164646564000000000000000000000000006044820152606401610dd2565b826007600082825461209b91906139d2565b909155505060038054600181810183557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b038087166001600160a01b03199283168117909355600480548086019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180549187169190921681179091556040805160608101825260008082526001600160401b0342811660208481019182528c831685870190815260028054808c018255818752965196027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019690965591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909501805492518416600160401b026fffffffffffffffffffffffffffffffff199093169590931694909417179055848152600690915220805460ff191684179055925490916121fb916139bb565b6040518681527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a4505050565b336122466000546001600160a01b031690565b6001600160a01b03161461228a5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6117ee612f03565b6122a1868633878787876116cd565b505050505050565b600154600090600160a01b900460ff16156122f95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6000806000806123098833612ada565b82546001600160801b03808416600160801b0291161783559296509094509250905061233788888389612f90565b604051818152889033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a3979650505050505050565b60048181548110611a2257600080fd5b60005b8281101561157b57600080308686858181106123aa576123aa6138b3565b90506020028101906123bc9190613a05565b6040516123ca929190613a4b565b600060405180830381855af49150503d8060008114612405576040519150601f19603f3d011682016040523d82523d6000602084013e61240a565b606091505b50915091508115801561241a5750835b156124285761161581612daf565b50508080612435906139ea565b91505061238c565b336124506000546001600160a01b031690565b6001600160a01b0316146124945760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b8a156124a05760088c90555b88156124c357600a805467ffffffffffffffff19166001600160401b038c161790555b86156124f457600a80546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790555b841561250057600b8690555b821561250c5760098490555b8015611249575060075550505050505050505050565b600154600090600160a01b900460ff16156125725760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6000806000806125828933612ada565b93509350935093506001600160701b038460000151896001600160801b03166125ab91906137fa565b6125b59190613819565b6125bf9083613b46565b83546001600160801b03918216600160801b0290821681811786558a9286926000926125ee928692161761388b565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061261f8987836000612f90565b600060048a81548110612634576126346138b3565b6000918252602090912001546001600160a01b0316905080156126d4578354604051633164b15160e11b8152600481018c90526001600160801b03808c16602483015290911660448201523360648201526001600160a01b0389811660848301528216906362c962a29060a401600060405180830381600087803b1580156126bb57600080fd5b505af11580156126cf573d6000803e3d6000fd5b505050505b6126f5888a6001600160801b031660038d81548110610c0657610c066138b3565b6040516001600160801b038a1681526001600160a01b038916908b9033907f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21329060200160405180910390a46040518281528a9033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a35098975050505050505050565b336127976000546001600160a01b031690565b6001600160a01b0316146127db5760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b6001600160a01b0381166128405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dd2565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336128756000546001600160a01b031690565b6001600160a01b0316146128b95760405162461bcd60e51b81526020600482018190526024820152600080516020613c728339815191526044820152606401610dd2565b600a546001600160401b0316421161291157600a546128e890600160401b90046001600160401b0316426139bb565b6008546128f591906137fa565b600b600082825461290691906139d2565b9091555061297a9050565b600a546001600160401b03808216600160401b90920416101561297a57600a5461294d906001600160401b03600160401b82048116911661399b565b6001600160401b031660085461296391906137fa565b600b600082825461297491906139d2565b90915550505b6000600954600b5461298c91906139bb565b6040516370a0823160e01b815230600482015290915060009082906001600160a01b037f000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a816906370a0823190602401602060405180830381865afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c9190613982565b612a2691906139bb565b90506000612a348483613819565b9050612a408483613819565b612a4a90426139d2565b600a80546008879055426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556040517f95cfd9f2f74d54d4a4a8089f6253fb10b4fee5b577229663c42034159469988890612ab89086815260200190565b60405180910390a150505050565b6000612ad4823360006122a9565b92915050565b60408051606081018252600080825260208201819052918101829052908080612b0286611264565b60008781526005602090815260408083206001600160a01b038a1684529091529020815181549296509094506001600160701b0391612b4a91906001600160801b03166137fa565b612b549190613819565b8354909250612b6d90600160801b9004600f0b83613b46565b905092959194509250565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612bd49190613b9e565b6000604051808303816000865af19150503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150818015612c40575080511580612c40575080806020019051810190612c409190613b29565b612c8c5760405162461bcd60e51b815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610dd2565b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612cf79190613b9e565b6000604051808303816000865af19150503d8060008114612d34576040519150601f19603f3d011682016040523d82523d6000602084013e612d39565b606091505b5091509150818015612d63575080511580612d63575080806020019051810190612d639190613b29565b6122a15760405162461bcd60e51b815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610dd2565b6060604482511015612df457505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190612ad49190613bd0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600154600160a01b900460ff1615612eab5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610dd2565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ee63390565b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16612f5c5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610dd2565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612ee6565b8115612fe2578160096000828254612fa891906139d2565b90915550612fe290506001600160a01b037f000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a8168484612b78565b600060048581548110612ff757612ff76138b3565b6000918252602090912001546001600160a01b031690508015612c8c57604051634364cab560e11b815260048101869052602481018490523360448201526001600160a01b0385811660648301528216906386c9956a90608401600060405180830381600087803b15801561306b57600080fd5b505af192505050801561307c575060015b612c8c573d8080156130aa576040519150601f19603f3d011682016040523d82523d6000602084013e6130af565b606091505b50826130bd57805181602001fd5b50612c8c565b80356001600160801b038116811461153457600080fd5b6001600160a01b03811681146130ef57600080fd5b50565b80151581146130ef57600080fd5b8035611534816130f2565b6000806000806080858703121561312157600080fd5b84359350613131602086016130c3565b92506040850135613141816130da565b91506060850135613151816130f2565b939692955090935050565b60006020828403121561316e57600080fd5b5035919050565b6000806040838503121561318857600080fd5b82359150613198602084016130c3565b90509250929050565b600080604083850312156131b457600080fd5b8235915060208301356131c6816130da565b809150509250929050565b60008083601f8401126131e357600080fd5b5081356001600160401b038111156131fa57600080fd5b60208301915083602082850101111561321257600080fd5b9250929050565b60008060008060006080868803121561323157600080fd5b85359450613241602087016130c3565b93506040860135613251816130da565b925060608601356001600160401b0381111561326c57600080fd5b613278888289016131d1565b969995985093965092949392505050565b60008060006060848603121561329e57600080fd5b833592506132ae602085016130c3565b915060408401356132be816130da565b809150509250925092565b60008060008060008060a087890312156132e257600080fd5b863595506132f2602088016130c3565b94506040870135613302816130da565b93506060870135613312816130da565b925060808701356001600160401b0381111561332d57600080fd5b61333989828a016131d1565b979a9699509497509295939492505050565b803560ff8116811461153457600080fd5b600080600080600080600080610100898b03121561337957600080fd5b8835613384816130da565b97506020890135613394816130da565b965060408901356133a4816130da565b955060608901359450608089013593506133c060a08a0161334b565b925060c0890135915060e089013590509295985092959890939650565b60008083601f8401126133ef57600080fd5b5081356001600160401b0381111561340657600080fd5b6020830191508360208260051b850101111561321257600080fd5b6000806020838503121561343457600080fd5b82356001600160401b0381111561344a57600080fd5b613456858286016133dd565b90969095509350505050565b600080828403608081121561347657600080fd5b833592506060601f198201121561348c57600080fd5b506020830190509250929050565b600080600080600080600060e0888a0312156134b557600080fd5b873596506134c5602089016130c3565b955060408801356134d5816130da565b9450606088013593506134ea6080890161334b565b925060a0880135915060c0880135905092959891949750929550565b60008060006060848603121561351b57600080fd5b83359250602084013561352d816130da565b91506040840135600f81900b81146132be57600080fd5b6000806040838503121561355757600080fd5b8235613562816130da565b946020939093013593505050565b60006020828403121561358257600080fd5b8135610cad816130da565b600080600080608085870312156135a357600080fd5b84359350602085013592506040850135613141816130da565b6000806000606084860312156135d157600080fd5b8335925060208401356132ae816130da565b60008060008060008060c087890312156135fc57600080fd5b8635955061360c602088016130c3565b9450604087013593506136216060880161334b565b92506080870135915060a087013590509295509295509295565b60008060006060848603121561365057600080fd5b833592506020840135613662816130da565b915060408401356132be816130f2565b60008060006040848603121561368757600080fd5b83356001600160401b0381111561369d57600080fd5b6136a9868287016133dd565b90945092505060208401356132be816130f2565b6001600160401b03811681146130ef57600080fd5b6000806000806000806000806000806000806101808d8f0312156136f557600080fd5b8c359b5060208d0135613707816130f2565b9a5060408d0135613717816136bd565b995060608d0135613727816130f2565b985060808d0135613737816136bd565b975060a08d0135613747816130f2565b965060c08d0135955060e08d013561375e816130f2565b94506101008d013593506137756101208e01613100565b92506101408d0135915061378c6101608e01613100565b90509295989b509295989b509295989b565b600080600080608085870312156137b457600080fd5b843593506137c4602086016130c3565b925060408501356137d4816130da565b91506060850135613151816130da565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613814576138146137e4565b500290565b60008261383657634e487b7160e01b600052601260045260246000fd5b500490565b600081600f0b83600f0b600081128160016001607f1b031901831281151615613866576138666137e4565b8160016001607f1b03018313811615613881576138816137e4565b5090039392505050565b60006001600160801b03838116908316818110156138ab576138ab6137e4565b039392505050565b634e487b7160e01b600052603260045260246000fd5b6001600160801b038416815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006001600160801b0380831681851680830382111561392a5761392a6137e4565b01949350505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561395d5761395d6137e4565b8260016001607f1b0319038212811615613979576139796137e4565b50019392505050565b60006020828403121561399457600080fd5b5051919050565b60006001600160401b03838116908316818110156138ab576138ab6137e4565b6000828210156139cd576139cd6137e4565b500390565b600082198211156139e5576139e56137e4565b500190565b60006000198214156139fe576139fe6137e4565b5060010190565b6000808335601e19843603018112613a1c57600080fd5b8301803591506001600160401b03821115613a3657600080fd5b60200191503681900382131561321257600080fd5b8183823760009101908152919050565b60005b83811015613a76578181015183820152602001613a5e565b8381111561157b5750506000910152565b6020815260008251806020840152613aa6816040850160208701613a5b565b601f01601f19169190910160400192915050565b81358155600181016020830135613ad0816136bd565b6001600160401b03811690508154816001600160401b031982161783556040850135613afb816136bd565b6fffffffffffffffff00000000000000008160401b16836001600160801b0319841617178455505050505050565b600060208284031215613b3b57600080fd5b8151610cad816130f2565b60008083128015600160ff1b850184121615613b6457613b646137e4565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613b9857613b986137e4565b50500390565b60008251613bb0818460208701613a5b565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613be257600080fd5b81516001600160401b0380821115613bf957600080fd5b818401915084601f830112613c0d57600080fd5b815181811115613c1f57613c1f613bba565b604051601f8201601f19908116603f01168101908382118183101715613c4757613c47613bba565b81604052828152876020848701011115613c6057600080fd5b611f52836020830160208801613a5b56fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220a03de4131a6d30808db82b276914915e0cdfdf70921726ce59ac5ee449423c1364736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a8

-----Decoded View---------------
Arg [0] : _zipToken (address): 0xFA436399d0458Dbe8aB890c3441256E3E09022a8

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fa436399d0458dbe8ab890c3441256e3e09022a8


Deployed Bytecode Sourcemap

18326:2823:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8067:906;;;;;;;;;;-1:-1:-1;8067:906:7;;;;;:::i;:::-;;:::i;:::-;;3844:98;;;;;;;;;;-1:-1:-1;3920:8:7;:15;3844:98;;;1298:25:8;;;1286:2;1271:18;3844:98:7;;;;;;;;20542:212;;;;;;;;;;-1:-1:-1;20542:212:7;;;;;:::i;:::-;;:::i;18696:106::-;;;;;;;;;;-1:-1:-1;18696:106:7;;;;;:::i;:::-;;:::i;1906:26::-;;;;;;;;;;-1:-1:-1;1906:26:7;;;;;:::i;:::-;;:::i;:::-;;;;1976:25:8;;;-1:-1:-1;;;;;2074:15:8;;;2069:2;2054:18;;2047:43;2126:15;;2106:18;;;2099:43;1964:2;1949:18;1906:26:7;1778:370:8;2410:27:7;;;;;;;;;;;;;;;;20129:114;;;;;;;;;;-1:-1:-1;20129:114:7;;;;;:::i;:::-;;:::i;19318:214::-;;;;;;;;;;-1:-1:-1;19318:214:7;;;;;:::i;:::-;;:::i;7114:675::-;;;;;;;;;;-1:-1:-1;7114:675:7;;;;;:::i;:::-;;:::i;18470:220::-;;;;;;;;;;-1:-1:-1;18470:220:7;;;;;:::i;:::-;;:::i;20370:166::-;;;;;;;;;;-1:-1:-1;20370:166:7;;;;;:::i;:::-;;:::i;11850:612::-;;;;;;;;;;-1:-1:-1;11850:612:7;;;;;:::i;:::-;;:::i;2620:274:0:-;;;;;;;;;;-1:-1:-1;2620:274:0;;;;;:::i;:::-;;:::i;19662:119:7:-;;;;;;;;;;-1:-1:-1;19662:119:7;;;;;:::i;:::-;;:::i;2813:33::-;;;;;;;;;;-1:-1:-1;2813:33:7;;;;-1:-1:-1;;;;;2813:33:7;;;;;;-1:-1:-1;;;;;5990:31:8;;;5972:50;;5960:2;5945:18;2813:33:7;5828:200:8;2444:24:7;;;;;;;;;;;;;;;;5389:1112;;;;;;;;;;-1:-1:-1;5389:1112:7;;;;;:::i;:::-;;:::i;:::-;;;;6249:13:8;;6231:32;;6310:4;6298:17;;;6292:24;-1:-1:-1;;;;;6391:21:8;;;6369:20;;;6362:51;;;;6461:17;;;6455:24;6451:33;;;6429:20;;;6422:63;6219:2;6204:18;5389:1112:7;6033:458:8;2716:28:7;;;;;;;;;;;;;;;;6679:202;;;;;;;;;;-1:-1:-1;6679:202:7;;;;;:::i;:::-;;:::i;1089:84:6:-;;;;;;;;;;-1:-1:-1;1159:7:6;;-1:-1:-1;;;1159:7:6;;;;1089:84;;;7475:14:8;;7468:22;7450:41;;7438:2;7423:18;1089:84:6;7310:187:8;14704:53:7;;;;;;;;;;-1:-1:-1;14704:53:7;;;;-1:-1:-1;;;14704:53:7;;-1:-1:-1;;;;;14704:53:7;;;1812:416:0;;;;;;:::i;:::-;;:::i;17517:136:7:-;;;;;;;;;;-1:-1:-1;17517:136:7;;;;;:::i;:::-;;:::i;18808:242::-;;;;;;;;;;-1:-1:-1;18808:242:7;;;;;:::i;:::-;;:::i;1102:101:5:-;;;;;;;;;;;;;:::i;17659:194:7:-;;;;;;;;;;-1:-1:-1;17659:194:7;;;;;:::i;:::-;;:::i;17859:277::-;;;;;;;;;;-1:-1:-1;17859:277:7;;;;;:::i;:::-;;:::i;1993:23::-;;;;;;;;;;-1:-1:-1;1993:23:7;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9959:55:8;;;9941:74;;9929:2;9914:18;1993:23:7;9781:240:8;1550:161:5;;;;;;;;;;;;;:::i;2266:44:7:-;;;;;;;;;;-1:-1:-1;2266:44:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;1832:32;;;;;;;;;;;;;;;20825:322;;;;;;;;;;-1:-1:-1;20825:322:7;;;;;:::i;:::-;;:::i;14305:393::-;;;;;;;;;;-1:-1:-1;14305:393:7;;;;;:::i;:::-;;:::i;472:85:5:-;;;;;;;;;;-1:-1:-1;518:7:5;544:6;-1:-1:-1;;;;;544:6:5;472:85;;2167:66:7;;;;;;;;;;-1:-1:-1;2167:66:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2167:66:7;;;-1:-1:-1;;;2167:66:7;;;;;;;;;;-1:-1:-1;;;;;12075:47:8;;;12057:66;;12170:2;12159:22;;;;12154:2;12139:18;;12132:50;12030:18;2167:66:7;11885:303:8;19787:165:7;;;;;;;;;;-1:-1:-1;19787:165:7;;;;;:::i;:::-;;:::i;4170:1040::-;;;;;;;;;;-1:-1:-1;4170:1040:7;;;;;:::i;:::-;;:::i;18142:85::-;;;;;;;;;;;;;:::i;19538:118::-;;;;;;;;;;-1:-1:-1;19538:118:7;;;;;:::i;:::-;;:::i;13333:582::-;;;;;;;;;;-1:-1:-1;13333:582:7;;;;;:::i;:::-;;:::i;18233:89::-;;;;;;;;;;;;;:::i;19056:191::-;;;;;;;;;;-1:-1:-1;19056:191:7;;;;;:::i;:::-;;:::i;8979:447::-;;;;;;;;;;-1:-1:-1;8979:447:7;;;;;:::i;:::-;;:::i;2076:27::-;;;;;;;;;;-1:-1:-1;2076:27:7;;;;;:::i;:::-;;:::i;1468:338:0:-;;;;;;:::i;:::-;;:::i;16363:1148:7:-;;;;;;;;;;-1:-1:-1;16363:1148:7;;;;;:::i;:::-;;:::i;14763:38::-;;;;;;;;;;;;;;;;9730:863;;;;;;;;;;-1:-1:-1;9730:863:7;;;;;:::i;:::-;;:::i;1352:192:5:-;;;;;;;;;;-1:-1:-1;1352:192:5;;;;;:::i;:::-;;:::i;14993:1070:7:-;;;;;;;;;;-1:-1:-1;14993:1070:7;;;;;:::i;:::-;;:::i;20249:115::-;;;;;;;;;;-1:-1:-1;20249:115:7;;;;;:::i;:::-;;:::i;8067:906::-;8169:20;8191:21;8214:19;8235:15;8254:38;8276:3;8281:10;8254:21;:38::i;:::-;8168:124;;;;;;;;-1:-1:-1;;;;;8350:4:7;:19;;;8342:6;-1:-1:-1;;;;;8337:12:7;:32;;;;:::i;:::-;:52;;;;:::i;:::-;8303:88;;:4;;:15;;:88;;;;-1:-1:-1;;;8303:88:7;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;8303:88:7;;;;;;;;;;;;;;;8401:21;;8416:6;;-1:-1:-1;8401:21:7;;-1:-1:-1;;8401:21:7;;8416:6;;8401:21;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;8401:21:7;;;;;-1:-1:-1;;;;;8401:21:7;;;;;;8450:19;8472:8;8481:3;8472:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;8472:13:7;;-1:-1:-1;8499:32:7;;8495:371;;8594:11;;8551:71;;-1:-1:-1;;;8551:71:7;;;;;18100:25:8;;;-1:-1:-1;;;;;18214:15:8;;;18194:18;;;18187:43;8594:11:7;;;18246:18:8;;;18239:43;8607:10:7;18359:18:8;;;18352:43;-1:-1:-1;;;;;18432:15:8;;;18411:19;;;18404:44;8551:29:7;;;;;18072:19:8;;8551:71:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8547:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8688:17;8684:158;;8794:6;8788:13;8779:6;8775:2;8771:15;8764:38;8684:158;8638:218;8547:309;8876:37;8902:2;8906:6;-1:-1:-1;;;;;8876:37:7;:7;8884:3;8876:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;8876:12:7;;:37;:25;:37::i;:::-;8929;;-1:-1:-1;;;;;18623:47:8;;18605:66;;-1:-1:-1;;;;;8929:37:7;;;8950:3;;8938:10;;8929:37;;18593:2:8;18578:18;8929:37:7;;;;;;;8158:815;;;;;8067:906;;;;:::o;20542:212::-;20601:4;20641:13;;;:8;:13;;;;;;;;20655:10;20641:25;;;;;;;20711:11;;20641:25;;20683:64;;20650:3;;-1:-1:-1;;;;;20711:11:7;;;;20655:10;20683:22;:64::i;:::-;20676:71;20542:212;-1:-1:-1;;;20542:212:7:o;18696:106::-;18763:32;18771:3;18776:6;18784:10;18763:7;:32::i;:::-;18696:106;;:::o;1906:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1906:26:7;;;;-1:-1:-1;;;1906:26:7;;;;:::o;20129:114::-;20186:4;20209:27;20221:3;20226:2;20230:5;20209:11;:27::i;19318:214::-;19420:36;19433:3;19438:6;19446:2;19450:5;19420:12;:36::i;:::-;19466:59;;-1:-1:-1;;;19466:59:7;;-1:-1:-1;;;;;19466:45:7;;;;;:59;;19512:6;;19520:4;;;;19466:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19318:214;;;;;:::o;7114:675::-;1159:7:6;;-1:-1:-1;;;1159:7:6;;;;1402:9;1394:38;;;;-1:-1:-1;;;1394:38:6;;19389:2:8;1394:38:6;;;19371:21:8;19428:2;19408:18;;;19401:30;-1:-1:-1;;;19447:18:8;;;19440:46;19503:18;;1394:38:6;;;;;;;;;7200:20:7::1;7223:15;7234:3;7223:10;:15::i;:::-;7248:21;7272:13:::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;7272:17:7;::::1;::::0;;;;;;;7300:21;;7200:38;;-1:-1:-1;7272:17:7;7315:6;;7272:17;;7300:21:::1;::::0;7315:6;;-1:-1:-1;;;;;7300:21:7::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;7300:21:7::1;;;;;-1:-1:-1::0;;;;;7300:21:7::1;;;;;;7331;-1:-1:-1::0;;;;;7368:4:7::1;:19;;;7360:6;-1:-1:-1::0;;;;;7355:12:7::1;:32;;;;:::i;:::-;:52;;;;:::i;:::-;7417::::0;;7331:76;;-1:-1:-1;7331:76:7;;7417:4;;:15:::1;::::0;:52:::1;::::0;7331:76;;-1:-1:-1;;;7417:52:7;::::1;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;7417:52:7::1;;;;;;;-1:-1:-1::0;;;;;7417:52:7::1;;;;;;7480:19;7502:8;7511:3;7502:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;7502:13:7::1;::::0;-1:-1:-1;7529:32:7;;7525:131:::1;;7617:11:::0;;7577:68:::1;::::0;-1:-1:-1;;;7577:68:7;;::::1;::::0;::::1;18100:25:8::0;;;-1:-1:-1;;;;;18214:15:8;;;18194:18;;;18187:43;7617:11:7;;::::1;18246:18:8::0;;;18239:43;7630:10:7::1;18359:18:8::0;;;18352:43;-1:-1:-1;;;;;18432:15:8;;;18411:19;;;18404:44;7577:26:7;::::1;::::0;::::1;::::0;18072:19:8;;7577:68:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7525:131;7666:64;7696:10;7716:4;7723:6;-1:-1:-1::0;;;;;7666:64:7::1;:7;7674:3;7666:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;7666:12:7::1;::::0;:64;;:29:::1;:64::i;:::-;7746:36;::::0;-1:-1:-1;;;;;18623:47:8;;18605:66;;-1:-1:-1;;;;;7746:36:7;::::1;::::0;7766:3;;7754:10:::1;::::0;7746:36:::1;::::0;18593:2:8;18578:18;7746:36:7::1;;;;;;;7190:599;;;;7114:675:::0;;;:::o;18470:220::-;18605:24;18613:3;18618:6;18626:2;18605:7;:24::i;:::-;18639:44;;-1:-1:-1;;;18639:44:7;;-1:-1:-1;;;;;18639:30:7;;;;;:44;;18670:6;;18678:4;;;;18639:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18470:220;;;;;;:::o;20370:166::-;20447:4;20470:59;20493:3;20498:6;20506:10;20518;20470:22;:59::i;11850:612::-;11917:11;11964:13;;;:8;:13;;;;;;;;11978:10;11964:25;;;;;;;12008:11;;12054:19;;;12106:8;:13;;-1:-1:-1;;;;;12008:11:7;;;;11917;11973:3;;12106:13;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;12106:13:7;;-1:-1:-1;12133:32:7;;12129:151;;12185:61;;-1:-1:-1;;;12185:61:7;;;;;20458:25:8;;;20499:18;;;20492:34;;;12228:1:7;20542:18:8;;;20535:34;12231:10:7;20646:18:8;;;20639:43;-1:-1:-1;;;;;20719:15:8;;;20698:19;;;20691:44;12185:29:7;;;;;20430:19:8;;12185:61:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12181:89;;12357:37;12383:2;12387:6;12357:7;12365:3;12357:12;;;;;;;;:::i;:37::-;12452:2;-1:-1:-1;;;;;12409:46:7;12439:3;12427:10;-1:-1:-1;;;;;12409:46:7;;12444:6;12409:46;;;;1298:25:8;;1286:2;1271:18;;1152:177;12409:46:7;;;;;;;;11930:532;;11850:612;;;;:::o;2620:274:0:-;2838:49;;-1:-1:-1;;;2838:49:0;;-1:-1:-1;;;;;21136:15:8;;;2838:49:0;;;21118:34:8;21188:15;;;21168:18;;;21161:43;21220:18;;;21213:34;;;21263:18;;;21256:34;;;21339:4;21327:17;;21306:19;;;21299:46;21361:19;;;21354:35;;;21405:19;;;21398:35;;;2838:12:0;;;;;21029:19:8;;2838:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2620:274;;;;;;;;:::o;19662:119:7:-;19730:44;19743:3;19748:6;19756:10;19768:5;19730:12;:44::i;5389:1112::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;5474:8:7;5483:3;5474:13;;;;;;;;:::i;:::-;;;;;;;;;;5467:20;;;;;;;;5474:13;;;;;;;5467:20;;;;;;;-1:-1:-1;;;;;5467:20:7;;;;;;;;;-1:-1:-1;;;5467:20:7;;;;;;;;;-1:-1:-1;5501:15:7;:37;5497:998;;;5554:13;5570:7;5578:3;5570:12;;;;;;;;:::i;:::-;;;;;;;;;;;:37;;-1:-1:-1;;;5570:37:7;;5601:4;5570:37;;;9941:74:8;-1:-1:-1;;;;;5570:12:7;;;;:22;;9914:18:8;;5570:37:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5554:53;;5636:1;5625:8;:12;:35;;;;;5659:1;5641:15;;:19;5625:35;5621:682;;;5728:19;;5680:9;;-1:-1:-1;;;;;5728:19:7;5710:15;:37;5707:415;;;5796:19;;5774;;;;-1:-1:-1;;;;;5796:19:7;;;5774:41;;;5771:226;;;5872:19;;;;5850;;:41;;5872:19;-1:-1:-1;;;;;5850:19:7;:41;:::i;:::-;-1:-1:-1;;;;;5843:48:7;;;5707:415;;5771:226;-1:-1:-1;5973:1:7;5707:415;;;6084:19;;;;6066:37;;-1:-1:-1;;;;;6066:37:7;:15;:37;:::i;:::-;6059:44;;5707:415;6139:16;6192:15;;6176:4;:15;;;-1:-1:-1;;;;;6158:33:7;6163:12;;6158:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;:49;;;;:::i;:::-;6139:68;-1:-1:-1;6280:8:7;6248:29;-1:-1:-1;;;;;6139:68:7;6248:29;:::i;:::-;:40;;;;:::i;:::-;6225:63;;:4;;:63;;;;;:::i;:::-;;;-1:-1:-1;;;5621:682:7;-1:-1:-1;;;;;6345:15:7;6316:45;:19;;;:45;6375:8;:13;;6316:4;;6375:8;6384:3;;6375:13;;;;;;:::i;:::-;;;;;;;;;;:20;;:13;;;;;;:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6375:20:7;;;-1:-1:-1;;;6375:20:7;-1:-1:-1;;6375:20:7;;;;;;;;;;;;;6433:19;;;;6464;;6414:70;;22348:31:8;;;;22330:50;;22396:18;;;22389:34;;;22439:18;;;22432:34;;;;6428:3:7;;6414:70;;22318:2:8;22303:18;6414:70:7;;;;;;;5540:955;5497:998;5389:1112;;;:::o;6679:202::-;6756:4;6745:8;6777:98;6798:3;6794:1;:7;6777:98;;;6822:20;6845:19;6856:4;;6861:1;6856:7;;;;;;;:::i;:::-;;;;;;;6845:10;:19::i;:::-;-1:-1:-1;6803:3:7;;-1:-1:-1;6803:3:7;;:::i;:::-;;;6777:98;;;;6735:146;6679:202;;:::o;1812:416:0:-;1996:9;1991:231;2011:16;;;1991:231;;;2049:12;;2094:4;2113:5;;2119:1;2113:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2086:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2048:74;;;;2141:7;2136:76;;2175:21;2189:6;2175:13;:21::i;:::-;2168:29;;-1:-1:-1;;;2168:29:0;;;;;;;;:::i;2136:76::-;2034:188;;2029:3;;;;;:::i;:::-;;;;1991:231;;;;1812:416;;:::o;17517:136:7:-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;17635:11:7::1;17619:8;17628:3;17619:13;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;;;;:::i;18808:242::-:0;18936:7;18944:3;18936:12;;;;;;;;:::i;:::-;;;;;;;;;;;:73;;-1:-1:-1;;;18936:73:7;;18956:10;18936:73;;;25515:34:8;18976:4:7;25565:18:8;;;25558:43;-1:-1:-1;;;;;25637:47:8;;25617:18;;;25610:75;25701:18;;;25694:34;;;25777:4;25765:17;;25744:19;;;25737:46;25799:19;;;25792:35;;;25843:19;;;25836:35;;;-1:-1:-1;;;;;18936:12:7;;;;:19;;25426::8;;18936:73:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19019:24;19027:3;19032:6;19040:2;19019:7;:24::i;:::-;18808:242;;;;;;;:::o;1102:101:5:-;695:10;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;1166:30:::1;1193:1;1166:18;:30::i;:::-;1102:101::o:0;17659:194:7:-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;17766:21:7::1;17790:13:::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;17790:18:7;;::::1;::::0;;;;;;;17818:28;;-1:-1:-1;;;;;17818:28:7;;;-1:-1:-1;;;17818:28:7::1;::::0;::::1;::::0;;;::::1;::::0;;17659:194::o;17859:277::-;17953:4;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;17972:11:7;17969:83:::1;;18008:33;::::0;-1:-1:-1;;;18008:33:7;;18035:4:::1;18008:33;::::0;::::1;9941:74:8::0;18008:8:7::1;-1:-1:-1::0;;;;;18008:18:7::1;::::0;::::1;::::0;9914::8;;18008:33:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17999:42;;17969:83;18069:36;::::0;-1:-1:-1;;;18069:36:7;;-1:-1:-1;;;;;26074:55:8;;;18069:36:7::1;::::0;::::1;26056:74:8::0;26146:18;;;26139:34;;;18069:8:7::1;:17;::::0;::::1;::::0;26029:18:8;;18069:36:7::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18061:45;;;::::0;::::1;;-1:-1:-1::0;18123:6:7;17859:277;-1:-1:-1;17859:277:7:o;1993:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1993:23:7;;-1:-1:-1;1993:23:7;:::o;1550:161:5:-;1624:8;;-1:-1:-1;;;;;1624:8:5;1610:10;:22;1602:62;;;;-1:-1:-1;;;1602:62:5;;26636:2:8;1602:62:5;;;26618:21:8;26675:2;26655:18;;;26648:30;26714:29;26694:18;;;26687:57;26761:18;;1602:62:5;26434:351:8;1602:62:5;1674:30;1693:10;1674:18;:30::i;20825:322:7:-;20965:17;21009:56;21032:3;21037:6;21045:8;21055:9;21009:22;:56::i;:::-;21075:65;;-1:-1:-1;;;21075:65:7;;20994:71;;-1:-1:-1;;;;;;21075:51:7;;;;;:65;;21127:6;;21135:4;;;;21075:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20825:322;;;;;;;;:::o;14305:393::-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;14473:11:7::1;14447:8;14456:4;14447:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:25;;::::0;14431:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;14447:25:7;::::1;-1:-1:-1::0;;;;;14447:25:7::1;::::0;14431:41:::1;:::i;:::-;:53;;;;:::i;:::-;14413:15;:71;;;;14529:11;14494:8;14503:4;14494:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;:47;;;;;-1:-1:-1::0;;;;;14494:47:7::1;;;;;-1:-1:-1::0;;;;;14494:47:7::1;;;;;;14555:9;14551:46;;;14585:9;14568:8;14577:4;14568:14;;;;;;;;:::i;:::-;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;14568:26:7::1;;;;;-1:-1:-1::0;;;;;14568:26:7::1;;;;;;14551:46;14641:9;:38;;14665:8;14674:4;14665:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;14665:14:7::1;14641:38;;;14653:9;14641:38;-1:-1:-1::0;;;;;14611:80:7::1;14622:4;14611:80;14628:11;14681:9;14611:80;;;;;;26958:25:8::0;;;27026:14;27019:22;27014:2;26999:18;;26992:50;26946:2;26931:18;;26790:258;14611:80:7::1;;;;;;;;14305:393:::0;;;;:::o;19787:165::-;19837:21;19861:13;;;:8;:13;;;;;;;;19875:10;19861:25;;;;;;;19914:11;;19861:25;;19896:49;;19870:3;;-1:-1:-1;;;;;19914:11:7;;19896:12;:49::i;4170:1040::-;4242:12;4266:20;4289:8;4298:4;4289:14;;;;;;;;:::i;:::-;;;;;;;;;4266:37;;;;;;;;4289:14;;;;;;;4266:37;;;;;;;-1:-1:-1;;;;;4266:37:7;;;;;;;-1:-1:-1;;;4266:37:7;;;;;;;;4337:14;;;:8;:14;;;;;-1:-1:-1;;;;;4337:21:7;;;;;;;;;4390:19;;4435:7;:13;;4266:37;;-1:-1:-1;4337:21:7;;4390:19;;4289:14;;4435:7;4346:4;;4435:13;;;;;;:::i;:::-;;;;;;;;;;;:38;;-1:-1:-1;;;4435:38:7;;4467:4;4435:38;;;9941:74:8;-1:-1:-1;;;;;4435:13:7;;;;:23;;9914:18:8;;4435:38:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4419:54;;4499:1;4488:8;:12;:35;;;;;4522:1;4504:15;;:19;4488:35;4484:621;;;4583:19;;4539:9;;-1:-1:-1;;;;;4583:19:7;4565:15;:37;4562:379;;;4647:19;;4625;;;;-1:-1:-1;;;;;4647:19:7;;;4625:41;;;4622:206;;;4719:19;;;;4697;;:41;;4719:19;-1:-1:-1;;;;;4697:19:7;:41;:::i;:::-;-1:-1:-1;;;;;4690:48:7;;;4562:379;;4622:206;-1:-1:-1;4808:1:7;4562:379;;;4907:19;;;;4889:37;;-1:-1:-1;;;;;4889:37:7;:15;:37;:::i;:::-;4882:44;;4562:379;4954:16;5007:15;;4991:4;:15;;;-1:-1:-1;;;;;4973:33:7;4978:12;;4973:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;:49;;;;:::i;:::-;4954:68;-1:-1:-1;5086:8:7;5054:29;-1:-1:-1;;;;;4954:68:7;5054:29;:::i;:::-;:40;;;;:::i;:::-;5036:58;;;;:::i;:::-;;;4525:580;;4484:621;5187:15;;-1:-1:-1;;;5187:15:7;;;;;-1:-1:-1;;;;;2702:8:7;5133:32;;5151:14;;-1:-1:-1;;;;;5138:11:7;5133:32;:::i;:::-;:50;;;;:::i;:::-;5129:73;;;;:::i;:::-;5114:89;4170:1040;-1:-1:-1;;;;;;;4170:1040:7:o;18142:85::-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;18212:8:7::1;:6;:8::i;19538:118::-:0;19613:36;19626:3;19631:6;19639:2;19643:5;19613:12;:36::i;13333:582::-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;-1:-1:-1;;;;;13438:30:7;::::1;;::::0;;;:11:::1;:30;::::0;;;;;::::1;;:39;13430:71;;;::::0;-1:-1:-1;;;13430:71:7;;27574:2:8;13430:71:7::1;::::0;::::1;27556:21:8::0;27613:2;27593:18;;;27586:30;27652:21;27632:18;;;27625:49;27691:18;;13430:71:7::1;27372:343:8::0;13430:71:7::1;13530:10;13511:15;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;13550:7:7::1;:22:::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;13550:22:7;;::::1;-1:-1:-1::0;;;;;;13550:22:7;;::::1;::::0;::::1;::::0;;;13582:8:::1;:24:::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;13631:148:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;13631:148:7;;;-1:-1:-1;;;;;13721:15:7::1;13631:148:::0;::::1;13550:22;13631:148:::0;;::::1;::::0;;;;;::::1;::::0;;;;;;13617:8:::1;:163:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;::::1;-1:-1:-1::0;;;13617:163:7::1;-1:-1:-1::0;;13617:163:7;;;;;;::::1;::::0;;;;::::1;::::0;;13790:30;;;:11:::1;:30:::0;;;;:37;;-1:-1:-1;;13790:37:7::1;::::0;::::1;::::0;;13858:14;;13550:22;;13858:16:::1;::::0;::::1;:::i;:::-;13842:66;::::0;1298:25:8;;;13842:66:7::1;::::0;1286:2:8;1271:18;13842:66:7::1;;;;;;;13333:582:::0;;;:::o;18233:89::-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;18305:10:7::1;:8;:10::i;19056:191::-:0;19179:61;19197:3;19202:6;19210:10;19222:8;19232:1;19235;19238;19179:17;:61::i;:::-;19056:191;;;;;;:::o;8979:447::-;1159:7:6;;9076:4:7;;-1:-1:-1;;;1159:7:6;;;;1402:9;1394:38;;;;-1:-1:-1;;;1394:38:6;;19389:2:8;1394:38:6;;;19371:21:8;19428:2;19408:18;;;19401:30;-1:-1:-1;;;19447:18:8;;;19440:46;19503:18;;1394:38:6;19187:340:8;1394:38:6;9093:20:7::1;9115:21:::0;9138:19:::1;9159:15:::0;9178:38:::1;9200:3;9205:10;9178:21;:38::i;:::-;9227:49:::0;;-1:-1:-1;;;;;9227:49:7;;;-1:-1:-1;;;9227:49:7::1;::::0;::::1;;::::0;;9092:124;;-1:-1:-1;9092:124:7;;-1:-1:-1;9092:124:7;-1:-1:-1;9092:124:7;-1:-1:-1;9286:54:7::1;9301:3:::0;9306:2;9092:124;9322:17;9286:14:::1;:54::i;:::-;9356:36;::::0;1298:25:8;;;9376:3:7;;9364:10:::1;::::0;9356:36:::1;::::0;1286:2:8;1271:18;9356:36:7::1;;;;;;;9409:10:::0;8979:447;-1:-1:-1;;;;;;;8979:447:7:o;2076:27::-;;;;;;;;;;;;1468:338:0;1558:9;1553:247;1573:16;;;1553:247;;;1611:12;;1656:4;1675:5;;1681:1;1675:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1648:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:74;;;;1703:7;1702:8;:24;;;;;1714:12;1702:24;1698:92;;;1753:21;1767:6;1753:13;:21::i;1698:92::-;1596:204;;1591:3;;;;;:::i;:::-;;;;1553:247;;16363:1148:7;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;16842:18:7::1;16839:78;;;16876:12;:30:::0;;;16839:78:::1;16929:22;16926:96;;;16967:19;:44:::0;;-1:-1:-1;;16967:44:7::1;-1:-1:-1::0;;;;;16967:44:7;::::1;;::::0;;16926:96:::1;17034:42;17031:156;;;17092:39;:84:::0;;-1:-1:-1;;17092:84:7::1;-1:-1:-1::0;;;;;;;;17092:84:7;::::1;;;::::0;;17031:156:::1;17199:29;17196:117;;;17244:26;:58:::0;;;17196:117:::1;17325:22;17322:90;;;17363:16;:38:::0;;;17322:90:::1;17424:18;17421:84;;;-1:-1:-1::0;17458:15:7::1;:36:::0;-1:-1:-1;;;;;;;;;;16363:1148:7:o;9730:863::-;1159:7:6;;9855:4:7;;-1:-1:-1;;;1159:7:6;;;;1402:9;1394:38;;;;-1:-1:-1;;;1394:38:6;;19389:2:8;1394:38:6;;;19371:21:8;19428:2;19408:18;;;19401:30;-1:-1:-1;;;19447:18:8;;;19440:46;19503:18;;1394:38:6;19187:340:8;1394:38:6;9872:20:7::1;9894:21:::0;9917:19:::1;9938:15:::0;9957:38:::1;9979:3;9984:10;9957:21;:38::i;:::-;9871:124;;;;;;;;-1:-1:-1::0;;;;;10068:4:7::1;:19;;;10060:6;-1:-1:-1::0;;;;;10055:12:7::1;:32;;;;:::i;:::-;:52;;;;:::i;:::-;10031:77;::::0;10035:14;10031:77:::1;:::i;:::-;10006:103:::0;;-1:-1:-1;;;;;10006:103:7;;;-1:-1:-1;;;10006:103:7::1;::::0;;::::1;::::0;;::::1;::::0;;10134:6;;10006:4;;:15:::1;::::0;10119:21:::1;::::0;10134:6;;10119:21;;::::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;10119:21:7::1;;;;;-1:-1:-1::0;;;;;10119:21:7::1;;;;;;10151:49;10166:3;10171:9;10182:10;10194:5;10151:14;:49::i;:::-;10211:19;10233:8;10242:3;10233:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;10233:13:7::1;::::0;-1:-1:-1;10260:32:7;;10256:140:::1;;10351:11:::0;;10308:77:::1;::::0;-1:-1:-1;;;10308:77:7;;::::1;::::0;::::1;18100:25:8::0;;;-1:-1:-1;;;;;18214:15:8;;;18194:18;;;18187:43;10351:11:7;;::::1;18246:18:8::0;;;18239:43;10364:10:7::1;18359:18:8::0;;;18352:43;-1:-1:-1;;;;;18432:15:8;;;18411:19;;;18404:44;10308:29:7;::::1;::::0;::::1;::::0;18072:19:8;;10308:77:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10256:140;10406:43;10432:8;10442:6;-1:-1:-1::0;;;;;10406:43:7::1;:7;10414:3;10406:12;;;;;;;;:::i;:43::-;10465;::::0;-1:-1:-1;;;;;18623:47:8;;18605:66;;-1:-1:-1;;;;;10465:43:7;::::1;::::0;10486:3;;10474:10:::1;::::0;10465:43:::1;::::0;18593:2:8;18578:18;10465:43:7::1;;;;;;;10523:36;::::0;1298:25:8;;;10543:3:7;;10531:10:::1;::::0;10523:36:::1;::::0;1286:2:8;1271:18;10523:36:7::1;;;;;;;-1:-1:-1::0;10576:10:7;9730:863;-1:-1:-1;;;;;;;;9730:863:7:o;1352:192:5:-;695:10;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;-1:-1:-1;;;;;1441:23:5;::::1;1433:74;;;::::0;-1:-1:-1;;;1433:74:5;;27922:2:8;1433:74:5::1;::::0;::::1;27904:21:8::0;27961:2;27941:18;;;27934:30;28000:34;27980:18;;;27973:62;-1:-1:-1;;;28051:18:8;;;28044:36;28097:19;;1433:74:5::1;27720:402:8::0;1433:74:5::1;1517:8;:20:::0;;-1:-1:-1;;;;;;1517:20:5::1;-1:-1:-1::0;;;;;1517:20:5;;;::::1;::::0;;;::::1;::::0;;1352:192::o;14993:1070:7:-;695:10:5;684:7;518;544:6;-1:-1:-1;;;;;544:6:5;;472:85;684:7;-1:-1:-1;;;;;684:21:5;;676:66;;;;-1:-1:-1;;;676:66:5;;24272:2:8;676:66:5;;;24254:21:8;;;24291:18;;;24284:30;-1:-1:-1;;;;;;;;;;;24330:18:8;;;24323:62;24402:18;;676:66:5;24070:356:8;676:66:5;15091:19:7::1;::::0;-1:-1:-1;;;;;15091:19:7::1;15072:15;:38;15069:514;;15240:39;::::0;15219:61:::1;::::0;-1:-1:-1;;;15240:39:7;::::1;-1:-1:-1::0;;;;;15240:39:7::1;15219:15;:61;:::i;:::-;15205:12;;:76;;;;:::i;:::-;15175:26;;:106;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;15069:514:7::1;::::0;-1:-1:-1;15069:514:7::1;;15411:19;::::0;-1:-1:-1;;;;;15411:19:7;;::::1;-1:-1:-1::0;;;15369:39:7;;::::1;;:61;15366:207;;;15518:39;::::0;15498:59:::1;::::0;-1:-1:-1;;;;;;;;15518:39:7;::::1;::::0;::::1;::::0;15498:19:::1;:59;:::i;:::-;-1:-1:-1::0;;;;;15493:65:7::1;15480:12;;:78;;;;:::i;:::-;15450:26;;:108;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15366:207:7::1;15592:17;15639:16;;15612:26;;:43;;;;:::i;:::-;15689:33;::::0;-1:-1:-1;;;15689:33:7;;15716:4:::1;15689:33;::::0;::::1;9941:74:8::0;15592:63:7;;-1:-1:-1;15665:21:7::1;::::0;15592:63;;-1:-1:-1;;;;;15689:8:7::1;:18;::::0;::::1;::::0;9914::8;;15689:33:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;:::-;15665:70:::0;-1:-1:-1;15745:26:7::1;15774:32;15791:15:::0;15665:70;15774:32:::1;:::i;:::-;15745:61:::0;-1:-1:-1;15861:32:7::1;15878:15:::0;15861:16;:32:::1;:::i;:::-;15845:48;::::0;:15:::1;:48;:::i;:::-;15816:19;:78:::0;;15904:12:::1;:30:::0;;;15993:15:::1;-1:-1:-1::0;;;;;15944:65:7;;::::1;-1:-1:-1::0;;;15944:65:7::1;-1:-1:-1::0;;15944:65:7;;;15816:78;::::1;15944:65:::0;;;;;;;::::1;::::0;;16024:32:::1;::::0;::::1;::::0;::::1;::::0;15919:15;1298:25:8;;1286:2;1271:18;;1152:177;16024:32:7::1;;;;;;;;15059:1004;;;14993:1070:::0;:::o;20249:115::-;20299:4;20322:35;20334:3;20339:10;20351:5;20322:11;:35::i;:::-;20315:42;20249:115;-1:-1:-1;;20249:115:7:o;11288:382::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;11460:15:7;11471:3;11460:10;:15::i;:::-;11492:13;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;11492:18:7;;;;;;;;;11555:19;;11542:11;;11453:22;;-1:-1:-1;11492:18:7;;-1:-1:-1;;;;;;2702:8:7;11537:37;;11555:19;-1:-1:-1;;;;;11542:11:7;11537:37;:::i;:::-;:57;;;;:::i;:::-;11646:15;;11520:74;;-1:-1:-1;11622:40:7;;-1:-1:-1;;;11646:15:7;;;;11520:74;11622:40;:::i;:::-;11604:59;;11288:382;;;;;;;:::o;3507:333:1:-;3676:48;;;-1:-1:-1;;;;;26074:55:8;;;3676:48:1;;;26056:74:8;26146:18;;;;26139:34;;;3676:48:1;;;;;;;;;;26029:18:8;;;;3676:48:1;;;;;;;-1:-1:-1;;;;;3676:48:1;-1:-1:-1;;;3676:48:1;;;3656:69;;-1:-1:-1;;;;3656:19:1;;;;:69;;3676:48;3656:69;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3620:105;;;;3743:7;:57;;;;-1:-1:-1;3755:11:1;;:16;;:44;;;3786:4;3775:24;;;;;;;;;;;;:::i;:::-;3735:98;;;;-1:-1:-1;;;3735:98:1;;28608:2:8;3735:98:1;;;28590:21:8;28647:2;28627:18;;;28620:30;28686;28666:18;;;28659:58;28734:18;;3735:98:1;28406:352:8;3735:98:1;3610:230;;3507:333;;;:::o;4155:374::-;4350:59;;;-1:-1:-1;;;;;29044:15:8;;;4350:59:1;;;29026:34:8;29096:15;;;29076:18;;;29069:43;29128:18;;;;29121:34;;;4350:59:1;;;;;;;;;;28938:18:8;;;;4350:59:1;;;;;;;-1:-1:-1;;;;;4350:59:1;-1:-1:-1;;;4350:59:1;;;4330:80;;-1:-1:-1;;;;4330:19:1;;;;:80;;4350:59;4330:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4294:116;;;;4428:7;:57;;;;-1:-1:-1;4440:11:1;;:16;;:44;;;4471:4;4460:24;;;;;;;;;;;;:::i;:::-;4420:102;;;;-1:-1:-1;;;4420:102:1;;29368:2:8;4420:102:1;;;29350:21:8;;;29387:18;;;29380:30;29446:34;29426:18;;;29419:62;29498:18;;4420:102:1;29166:356:8;360:487:0;432:13;593:2;572:11;:18;:23;568:67;;;-1:-1:-1;;597:38:0;;;;;;;;;;;;;;;;;;360:487::o;568:67::-;735:4;722:11;718:22;703:37;;777:11;766:33;;;;;;;;;;;;:::i;1865:190:5:-;1939:16;1958:6;;-1:-1:-1;;;;;1974:18:5;;;-1:-1:-1;;;;;;1974:18:5;;;;;;2007:41;;1958:6;;;;;;;2007:41;;1939:16;2007:41;1929:126;1865:190;:::o;1854:115:6:-;1159:7;;-1:-1:-1;;;1159:7:6;;;;1402:9;1394:38;;;;-1:-1:-1;;;1394:38:6;;19389:2:8;1394:38:6;;;19371:21:8;19428:2;19408:18;;;19401:30;-1:-1:-1;;;19447:18:8;;;19440:46;19503:18;;1394:38:6;19187:340:8;1394:38:6;1923:4:::1;1913:14:::0;;-1:-1:-1;;;;1913:14:6::1;-1:-1:-1::0;;;1913:14:6::1;::::0;;1942:20:::1;1949:12;719:10:2::0;;640:96;1949:12:6::1;1942:20;::::0;-1:-1:-1;;;;;9959:55:8;;;9941:74;;9929:2;9914:18;1942:20:6::1;;;;;;;1854:115::o:0;2101:117::-;1159:7;;-1:-1:-1;;;1159:7:6;;;;1660:41;;;;-1:-1:-1;;;1660:41:6;;30750:2:8;1660:41:6;;;30732:21:8;30789:2;30769:18;;;30762:30;30828:22;30808:18;;;30801:50;30868:18;;1660:41:6;30548:344:8;1660:41:6;2159:7:::1;:15:::0;;-1:-1:-1;;;;2159:15:6::1;::::0;;2189:22:::1;719:10:2::0;2198:12:6::1;640:96:2::0;10599:683:7;10717:17;;10714:139;;10770:12;10750:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;10796:46:7;;-1:-1:-1;;;;;;10796:8:7;:21;10818:9;10829:12;10796:21;:46::i;:::-;10863:19;10885:8;10894:3;10885:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10885:13:7;;-1:-1:-1;10912:32:7;;10908:368;;10964:68;;-1:-1:-1;;;10964:68:7;;;;;31128:25:8;;;31169:18;;;31162:34;;;11010:10:7;31273:18:8;;;31266:43;-1:-1:-1;;;;;31345:15:8;;;31325:18;;;31318:43;10964:26:7;;;;;31100:19:8;;10964:68:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10960:306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11098:17;11094:158;;11204:6;11198:13;11189:6;11185:2;11181:15;11174:38;11094:158;11048:218;10960:306;;14:188:8;82:20;;-1:-1:-1;;;;;131:46:8;;121:57;;111:85;;192:1;189;182:12;207:154;-1:-1:-1;;;;;286:5:8;282:54;275:5;272:65;262:93;;351:1;348;341:12;262:93;207:154;:::o;366:118::-;452:5;445:13;438:21;431:5;428:32;418:60;;474:1;471;464:12;489:128;554:20;;583:28;554:20;583:28;:::i;622:525::-;705:6;713;721;729;782:3;770:9;761:7;757:23;753:33;750:53;;;799:1;796;789:12;750:53;835:9;822:23;812:33;;864:38;898:2;887:9;883:18;864:38;:::i;:::-;854:48;;952:2;941:9;937:18;924:32;965:31;990:5;965:31;:::i;:::-;1015:5;-1:-1:-1;1072:2:8;1057:18;;1044:32;1085:30;1044:32;1085:30;:::i;:::-;622:525;;;;-1:-1:-1;622:525:8;;-1:-1:-1;;622:525:8:o;1334:180::-;1393:6;1446:2;1434:9;1425:7;1421:23;1417:32;1414:52;;;1462:1;1459;1452:12;1414:52;-1:-1:-1;1485:23:8;;1334:180;-1:-1:-1;1334:180:8:o;1519:254::-;1587:6;1595;1648:2;1636:9;1627:7;1623:23;1619:32;1616:52;;;1664:1;1661;1654:12;1616:52;1700:9;1687:23;1677:33;;1729:38;1763:2;1752:9;1748:18;1729:38;:::i;:::-;1719:48;;1519:254;;;;;:::o;2153:315::-;2221:6;2229;2282:2;2270:9;2261:7;2257:23;2253:32;2250:52;;;2298:1;2295;2288:12;2250:52;2334:9;2321:23;2311:33;;2394:2;2383:9;2379:18;2366:32;2407:31;2432:5;2407:31;:::i;:::-;2457:5;2447:15;;;2153:315;;;;;:::o;2473:347::-;2524:8;2534:6;2588:3;2581:4;2573:6;2569:17;2565:27;2555:55;;2606:1;2603;2596:12;2555:55;-1:-1:-1;2629:20:8;;-1:-1:-1;;;;;2661:30:8;;2658:50;;;2704:1;2701;2694:12;2658:50;2741:4;2733:6;2729:17;2717:29;;2793:3;2786:4;2777:6;2769;2765:19;2761:30;2758:39;2755:59;;;2810:1;2807;2800:12;2755:59;2473:347;;;;;:::o;2825:687::-;2922:6;2930;2938;2946;2954;3007:3;2995:9;2986:7;2982:23;2978:33;2975:53;;;3024:1;3021;3014:12;2975:53;3060:9;3047:23;3037:33;;3089:38;3123:2;3112:9;3108:18;3089:38;:::i;:::-;3079:48;;3177:2;3166:9;3162:18;3149:32;3190:31;3215:5;3190:31;:::i;:::-;3240:5;-1:-1:-1;3296:2:8;3281:18;;3268:32;-1:-1:-1;;;;;3312:30:8;;3309:50;;;3355:1;3352;3345:12;3309:50;3394:58;3444:7;3435:6;3424:9;3420:22;3394:58;:::i;:::-;2825:687;;;;-1:-1:-1;2825:687:8;;-1:-1:-1;3471:8:8;;3368:84;2825:687;-1:-1:-1;;;2825:687:8:o;3517:389::-;3594:6;3602;3610;3663:2;3651:9;3642:7;3638:23;3634:32;3631:52;;;3679:1;3676;3669:12;3631:52;3715:9;3702:23;3692:33;;3744:38;3778:2;3767:9;3763:18;3744:38;:::i;:::-;3734:48;;3832:2;3821:9;3817:18;3804:32;3845:31;3870:5;3845:31;:::i;:::-;3895:5;3885:15;;;3517:389;;;;;:::o;3911:856::-;4044:6;4052;4060;4068;4076;4084;4137:3;4125:9;4116:7;4112:23;4108:33;4105:53;;;4154:1;4151;4144:12;4105:53;4190:9;4177:23;4167:33;;4219:38;4253:2;4242:9;4238:18;4219:38;:::i;:::-;4209:48;;4307:2;4296:9;4292:18;4279:32;4320:31;4345:5;4320:31;:::i;:::-;4370:5;-1:-1:-1;4427:2:8;4412:18;;4399:32;4440:33;4399:32;4440:33;:::i;:::-;4492:7;-1:-1:-1;4550:3:8;4535:19;;4522:33;-1:-1:-1;;;;;4567:30:8;;4564:50;;;4610:1;4607;4600:12;4564:50;4649:58;4699:7;4690:6;4679:9;4675:22;4649:58;:::i;:::-;3911:856;;;;-1:-1:-1;3911:856:8;;-1:-1:-1;3911:856:8;;4726:8;;3911:856;-1:-1:-1;;;3911:856:8:o;4772:156::-;4838:20;;4898:4;4887:16;;4877:27;;4867:55;;4918:1;4915;4908:12;4933:890;5067:6;5075;5083;5091;5099;5107;5115;5123;5176:3;5164:9;5155:7;5151:23;5147:33;5144:53;;;5193:1;5190;5183:12;5144:53;5232:9;5219:23;5251:31;5276:5;5251:31;:::i;:::-;5301:5;-1:-1:-1;5358:2:8;5343:18;;5330:32;5371:33;5330:32;5371:33;:::i;:::-;5423:7;-1:-1:-1;5482:2:8;5467:18;;5454:32;5495:33;5454:32;5495:33;:::i;:::-;5547:7;-1:-1:-1;5601:2:8;5586:18;;5573:32;;-1:-1:-1;5652:3:8;5637:19;;5624:33;;-1:-1:-1;5676:37:8;5708:3;5693:19;;5676:37;:::i;:::-;5666:47;;5760:3;5749:9;5745:19;5732:33;5722:43;;5812:3;5801:9;5797:19;5784:33;5774:43;;4933:890;;;;;;;;;;;:::o;6496:367::-;6559:8;6569:6;6623:3;6616:4;6608:6;6604:17;6600:27;6590:55;;6641:1;6638;6631:12;6590:55;-1:-1:-1;6664:20:8;;-1:-1:-1;;;;;6696:30:8;;6693:50;;;6739:1;6736;6729:12;6693:50;6776:4;6768:6;6764:17;6752:29;;6836:3;6829:4;6819:6;6816:1;6812:14;6804:6;6800:27;6796:38;6793:47;6790:67;;;6853:1;6850;6843:12;6868:437;6954:6;6962;7015:2;7003:9;6994:7;6990:23;6986:32;6983:52;;;7031:1;7028;7021:12;6983:52;7071:9;7058:23;-1:-1:-1;;;;;7096:6:8;7093:30;7090:50;;;7136:1;7133;7126:12;7090:50;7175:70;7237:7;7228:6;7217:9;7213:22;7175:70;:::i;:::-;7264:8;;7149:96;;-1:-1:-1;6868:437:8;-1:-1:-1;;;;6868:437:8:o;7955:338::-;8051:6;8059;8103:9;8094:7;8090:23;8133:3;8129:2;8125:12;8122:32;;;8150:1;8147;8140:12;8122:32;8173:23;;;-1:-1:-1;8230:2:8;-1:-1:-1;;8212:16:8;;8208:25;8205:45;;;8246:1;8243;8236:12;8205:45;;8284:2;8273:9;8269:18;8259:28;;7955:338;;;;;:::o;8298:667::-;8409:6;8417;8425;8433;8441;8449;8457;8510:3;8498:9;8489:7;8485:23;8481:33;8478:53;;;8527:1;8524;8517:12;8478:53;8563:9;8550:23;8540:33;;8592:38;8626:2;8615:9;8611:18;8592:38;:::i;:::-;8582:48;;8680:2;8669:9;8665:18;8652:32;8693:31;8718:5;8693:31;:::i;:::-;8743:5;-1:-1:-1;8795:2:8;8780:18;;8767:32;;-1:-1:-1;8818:37:8;8850:3;8835:19;;8818:37;:::i;:::-;8808:47;;8902:3;8891:9;8887:19;8874:33;8864:43;;8954:3;8943:9;8939:19;8926:33;8916:43;;8298:667;;;;;;;;;;:::o;8970:486::-;9046:6;9054;9062;9115:2;9103:9;9094:7;9090:23;9086:32;9083:52;;;9131:1;9128;9121:12;9083:52;9167:9;9154:23;9144:33;;9227:2;9216:9;9212:18;9199:32;9240:31;9265:5;9240:31;:::i;:::-;9290:5;-1:-1:-1;9347:2:8;9332:18;;9319:32;9393:2;9382:23;;;9370:36;;9360:64;;9420:1;9417;9410:12;9461:315;9529:6;9537;9590:2;9578:9;9569:7;9565:23;9561:32;9558:52;;;9606:1;9603;9596:12;9558:52;9645:9;9632:23;9664:31;9689:5;9664:31;:::i;:::-;9714:5;9766:2;9751:18;;;;9738:32;;-1:-1:-1;;;9461:315:8:o;10026:247::-;10085:6;10138:2;10126:9;10117:7;10113:23;10109:32;10106:52;;;10154:1;10151;10144:12;10106:52;10193:9;10180:23;10212:31;10237:5;10212:31;:::i;11112:537::-;11213:6;11221;11229;11237;11290:3;11278:9;11269:7;11265:23;11261:33;11258:53;;;11307:1;11304;11297:12;11258:53;11343:9;11330:23;11320:33;;11400:2;11389:9;11385:18;11372:32;11362:42;;11454:2;11443:9;11439:18;11426:32;11467:31;11492:5;11467:31;:::i;12193:488::-;12302:6;12310;12318;12371:2;12359:9;12350:7;12346:23;12342:32;12339:52;;;12387:1;12384;12377:12;12339:52;12423:9;12410:23;12400:33;;12483:2;12472:9;12468:18;12455:32;12496:31;12521:5;12496:31;:::i;12686:531::-;12788:6;12796;12804;12812;12820;12828;12881:3;12869:9;12860:7;12856:23;12852:33;12849:53;;;12898:1;12895;12888:12;12849:53;12934:9;12921:23;12911:33;;12963:38;12997:2;12986:9;12982:18;12963:38;:::i;:::-;12953:48;;13048:2;13037:9;13033:18;13020:32;13010:42;;13071:36;13103:2;13092:9;13088:18;13071:36;:::i;:::-;13061:46;;13154:3;13143:9;13139:19;13126:33;13116:43;;13206:3;13195:9;13191:19;13178:33;13168:43;;12686:531;;;;;;;;:::o;13222:450::-;13296:6;13304;13312;13365:2;13353:9;13344:7;13340:23;13336:32;13333:52;;;13381:1;13378;13371:12;13333:52;13417:9;13404:23;13394:33;;13477:2;13466:9;13462:18;13449:32;13490:31;13515:5;13490:31;:::i;:::-;13540:5;-1:-1:-1;13597:2:8;13582:18;;13569:32;13610:30;13569:32;13610:30;:::i;13926:577::-;14029:6;14037;14045;14098:2;14086:9;14077:7;14073:23;14069:32;14066:52;;;14114:1;14111;14104:12;14066:52;14154:9;14141:23;-1:-1:-1;;;;;14179:6:8;14176:30;14173:50;;;14219:1;14216;14209:12;14173:50;14258:70;14320:7;14311:6;14300:9;14296:22;14258:70;:::i;:::-;14347:8;;-1:-1:-1;14232:96:8;-1:-1:-1;;14432:2:8;14417:18;;14404:32;14445:28;14404:32;14445:28;:::i;14508:129::-;-1:-1:-1;;;;;14586:5:8;14582:30;14575:5;14572:41;14562:69;;14627:1;14624;14617:12;14642:1345;14780:6;14788;14796;14804;14812;14820;14828;14836;14844;14852;14860:7;14869;14923:3;14911:9;14902:7;14898:23;14894:33;14891:53;;;14940:1;14937;14930:12;14891:53;14976:9;14963:23;14953:33;;15036:2;15025:9;15021:18;15008:32;15049:28;15071:5;15049:28;:::i;:::-;15096:5;-1:-1:-1;15153:2:8;15138:18;;15125:32;15166;15125;15166;:::i;:::-;15217:7;-1:-1:-1;15276:2:8;15261:18;;15248:32;15289:30;15248:32;15289:30;:::i;:::-;15338:7;-1:-1:-1;15397:3:8;15382:19;;15369:33;15411:32;15369:33;15411:32;:::i;:::-;15462:7;-1:-1:-1;15521:3:8;15506:19;;15493:33;15535:30;15493:33;15535:30;:::i;:::-;15584:7;-1:-1:-1;15638:3:8;15623:19;;15610:33;;-1:-1:-1;15695:3:8;15680:19;;15667:33;15709:30;15667:33;15709:30;:::i;:::-;15758:7;-1:-1:-1;15812:3:8;15797:19;;15784:33;;-1:-1:-1;15836:36:8;15867:3;15852:19;;15836:36;:::i;:::-;15826:46;;15920:3;15909:9;15905:19;15892:33;15881:44;;15945:36;15976:3;15965:9;15961:19;15945:36;:::i;:::-;15934:47;;14642:1345;;;;;;;;;;;;;;:::o;15992:531::-;16078:6;16086;16094;16102;16155:3;16143:9;16134:7;16130:23;16126:33;16123:53;;;16172:1;16169;16162:12;16123:53;16208:9;16195:23;16185:33;;16237:38;16271:2;16260:9;16256:18;16237:38;:::i;:::-;16227:48;;16325:2;16314:9;16310:18;16297:32;16338:31;16363:5;16338:31;:::i;:::-;16388:5;-1:-1:-1;16445:2:8;16430:18;;16417:32;16458:33;16417:32;16458:33;:::i;16528:127::-;16589:10;16584:3;16580:20;16577:1;16570:31;16620:4;16617:1;16610:15;16644:4;16641:1;16634:15;16660:168;16700:7;16766:1;16762;16758:6;16754:14;16751:1;16748:21;16743:1;16736:9;16729:17;16725:45;16722:71;;;16773:18;;:::i;:::-;-1:-1:-1;16813:9:8;;16660:168::o;16833:217::-;16873:1;16899;16889:132;;16943:10;16938:3;16934:20;16931:1;16924:31;16978:4;16975:1;16968:15;17006:4;17003:1;16996:15;16889:132;-1:-1:-1;17035:9:8;;16833:217::o;17055:398::-;17094:4;17139:1;17135:2;17124:17;17176:1;17172:2;17161:17;17206:1;17201:3;17197:11;17290:3;-1:-1:-1;;;;;17249:39:8;17245:49;17240:3;17236:59;17231:2;17224:10;17220:76;17217:102;;;17299:18;;:::i;:::-;17388:3;-1:-1:-1;;;;;17348:44:8;17343:3;17339:54;17335:2;17331:63;17328:89;;;17397:18;;:::i;:::-;-1:-1:-1;17434:13:8;;;17055:398;-1:-1:-1;;;17055:398:8:o;17458:246::-;17498:4;-1:-1:-1;;;;;17611:10:8;;;;17581;;17633:12;;;17630:38;;;17648:18;;:::i;:::-;17685:13;;17458:246;-1:-1:-1;;;17458:246:8:o;17709:127::-;17770:10;17765:3;17761:20;17758:1;17751:31;17801:4;17798:1;17791:15;17825:4;17822:1;17815:15;18682:500;-1:-1:-1;;;;;18871:6:8;18867:47;18856:9;18849:66;18951:2;18946;18935:9;18931:18;18924:30;18990:6;18985:2;18974:9;18970:18;18963:34;19047:6;19039;19034:2;19023:9;19019:18;19006:48;19103:1;19074:22;;;19098:2;19070:31;;;19063:42;;;;19166:2;19145:15;;;-1:-1:-1;;19141:29:8;19126:45;19122:54;;18682:500;-1:-1:-1;;18682:500:8:o;19532:253::-;19572:3;-1:-1:-1;;;;;19661:2:8;19658:1;19654:10;19691:2;19688:1;19684:10;19722:3;19718:2;19714:12;19709:3;19706:21;19703:47;;;19730:18;;:::i;:::-;19766:13;;19532:253;-1:-1:-1;;;;19532:253:8:o;19790:396::-;19829:3;19873:1;19869:2;19858:17;19910:1;19906:2;19895:17;19940:1;19935:3;19931:11;20019:3;-1:-1:-1;;;;;19979:44:8;19974:3;19970:54;19965:2;19958:10;19954:71;19951:97;;;20028:18;;:::i;:::-;20122:3;-1:-1:-1;;;;;20081:39:8;20077:49;20072:3;20068:59;20064:2;20060:68;20057:94;;;20131:18;;:::i;:::-;-1:-1:-1;20167:13:8;;19790:396;-1:-1:-1;;;19790:396:8:o;21444:184::-;21514:6;21567:2;21555:9;21546:7;21542:23;21538:32;21535:52;;;21583:1;21580;21573:12;21535:52;-1:-1:-1;21606:16:8;;21444:184;-1:-1:-1;21444:184:8:o;21633:229::-;21672:4;-1:-1:-1;;;;;21769:10:8;;;;21739;;21791:12;;;21788:38;;;21806:18;;:::i;21867:125::-;21907:4;21935:1;21932;21929:8;21926:34;;;21940:18;;:::i;:::-;-1:-1:-1;21977:9:8;;21867:125::o;21997:128::-;22037:3;22068:1;22064:6;22061:1;22058:13;22055:39;;;22074:18;;:::i;:::-;-1:-1:-1;22110:9:8;;21997:128::o;22477:135::-;22516:3;-1:-1:-1;;22537:17:8;;22534:43;;;22557:18;;:::i;:::-;-1:-1:-1;22604:1:8;22593:13;;22477:135::o;22617:521::-;22694:4;22700:6;22760:11;22747:25;22854:2;22850:7;22839:8;22823:14;22819:29;22815:43;22795:18;22791:68;22781:96;;22873:1;22870;22863:12;22781:96;22900:33;;22952:20;;;-1:-1:-1;;;;;;22984:30:8;;22981:50;;;23027:1;23024;23017:12;22981:50;23060:4;23048:17;;-1:-1:-1;23091:14:8;23087:27;;;23077:38;;23074:58;;;23128:1;23125;23118:12;23143:271;23326:6;23318;23313:3;23300:33;23282:3;23352:16;;23377:13;;;23352:16;23143:271;-1:-1:-1;23143:271:8:o;23419:258::-;23491:1;23501:113;23515:6;23512:1;23509:13;23501:113;;;23591:11;;;23585:18;23572:11;;;23565:39;23537:2;23530:10;23501:113;;;23632:6;23629:1;23626:13;23623:48;;;-1:-1:-1;;23667:1:8;23649:16;;23642:27;23419:258::o;23682:383::-;23831:2;23820:9;23813:21;23794:4;23863:6;23857:13;23906:6;23901:2;23890:9;23886:18;23879:34;23922:66;23981:6;23976:2;23965:9;23961:18;23956:2;23948:6;23944:15;23922:66;:::i;:::-;24049:2;24028:15;-1:-1:-1;;24024:29:8;24009:45;;;;24056:2;24005:54;;23682:383;-1:-1:-1;;23682:383:8:o;24431:707::-;24596:5;24583:19;24577:4;24570:33;24640:1;24634:4;24630:12;24690:2;24683:5;24679:14;24666:28;24703:32;24727:7;24703:32;:::i;:::-;-1:-1:-1;;;;;24758:7:8;24754:32;24744:42;;24811:10;24805:17;24887:2;-1:-1:-1;;;;;24861:23:8;24857:2;24853:32;24850:40;24838:10;24831:60;24939:2;24932:5;24928:14;24915:28;24952:32;24976:7;24952:32;:::i;:::-;25095:34;25085:7;25081:2;25077:16;25073:57;25068:2;-1:-1:-1;;;;;25026:39:8;25022:2;25018:48;25015:56;25012:119;25000:10;24993:139;;;;;24431:707;;:::o;26184:245::-;26251:6;26304:2;26292:9;26283:7;26279:23;26275:32;26272:52;;;26320:1;26317;26310:12;26272:52;26352:9;26346:16;26371:28;26393:5;26371:28;:::i;27053:314::-;27092:4;27121:9;;;27146:10;;-1:-1:-1;;;27165:19:8;;27158:27;;27142:44;27139:70;;;27189:18;;:::i;:::-;27308:1;27240:66;27236:74;27233:1;27229:82;27225:2;27221:91;27218:117;;;27315:18;;:::i;:::-;-1:-1:-1;;27352:9:8;;27053:314::o;28127:274::-;28256:3;28294:6;28288:13;28310:53;28356:6;28351:3;28344:4;28336:6;28332:17;28310:53;:::i;:::-;28379:16;;;;;28127:274;-1:-1:-1;;28127:274:8:o;29527:127::-;29588:10;29583:3;29579:20;29576:1;29569:31;29619:4;29616:1;29609:15;29643:4;29640:1;29633:15;29659:884;29739:6;29792:2;29780:9;29771:7;29767:23;29763:32;29760:52;;;29808:1;29805;29798:12;29760:52;29841:9;29835:16;-1:-1:-1;;;;;29911:2:8;29903:6;29900:14;29897:34;;;29927:1;29924;29917:12;29897:34;29965:6;29954:9;29950:22;29940:32;;30010:7;30003:4;29999:2;29995:13;29991:27;29981:55;;30032:1;30029;30022:12;29981:55;30061:2;30055:9;30083:2;30079;30076:10;30073:36;;;30089:18;;:::i;:::-;30164:2;30158:9;30132:2;30218:13;;-1:-1:-1;;30214:22:8;;;30238:2;30210:31;30206:40;30194:53;;;30262:18;;;30282:22;;;30259:46;30256:72;;;30308:18;;:::i;:::-;30348:10;30344:2;30337:22;30383:2;30375:6;30368:18;30423:7;30418:2;30413;30409;30405:11;30401:20;30398:33;30395:53;;;30444:1;30441;30434:12;30395:53;30457:55;30509:2;30504;30496:6;30492:15;30487:2;30483;30479:11;30457:55;:::i

Swarm Source

ipfs://a03de4131a6d30808db82b276914915e0cdfdf70921726ce59ac5ee449423c13

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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