ETH Price: $3,419.46 (+1.12%)
Gas: 4 Gwei

Contract

0x60510CAf94f3001651E3E83f5e0EBDD303758aAE
 

Overview

ETH Balance

78.111431238355956837 ETH

Eth Value

$267,099.29 (@ $3,419.46/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Claim Reward Of202061802024-06-30 18:05:471 hr ago1719770747IN
0x60510CAf...303758aAE
0 ETH0.000339743.35620071
Claim Reward Of202061782024-06-30 18:05:231 hr ago1719770723IN
0x60510CAf...303758aAE
0 ETH0.000390393.30045663
Claim Reward Of202061682024-06-30 18:03:231 hr ago1719770603IN
0x60510CAf...303758aAE
0 ETH0.000392113.31500892
Claim Reward Of202061662024-06-30 18:02:591 hr ago1719770579IN
0x60510CAf...303758aAE
0 ETH0.000383513.24227533
Claim Reward Of202061552024-06-30 18:00:471 hr ago1719770447IN
0x60510CAf...303758aAE
0 ETH0.000368863.11844065
Claim Reward Of202061392024-06-30 17:57:231 hr ago1719770243IN
0x60510CAf...303758aAE
0 ETH0.000298112.52028988
Claim Reward Of202061352024-06-30 17:56:351 hr ago1719770195IN
0x60510CAf...303758aAE
0 ETH0.000297572.51573501
Claim Reward Of201944192024-06-29 2:40:1140 hrs ago1719628811IN
0x60510CAf...303758aAE
0 ETH0.000230721.95053781
Claim Reward Of201906212024-06-28 13:55:472 days ago1719582947IN
0x60510CAf...303758aAE
0 ETH0.000776686.56613478
Claim Reward Of201824432024-06-27 10:31:233 days ago1719484283IN
0x60510CAf...303758aAE
0 ETH0.000488194.12721569
Claim Reward Of201790822024-06-26 23:16:233 days ago1719443783IN
0x60510CAf...303758aAE
0 ETH0.000443753.75157092
Claim Reward Of201755182024-06-26 11:18:594 days ago1719400739IN
0x60510CAf...303758aAE
0 ETH0.000265952.24841197
Claim Reward Of201751672024-06-26 10:08:354 days ago1719396515IN
0x60510CAf...303758aAE
0 ETH0.000426193.60309924
Claim Reward Of201751212024-06-26 9:59:234 days ago1719395963IN
0x60510CAf...303758aAE
0 ETH0.000302422.55671415
Redeem Vesting R...201686192024-06-25 12:12:595 days ago1719317579IN
0x60510CAf...303758aAE
0 ETH0.00091095.77826523
Claim Reward Of201675162024-06-25 8:31:115 days ago1719304271IN
0x60510CAf...303758aAE
0 ETH0.000703115.94415731
Claim Reward Of201643202024-06-24 21:47:235 days ago1719265643IN
0x60510CAf...303758aAE
0 ETH0.000872787.37931254
Claim Reward Of201630332024-06-24 17:27:596 days ago1719250079IN
0x60510CAf...303758aAE
0 ETH0.0012492510.56128184
Redeem Vesting R...201623862024-06-24 15:18:116 days ago1719242291IN
0x60510CAf...303758aAE
0 ETH0.001476649.36692914
Claim Reward Of201526522024-06-23 6:36:237 days ago1719124583IN
0x60510CAf...303758aAE
0 ETH0.000274752.32280759
Claim Reward Of201449342024-06-22 4:42:478 days ago1719031367IN
0x60510CAf...303758aAE
0 ETH0.000245022.07143095
Claim Reward Of201441492024-06-22 2:04:358 days ago1719021875IN
0x60510CAf...303758aAE
0 ETH0.000297792.51754827
Claim Reward Of201438532024-06-22 1:04:598 days ago1719018299IN
0x60510CAf...303758aAE
0 ETH0.000395092.75402229
Claim Reward Of201388812024-06-21 8:24:359 days ago1718958275IN
0x60510CAf...303758aAE
0 ETH0.000715576.04953998
Claim Reward Of201388732024-06-21 8:22:599 days ago1718958179IN
0x60510CAf...303758aAE
0 ETH0.000771256.52021443
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
202061802024-06-30 18:05:471 hr ago1719770747
0x60510CAf...303758aAE
0.00024634 ETH
202061782024-06-30 18:05:231 hr ago1719770723
0x60510CAf...303758aAE
0.06799822 ETH
202061782024-06-30 18:05:231 hr ago1719770723
0x60510CAf...303758aAE
0.0012317 ETH
202061682024-06-30 18:03:231 hr ago1719770603
0x60510CAf...303758aAE
0.1222768 ETH
202061682024-06-30 18:03:231 hr ago1719770603
0x60510CAf...303758aAE
0.00024634 ETH
202061662024-06-30 18:02:591 hr ago1719770579
0x60510CAf...303758aAE
0.02904661 ETH
202061662024-06-30 18:02:591 hr ago1719770579
0x60510CAf...303758aAE
0.00135487 ETH
202061552024-06-30 18:00:471 hr ago1719770447
0x60510CAf...303758aAE
0.06797531 ETH
202061552024-06-30 18:00:471 hr ago1719770447
0x60510CAf...303758aAE
0.00209389 ETH
202061392024-06-30 17:57:231 hr ago1719770243
0x60510CAf...303758aAE
0.13592232 ETH
202061392024-06-30 17:57:231 hr ago1719770243
0x60510CAf...303758aAE
0.00049268 ETH
202061352024-06-30 17:56:351 hr ago1719770195
0x60510CAf...303758aAE
0.02378403 ETH
202061352024-06-30 17:56:351 hr ago1719770195
0x60510CAf...303758aAE
1.45118897 ETH
201944192024-06-29 2:40:1140 hrs ago1719628811
0x60510CAf...303758aAE
0.25457538 ETH
201944192024-06-29 2:40:1140 hrs ago1719628811
0x60510CAf...303758aAE
0.47075575 ETH
201906212024-06-28 13:55:472 days ago1719582947
0x60510CAf...303758aAE
0.01179436 ETH
201906212024-06-28 13:55:472 days ago1719582947
0x60510CAf...303758aAE
1.01270376 ETH
201824432024-06-27 10:31:233 days ago1719484283
0x60510CAf...303758aAE
0.1822985 ETH
201824432024-06-27 10:31:233 days ago1719484283
0x60510CAf...303758aAE
0.41569875 ETH
201790822024-06-26 23:16:233 days ago1719443783
0x60510CAf...303758aAE
0.03364383 ETH
201790822024-06-26 23:16:233 days ago1719443783
0x60510CAf...303758aAE
0.4418108 ETH
201755182024-06-26 11:18:594 days ago1719400739
0x60510CAf...303758aAE
0.00168481 ETH
201755182024-06-26 11:18:594 days ago1719400739
0x60510CAf...303758aAE
0.04335584 ETH
201751672024-06-26 10:08:354 days ago1719396515
0x60510CAf...303758aAE
0.12025806 ETH
201751672024-06-26 10:08:354 days ago1719396515
0x60510CAf...303758aAE
0.00566582 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TreasuryBootstrapRevenueShare

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-22
*/

//SPDX-License-Identifier: MIT
// File: contracts/impl/OwnableView.sol


pragma solidity ^0.8.0;

abstract contract OwnableView {

    bytes32 internal constant OWNER_KEY = 0xdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe;

    modifier onlyOwner() {
        require(msg.sender == _owner(), "Unauthorized");
        _;
    }

    function _owner() internal view returns (address value) {
        assembly {
            value := sload(OWNER_KEY)
        }
    }
}
// File: contracts/model/IOwnable.sol


pragma solidity ^0.8.0;

interface IOwnable {

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

    function owner() external view returns (address);

    function renounceOwnership() external;

    function transferOwnership(address newOwner) external;
}
// File: contracts/impl/Ownable.sol


pragma solidity ^0.8.0;



abstract contract Ownable is IOwnable, OwnableView {

    constructor(address initialOwner) {
        _transferOwnership(initialOwner);
    }

    function owner() override external view returns (address) {
        return _owner();
    }

    function renounceOwnership() override external onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) override external onlyOwner {
        require(newOwner != address(0), "Invalid");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) private {
        address oldOwner = _owner();
        assembly {
            sstore(OWNER_KEY, newOwner)
        }
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: contracts/model/IERC20Approve.sol


pragma solidity ^0.8.0;

interface IERC20Approve {

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);
}
// File: contracts/vert/uniswapV3/IPoolInitializer.sol

pragma solidity ^0.8.0;

interface IPoolInitializer {
    function createAndInitializePoolIfNecessary(
        address token0,
        address token1,
        uint24 fee,
        uint160 sqrtPriceX96
    ) external payable returns (address pool);
}
// File: contracts/vert/uniswapV3/IUniswapV3Factory.sol

pragma solidity ^0.8.0;

interface IUniswapV3Factory {
    event OwnerChanged(address indexed oldOwner, address indexed newOwner);

    event PoolCreated(
        address indexed token0,
        address indexed token1,
        uint24 indexed fee,
        int24 tickSpacing,
        address pool
    );

    event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing);

    function owner() external view returns (address);

    function feeAmountTickSpacing(uint24 fee) external view returns (int24);

    function getPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external view returns (address pool);

    function createPool(
        address tokenA,
        address tokenB,
        uint24 fee
    ) external returns (address pool);

    function setOwner(address _owner) external;

    function enableFeeAmount(uint24 fee, int24 tickSpacing) external;
}
// File: contracts/vert/uniswapV3/IPeripheryPayments.sol

//License-Identifier: MIT
pragma solidity ^0.8.0;

interface IPeripheryPayments {

    function unwrapWETH9(uint256 amountMinimum, address recipient) external payable;

    function refundETH() external payable;

    function sweepToken(
        address token,
        uint256 amountMinimum,
        address recipient
    ) external payable;
}

// File: contracts/vert/uniswapV3/IMulticall.sol

//License-Identifier: MIT
pragma solidity ^0.8.0;

interface IMulticall {
    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
}

// File: contracts/vert/uniswapV3/IPeripheryImmutableState.sol

//License-Identifier: MIT
pragma solidity ^0.8.0;

interface IPeripheryImmutableState {
    function factory() external view returns (address);

    function WETH9() external view returns (address);
}

// File: contracts/vert/uniswapV3/ISwapRouter.sol

//License-Identifier: MIT
pragma solidity ^0.8.0;




interface ISwapRouter is IMulticall, IPeripheryImmutableState, IPeripheryPayments {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}
// File: contracts/vert/uniswapV3/INonfungiblePositionManager.sol


pragma solidity ^0.8.0;




interface INonfungiblePositionManager is IMulticall, IPeripheryImmutableState, IPeripheryPayments {
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function transferFrom(address from, address to, uint256 tokenId) external;
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    function positions(uint256 tokenId)
        external
        view
        returns (
            uint96 nonce,
            address operator,
            address token0,
            address token1,
            uint24 fee,
            int24 tickLower,
            int24 tickUpper,
            uint128 liquidity,
            uint256 feeGrowthInside0LastX128,
            uint256 feeGrowthInside1LastX128,
            uint128 tokensOwed0,
            uint128 tokensOwed1
        );

    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }

    function mint(MintParams calldata params)
        external
        payable
        returns (
            uint256 tokenId,
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    struct IncreaseLiquidityParams {
        uint256 tokenId;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function increaseLiquidity(IncreaseLiquidityParams calldata params)
        external
        payable
        returns (
            uint128 liquidity,
            uint256 amount0,
            uint256 amount1
        );

    struct DecreaseLiquidityParams {
        uint256 tokenId;
        uint128 liquidity;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    function decreaseLiquidity(DecreaseLiquidityParams calldata params)
        external
        payable
        returns (uint256 amount0, uint256 amount1);

    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1);

    function burn(uint256 tokenId) external payable;
}
// File: contracts/vert/UtilitiesLib.sol


pragma solidity ^0.8.0;

library UtilitiesLib {
    uint256 internal constant AMOUNT_PERCENTAGE = 2e17;
    uint256 internal constant TREASURY_PERCENTAGE = 5e16;
    uint256 internal constant MARKETING_PERCENTAGE = 12e16;
    uint256 internal constant BOOTSTRAP_PERCENTAGE = 13e16;
    uint256 internal constant REVENUE_SHARE_PERCENTAGE = 1e17;
    uint256 internal constant ANTI_WHALE_MAX_BALANCE = 1500000e18;
    uint256 internal constant ANTI_WHALE_MAX_TRANSFER = 750000e18;
}
// File: @ethereansos/farming-base/contracts/BaseFarming.sol

///License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20Token {
    function balanceOf(address owner) external view returns (uint);
    function transfer(address to, uint value) external returns (bool);
}

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

interface IFarmingLiquidityProvider {
    function totalFarmingLiquidity() external view returns(uint256);
    function setNextRebalanceEvent(uint256 nextRebalanceEvent) external;
}

contract BaseFarming {
    using SafeMath for uint256;

    struct FarmingPosition {
        uint256 rewardTokenToRedeem;
        uint256 rewardPerTokenPaid;
        uint256 lastLiquidityBalance;
    }

    uint256 public constant FULL_PRECISION = 1e18;
    uint256 public constant TIME_SLOT_IN_SECONDS = 15;

    address public farmingLiquidityProvider;
    address public rewardToken;
    uint256 public rebalanceIntervalInEventSlots;
    uint256 public startEvent;
    uint256 public lastUpdateEvent;
    uint256 public nextRebalanceEvent;

    uint256 private _rewardPerEvent;
    uint256 private _rewardPerTokenStored;
    uint256 private _reservedBalance;
    uint256 private _previousLiquidityPoolTotalSupply;

    bool internal _resetOnly;
    bool internal _inhibitCallback;

    uint256 public totalFarmingLiquidity;

    mapping(address => FarmingPosition) private _positions;

    /// @notice Get the reward per event for the current season
    /// divided by the farming additional precision
    function rewardPerEvent() public view returns(uint256) {
        return _rewardPerEvent / FULL_PRECISION;
    }

    /// @notice Get the reserved balance for the current season
    /// divided by the farming additional precision
    function reservedBalance() public view returns(uint256) {
        return _reservedBalance / FULL_PRECISION;
    }

    function _increaseReservedBalance(uint256 amount) internal {
        _reservedBalance = _reservedBalance.add(amount * FULL_PRECISION);
    }

    function _decreaseReservedBalance(uint256 amount) internal {
        _reservedBalance = _reservedBalance.sub(amount * FULL_PRECISION);
    }

    function calculateIfThereIsMoreReward() external view returns(uint256 seasonReward) {
        return _calculateIfThereIsMoreReward(_resetOnly);
    }

    function _claimReward(address account, address[] memory rewardReceivers, uint256[] memory rewardReceiversPercentage) internal returns(uint256 claimedReward, uint256 _nextRebalanceEvent, uint256 rewardPerEvent_) {
        uint lastLiquidityBalance = _positions[account].lastLiquidityBalance;
        (_nextRebalanceEvent, rewardPerEvent_) = _tryRebalance(_totalSupply(), lastLiquidityBalance == 0, false);
        claimedReward = _syncPosition(
            account,
            lastLiquidityBalance,
            rewardReceivers,
            rewardReceiversPercentage
        );
    }

    /// @notice Sync positions and try to rebalance and start farming seasons
    function _sync(
        address from,
        address to,
        uint256 fromLiquidityPoolTokenBalance,
        uint256 toLiquidityPoolTokenBalance,
        uint256 liquidityPoolTotalSupply
    ) internal returns(uint256 _nextRebalanceEvent) {

        (_nextRebalanceEvent,) = _tryRebalance(liquidityPoolTotalSupply, false, false);

        address[] memory voidRewardReceivers = new address[](0);
        uint256[] memory voidRewardReceiversPercentage = new uint256[](0);

        if (from != address(0)) _syncPosition(from, fromLiquidityPoolTokenBalance, voidRewardReceivers, voidRewardReceiversPercentage);
        if (to != address(0)) _syncPosition(to, toLiquidityPoolTokenBalance, voidRewardReceivers, voidRewardReceiversPercentage);
    }

    /// @notice Start and stop the farming perpetual seasons. If the season is started compute the _rewardPerTokenStored
    /// @param _nextRebalanceEvent is updated after season is started (or stopped)
    /// @param rewardPerEvent_ is returned in his correct precision, so is divided by PRECISION
    function _tryRebalance(uint256 liquidityPoolTotalSupply, bool inhibit, bool reset) internal returns(uint256 _nextRebalanceEvent, uint256 rewardPerEvent_) {
        /// @dev Gas savings for Optimism L1 blocks static call
        /// and variables that are loaded from storage
        uint256 blockEventstamp = block.timestamp;
        uint256 previousLiquidityPoolTotalSupply = _previousLiquidityPoolTotalSupply;
        uint256 _startEvent = startEvent;
        uint256 _lastUpdateEvent = lastUpdateEvent;

        /// @dev Gas savings reusing output variables
        _nextRebalanceEvent = nextRebalanceEvent;
        rewardPerEvent_ = _rewardPerEvent;

        /// @notice Compute the rewards for the time interval (if the season is started)
        if(_nextRebalanceEvent != 0) {
            uint256 currentEvent = blockEventstamp < _nextRebalanceEvent ? blockEventstamp : _nextRebalanceEvent;

            /// @dev Inhibit the _rewardPerTokenStored update when inhibit variable is true.
            /// This is used for bypass incorrect _rewardPerTokenStored updates in the _tryRebalance function.
            if(!inhibit && previousLiquidityPoolTotalSupply != 0) {
                uint256 computedLastUpdateEvent = _lastUpdateEvent < _startEvent ? _startEvent : _lastUpdateEvent;
                _rewardPerTokenStored = _rewardPerTokenStored.add(((((currentEvent.sub(computedLastUpdateEvent)))).mul(rewardPerEvent_)) / previousLiquidityPoolTotalSupply);
                lastUpdateEvent = currentEvent;
            }
        }

        _previousLiquidityPoolTotalSupply = liquidityPoolTotalSupply;

        /// @notice Start (or stop) the new season
        if(reset || blockEventstamp >= _nextRebalanceEvent || liquidityPoolTotalSupply == 0) {
            uint256 reservedBalance_ = _reservedBalance;

            if (_nextRebalanceEvent > blockEventstamp) {
                reservedBalance_ = reservedBalance_.sub((((_nextRebalanceEvent.sub(blockEventstamp))).mul(rewardPerEvent_)));
            }

            /// @dev Using lastUpdateEvent storage variable to store the value
            lastUpdateEvent = 0;

            /// @dev Gas savings using memory variables
            _startEvent = 0;
            _nextRebalanceEvent = 0;
            rewardPerEvent_ = 0;

            uint256 seasonReward = _calculateIfThereIsMoreReward(reset);

            /// @notice Update the _nextRebalanceEvent, _rewardPerEvent, _reservedBalance
            /// for the new starting season
            if(seasonReward > 0 && liquidityPoolTotalSupply != 0) {
                uint256 _rebalanceIntervalInEvents = rebalanceIntervalInEventSlots.mul(TIME_SLOT_IN_SECONDS);

                _startEvent = blockEventstamp;
                reservedBalance_ = reservedBalance_.add(seasonReward);
                _nextRebalanceEvent = blockEventstamp.add(_rebalanceIntervalInEvents);
                rewardPerEvent_ = seasonReward / _rebalanceIntervalInEvents;
            }

            /// @dev Update storage output variables after changing values
            startEvent = _startEvent;
            _reservedBalance = reservedBalance_;
            nextRebalanceEvent = _nextRebalanceEvent;
            _rewardPerEvent = rewardPerEvent_;

            _tryNotifyNewRebalanceEvent(_nextRebalanceEvent);

        }

        /// @notice Output variables
        /// _rewardPerEvent is returned in his correct precision, so is divided by PRECISION
        /// nextRebalanceEvent is updated after season is started (or stopped)
        rewardPerEvent_ = rewardPerEvent_ / FULL_PRECISION;

    }

    /// @notice Calculate the reward for the `account` position
    function _calculateRewardUntilNow(address account) private view returns(uint256 reward) {
        reward = (_rewardPerTokenStored.sub(_positions[account].rewardPerTokenPaid)).mul(_positions[account].lastLiquidityBalance);
    }

    /// @notice Sync `account` position and eventually claim the accrued reward
    function _syncPosition(address account, uint256 liquidityPoolTokenBalance, address[] memory rewardReceivers, uint256[] memory rewardReceiversPercentage) private returns (uint256 claimedReward) {
        FarmingPosition memory position = _positions[account];

        /// @dev Inline definitions for gas savings
        position.rewardTokenToRedeem = position.rewardTokenToRedeem.add(_calculateRewardUntilNow(account));
        position.lastLiquidityBalance = liquidityPoolTokenBalance;
        position.rewardPerTokenPaid = _rewardPerTokenStored;

        /// @dev Claim the accrued reward
        if (_checkRewardParameters(rewardReceivers, rewardReceiversPercentage)) {
            /// @dev claimedReward is divided by PRECISION to transfer the correct amount
            claimedReward = position.rewardTokenToRedeem / FULL_PRECISION;

            if (claimedReward > 0) {
                uint256 rebuiltReward;
                /// @dev Decrement accrued reward (rebuiltReward) from _reservedBalance and position.rewardTokenToRedeem in 10**18 precision
                _reservedBalance = _reservedBalance.sub(rebuiltReward = claimedReward.mul(FULL_PRECISION));
                position.rewardTokenToRedeem = position.rewardTokenToRedeem.sub(rebuiltReward);

                /// @dev Send reward tokens to the reward receivers
                _transferReward(claimedReward, rewardReceivers, rewardReceiversPercentage);
            }
        }

        /// @dev Reassign memory position to storage _positions
        _positions[account] = position;
    }

    function _transferReward(uint256 claimedReward, address[] memory rewardReceivers, uint256[] memory rewardReceiversPercentage) private {
        address _rewardToken = rewardToken;
        uint256 remainingAmount = claimedReward;
        for(uint256 i = 0; i < rewardReceiversPercentage.length; i++) {
            uint256 value = _calculatePercentage(claimedReward, rewardReceiversPercentage[i]);
            _safeTransfer(_rewardToken, rewardReceivers[i], value);
            remainingAmount -= value;
        }
        _safeTransfer(_rewardToken, rewardReceivers[rewardReceivers.length - 1], remainingAmount);
    }

    function _checkRewardParameters(address[] memory rewardReceivers, uint256[] memory rewardReceiversPercentage) private pure returns(bool) {
        if(rewardReceivers.length == 0) {
            return false;
        }
        require(rewardReceiversPercentage.length == (rewardReceivers.length - 1), "percentage");
        uint256 availableAmount = FULL_PRECISION;
        for(uint256 i = 0; i < rewardReceiversPercentage.length; i++) {
            uint256 percentage = rewardReceiversPercentage[i];
            require(percentage != 0 && percentage < availableAmount, "percentage");
            availableAmount -= percentage;
        }
        require(availableAmount != 0, "percentage");
        return true;
    }

    function _calculatePercentage(uint256 total, uint256 percentage) internal pure returns (uint256) {
        return (total * ((percentage * 1e18) / FULL_PRECISION)) / 1e18;
    }

    function _safeTransfer(address tokenAddress, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(to == address(this)) {
            return;
        }
        if(tokenAddress == address(0)) {
            require(_sendETH(to, value), 'FARMING: TRANSFER_FAILED');
            return;
        }
        if(to == address(0)) {
            return _safeBurn(tokenAddress, value);
        }
        (bool success, bytes memory data) = tokenAddress.call(abi.encodeWithSelector(IERC20Token(address(0)).transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'FARMING: TRANSFER_FAILED');
    }

    function _safeBurn(address erc20TokenAddress, uint256 value) internal {
        (bool result, bytes memory returnData) = erc20TokenAddress.call(abi.encodeWithSelector(0x42966c68, value));//burn(uint256)
        result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, address(0), value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, 0x000000000000000000000000000000000000dEaD, value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, 0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD, value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
    }

    function _sendETH(address to, uint256 value) private returns(bool) {
        assembly {
            let res := call(gas(), to, value, 0, 0, 0, 0)
        }
        return true;
    }

    function _balanceOf(address tokenAddress) private view returns(uint256) {
        return tokenAddress == address(0) ? address(this).balance : IERC20Token(tokenAddress).balanceOf(address(this));
    }

    function _tryNotifyNewRebalanceEvent(uint256 _nextRebalanceEvent) private {
        if(_inhibitCallback) {
            return;
        }
        /// @dev Gas savings to avoid multiple storage loads
        address _farmingLiquidityProvider = farmingLiquidityProvider;

        /// @notice Set the new _nextRebalanceEvent to the farmingliquidityprovider if the caller is not the farmingliquidityprovider
        if(msg.sender != _farmingLiquidityProvider) {
            IFarmingLiquidityProvider(_farmingLiquidityProvider).setNextRebalanceEvent(_nextRebalanceEvent);
        }
    }

    function _totalSupply() internal view returns(uint256) {
        address _farmingLiquidityProvider = farmingLiquidityProvider;
        return _farmingLiquidityProvider == address(this) ? totalFarmingLiquidity : IFarmingLiquidityProvider(_farmingLiquidityProvider).totalFarmingLiquidity();
    }

    function _calculateIfThereIsMoreReward(bool reset) private view returns(uint256 seasonReward) {
        seasonReward = _resetOnly && !reset ? 0 : (_balanceOf(rewardToken).mul(FULL_PRECISION)).sub(_reservedBalance);
    }

    function _initialize(address _farmingLiquidityProvider, uint256 _rebalanceIntervalInEvents) internal {
        require(farmingLiquidityProvider == address(0), 'Farming: ALREADY_INITIALIZED');
        require((farmingLiquidityProvider =_farmingLiquidityProvider) != address(0), 'Farming: LIQUIDITY_PROVIDER');
        rebalanceIntervalInEventSlots = _rebalanceIntervalInEvents / TIME_SLOT_IN_SECONDS;
    }

    function _receive() internal view {
        require(rewardToken == address(0));
        require(msg.sig == bytes4(0));
        require(keccak256(msg.data) == keccak256(""));
    }
}
// File: contracts/vert/IVestingContract.sol


pragma solidity ^0.8.0;

interface IVestingContract {
    function completeInitialization() external;
}
// File: contracts/vert/ITreasuryBootstrapRevenueShare.sol


pragma solidity ^0.8.0;


interface ITreasuryBootstrapRevenueShare {
    function completeInitialization(address treasuryAddress) external returns(address operatorAddress);
    function setTreasuryAddress(address newValue) external returns(address oldValue);
    function updatePositionOf(address account, uint256 amount, uint256 vestedAmount) external payable;
    function finalizePosition(uint256 treasuryBalance, uint256 additionalLiquidity, uint256 vestingEnds) external payable;
}
// File: contracts/vert/TreasuryBootstrapRevenueShare.sol


pragma solidity ^0.8.0;











library TreasuryBootstrapRevenueShareLib {

    function collectFees(bytes memory conversionInput, address uniswapV3NonfungiblePositionsManager, address token, address WETH, uint256 tokenId, address conversionAddress, uint24 fee, address uniswapV3SwapRouter) external returns(uint256 collectedAmount0, uint256 collectedAmount1, bytes memory conversionOutput) {
        bytes[] memory data = new bytes[](3);
        INonfungiblePositionManager nonfungiblePositionManager = INonfungiblePositionManager(uniswapV3NonfungiblePositionsManager);
        data[0] = abi.encodeWithSelector(nonfungiblePositionManager.collect.selector, INonfungiblePositionManager.CollectParams({
            tokenId: tokenId,
            recipient: address(0),
            amount0Max: 0xffffffffffffffffffffffffffffffff,
            amount1Max: 0xffffffffffffffffffffffffffffffff
        }));
        data[1] = abi.encodeWithSelector(nonfungiblePositionManager.unwrapWETH9.selector, 0, address(this));
        data[2] = abi.encodeWithSelector(nonfungiblePositionManager.sweepToken.selector, token, 0, conversionAddress != address(0) ? conversionAddress : address(this));
        (collectedAmount0, collectedAmount1) = abi.decode(IMulticall(uniswapV3NonfungiblePositionsManager).multicall(data)[0], (uint256, uint256));

        uint256 amount = token < WETH ? collectedAmount0 : collectedAmount1;

        if(amount > 0) {
            conversionOutput = _convertAmountInETH(amount, conversionInput, token, WETH, conversionAddress, fee, uniswapV3SwapRouter);
        }
    }

    function _convertAmountInETH(uint256 amount, bytes memory conversionInput, address token, address WETH, address conversionAddress, uint24 fee, address uniswapV3SwapRouter) private returns(bytes memory conversionOutput) {

        if(conversionAddress != address(0)) {
            uint256 codeLength;
            assembly {
                codeLength := extcodesize(conversionAddress)
            }
            if(codeLength > 0) {
                return IConvertInETH(conversionAddress).convert(token, amount, conversionInput);
            } else {
                return "";
            }
        }

        (uint24 _fee, uint256 amountOutMinimum) = abi.decode(conversionInput, (uint24, uint256));

        ISwapRouter swapRouter = ISwapRouter(uniswapV3SwapRouter);

        IERC20Approve(token).approve(address(swapRouter), amount);

        bytes[] memory data = new bytes[](2);
        data[0] = abi.encodeWithSelector(swapRouter.exactInput.selector, ISwapRouter.ExactInputParams({
            path : abi.encodePacked(token, _fee == 0 ? fee : _fee, WETH),
            recipient : address(0),
            deadline : block.timestamp + 10000,
            amountIn : amount,
            amountOutMinimum : amountOutMinimum
        }));
        data[1] = abi.encodeWithSelector(swapRouter.unwrapWETH9.selector, 0, address(this));
        conversionOutput = swapRouter.multicall(data)[0];
    }

    function _safeTransfer(address tokenAddress, address to, uint256 value) internal {
        if(value == 0) {
            return;
        }
        if(to == address(this)) {
            return;
        }
        if(tokenAddress == address(0)) {
            require(_sendETH(to, value), 'FARMING: TRANSFER_FAILED');
            return;
        }
        if(to == address(0)) {
            return _safeBurn(tokenAddress, value);
        }
        (bool success, bytes memory data) = tokenAddress.call(abi.encodeWithSelector(IERC20Token(address(0)).transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'FARMING: TRANSFER_FAILED');
    }

    function _safeBurn(address erc20TokenAddress, uint256 value) internal {
        (bool result, bytes memory returnData) = erc20TokenAddress.call(abi.encodeWithSelector(0x42966c68, value));//burn(uint256)
        result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, address(0), value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, 0x000000000000000000000000000000000000dEaD, value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
        if(!result) {
            (result, returnData) = erc20TokenAddress.call(abi.encodeWithSelector(IERC20Token(erc20TokenAddress).transfer.selector, 0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD, value));
            result = result && (returnData.length == 0 || abi.decode(returnData, (bool)));
        }
    }

    function _sendETH(address to, uint256 value) private returns(bool) {
        assembly {
            let res := call(gas(), to, value, 0, 0, 0, 0)
        }
        return true;
    }
}

contract TreasuryBootstrapRevenueShare is ITreasuryBootstrapRevenueShare, Ownable, BaseFarming {

    uint256 public constant MONTH_IN_SECONDS = 2628000;

    struct AccountPosition {
        uint256 vestedAmount;
        uint256 ethAmount;
        uint128 positionLiquidity;
        uint256 farmingBalance;
    }
    uint256 public accounts;

    address public immutable destinationAddress;
    address public immutable uniswapV3NonfungiblePositionsManager;
    address public immutable uniswapV3SwapRouter;
    address public immutable WETH;

    address public pool;

    uint24 public immutable fee;
    uint160 public immutable sqrtPriceX96;
    int24 public tickLower;
    int24 public tickUpper;
    uint256 public vestingEnds;
    uint256 public priceSlippagePercentage;

    mapping(address => AccountPosition) public positionOf;

    uint256 public farmingDuration;

    address public token;

    address public treasuryAddress;

    uint256 public treasuryFarmingBalance;

    uint256 public tokenId;

    address public conversionAddress;

    uint256 public redeemableETH;

    constructor(address initialOwner, address _destinationAddress, address _conversionAddress, uint256 _farmingDuration, address _uniswapV3NonfungiblePositionsManager, address _uniswapV3SwapRouter, uint24 _fee, uint160 _sqrtPriceX96, uint256 _priceSlippagePercentage, int24 _tickLower, int24 _tickUpper) Ownable(initialOwner) {
        _inhibitCallback = true;
        _initialize(address(this), MONTH_IN_SECONDS * (farmingDuration = _farmingDuration));
        destinationAddress = _destinationAddress;
        conversionAddress = _conversionAddress;
        WETH = IPeripheryImmutableState(uniswapV3NonfungiblePositionsManager = _uniswapV3NonfungiblePositionsManager).WETH9();
        uniswapV3SwapRouter = _uniswapV3SwapRouter;
        tickLower = _tickLower;
        tickUpper = _tickUpper;
        fee = _fee;
        sqrtPriceX96 = _sqrtPriceX96;
        priceSlippagePercentage = _priceSlippagePercentage;
    }

    receive() external payable {
        _receive();
    }

    function onERC721Received(address,address,uint256,bytes calldata) external view returns (bytes4) {
        require(tokenId == 0);
        return this.onERC721Received.selector;
    }

    function setPriceSlippagePercentage(uint256 newValue) external onlyOwner {
        priceSlippagePercentage = newValue;
    }

    function setConversionAddress(address newValue) external onlyOwner returns(address oldValue) {
        oldValue = conversionAddress;
        conversionAddress = newValue;
    }

    function completeInitialization(address _treasuryAddress) override external returns(address operatorAddress) {
        require(token == address(0));
        treasuryAddress = _treasuryAddress;
        uint256 tokenPosition = (token = msg.sender) < WETH ? 0 : 1;
        return pool = IPoolInitializer(uniswapV3NonfungiblePositionsManager).createAndInitializePoolIfNecessary(
            tokenPosition == 0 ? msg.sender : WETH,
            tokenPosition == 1 ? msg.sender : WETH,
            fee,
            sqrtPriceX96
        );
    }

    function updatePositionOf(address account, uint256 amount, uint256 vestedAmount) override external payable {

        require(msg.sender == token);

        _increaseReservedBalance(msg.value);
        redeemableETH += msg.value;

        AccountPosition storage _accountPosition = positionOf[account];
        if(_accountPosition.ethAmount == 0) {
            accounts++;
        }

        _accountPosition.ethAmount += msg.value;

        (uint128 liquidity, uint256 remainingAmount) = _mintOrIncreaseLiquidity(amount);

        amount += vestedAmount;

        _accountPosition.vestedAmount += vestedAmount + remainingAmount;
        _accountPosition.positionLiquidity += liquidity;

        _accountPosition.farmingBalance += amount;
        totalFarmingLiquidity += amount;
        require(_accountPosition.farmingBalance <= UtilitiesLib.ANTI_WHALE_MAX_BALANCE, "Anti-whale system active");

        _sync(address(0), account, 0, _accountPosition.farmingBalance, totalFarmingLiquidity);
    }

    function finalizePosition(uint256 treasuryBalance, uint256 additionalLiquidity, uint256 _vestingEnds) external payable {
        require(msg.sender == token);
        vestingEnds = _vestingEnds;
        (,uint256 remainingAmount) = _mintOrIncreaseLiquidity(treasuryBalance + additionalLiquidity);
        if(remainingAmount > 0) {
            _safeBurn(token, remainingAmount);
        }

        treasuryFarmingBalance += treasuryBalance;
        totalFarmingLiquidity += treasuryBalance;
        address[] memory rewardReceivers = new address[](1);
        _sync(address(0), rewardReceivers[0] = treasuryAddress, 0, treasuryFarmingBalance, totalFarmingLiquidity);
        _claimReward(rewardReceivers[0], rewardReceivers, new uint256[](0));
    }

    function redeemVestingResult() external {
        AccountPosition storage _accountPosition = positionOf[msg.sender];
        uint256 vestedAmount = _accountPosition.vestedAmount;
        uint256 ethAmount = _accountPosition.ethAmount;
        require(vestedAmount != 0 && ethAmount != 0, "unknown account");
        _accountPosition.vestedAmount = 0;
        _accountPosition.ethAmount = 0;
        address[] memory rewardReceivers = new address[](1);
        if(vestingEnds == 0 || block.timestamp < vestingEnds) {
            _decreaseReservedBalance(ethAmount);
            redeemableETH -= ethAmount;
            _safeTransfer(address(0), msg.sender, ethAmount);
            _safeBurn(token, vestedAmount);
            totalFarmingLiquidity -= _accountPosition.farmingBalance;
            _sync(msg.sender, address(0), _accountPosition.farmingBalance = 0, 0, totalFarmingLiquidity);
            rewardReceivers[0] = treasuryAddress;
            delete positionOf[msg.sender];
            accounts--;
        } else {
            _safeTransfer(token, rewardReceivers[0] = msg.sender, vestedAmount);
            sendRemainingETH();
        }
        _claimReward(msg.sender, rewardReceivers, new uint256[](0));
    }

    modifier afterVestingPeriod() {
        _afterVestingPeriod();
        _;
    }

    function sendRemainingETH() public afterVestingPeriod {
        _sendRemainingETH();
    }

    function setTreasuryAddress(address newValue) external afterVestingPeriod returns(address oldValue) {
        require((oldValue = treasuryAddress) == msg.sender, "unauthorized");
        treasuryAddress = newValue;
        _sync(oldValue, newValue, 0, treasuryFarmingBalance, totalFarmingLiquidity);
        address[] memory rewardReceivers = new address[](1);
        rewardReceivers[0] = newValue;
        _claimReward(oldValue, rewardReceivers, new uint256[](0));
    }

    function claimReward(address[] memory rewardReceivers, uint256[] memory rewardReceiversPercentage) external afterVestingPeriod  returns(uint256 claimedReward, uint256 _nextRebalanceEvent, uint256 rewardPerEvent_) {
        return _claimReward(msg.sender, rewardReceivers, rewardReceiversPercentage);
    }

    function claimRewardOf(address account) external afterVestingPeriod returns(uint256 claimedReward, uint256 _nextRebalanceEvent, uint256 rewardPerEvent_) {
        address[] memory rewardReceivers = new address[](1);
        return _claimReward(rewardReceivers[0] = account, rewardReceivers, new uint256[](0));
    }

    function redeemRevenueSharePositionForever(uint256 amount0Min, uint256 amount1Min) external afterVestingPeriod returns (uint256 amount0, uint256 amount1) {
        AccountPosition storage _accountPosition = positionOf[msg.sender];
        require(_accountPosition.positionLiquidity != 0, "unknown account");
        uint256 vestedAmount = _accountPosition.vestedAmount;
        _accountPosition.vestedAmount = 0;
        _accountPosition.ethAmount = 0;
        if(vestedAmount != 0) {
            _safeTransfer(token, msg.sender, vestedAmount);
        }
        address to = address(0);
        uint256 toBalance = 0;
        if(farmingDuration == 1) {
            to = treasuryAddress;
            treasuryFarmingBalance += _accountPosition.farmingBalance;
            toBalance = treasuryFarmingBalance;
        } else {
            totalFarmingLiquidity -= _accountPosition.farmingBalance;
        }
        _sync(msg.sender, to, _accountPosition.farmingBalance = 0, toBalance, totalFarmingLiquidity);
        address[] memory rewardReceivers = new address[](1);
        rewardReceivers[0] = msg.sender;
        _claimReward(msg.sender, rewardReceivers, new uint256[](0));

        bytes[] memory data = new bytes[](3);
        INonfungiblePositionManager nonfungiblePositionManager = INonfungiblePositionManager(uniswapV3NonfungiblePositionsManager);

        (amount0, amount1) = nonfungiblePositionManager.decreaseLiquidity(INonfungiblePositionManager.DecreaseLiquidityParams({
            tokenId: tokenId,
            liquidity: _accountPosition.positionLiquidity,
            amount0Min: amount0Min,
            amount1Min: amount1Min,
            deadline : block.timestamp + 1000
        }));

        delete positionOf[msg.sender];
        accounts--;

        data[0] = abi.encodeWithSelector(nonfungiblePositionManager.collect.selector, INonfungiblePositionManager.CollectParams({
            tokenId: tokenId,
            recipient: address(0),
            amount0Max: uint128(amount0),
            amount1Max: uint128(amount1)
        }));
        data[1] = abi.encodeWithSelector(nonfungiblePositionManager.unwrapWETH9.selector, 0, msg.sender);
        data[2] = abi.encodeWithSelector(nonfungiblePositionManager.sweepToken.selector, token, 0, msg.sender);
        (amount0, amount1) = abi.decode(IMulticall(uniswapV3NonfungiblePositionsManager).multicall(data)[0], (uint256, uint256));
    }

    function collectFees(bytes memory conversionInput) external returns(uint256 collectedAmount0, uint256 collectedAmount1, bytes memory conversionOutput) {
        (collectedAmount0, collectedAmount1, conversionOutput) = TreasuryBootstrapRevenueShareLib.collectFees(conversionInput, uniswapV3NonfungiblePositionsManager, token, WETH, tokenId, conversionAddress, fee, uniswapV3SwapRouter);
        _afterVestingPeriod();
    }

    function _mintOrIncreaseLiquidity(uint256 amount) private returns(uint128 liquidity, uint256 remainingAmount) {

        uint256 tokenPosition = token < WETH ? 0 : 1;

        IERC20Approve(token).approve(uniswapV3NonfungiblePositionsManager, amount);

        (uint256 amount0, uint256 amount1) = tokenPosition == 0 ? (amount, uint256(0)) : (uint256(0), amount);

        if(tokenId == 0) {
            (tokenId, liquidity, amount0, amount1) = INonfungiblePositionManager(uniswapV3NonfungiblePositionsManager).mint(INonfungiblePositionManager.MintParams({
                token0: tokenPosition == 0 ? token : WETH,
                token1: tokenPosition == 1 ? token : WETH,
                fee: fee,
                tickLower: tickLower,
                tickUpper: tickUpper,
                amount0Desired: amount0,
                amount1Desired: amount1,
                amount0Min: _calculatePercentage(amount0, FULL_PRECISION - priceSlippagePercentage),
                amount1Min: _calculatePercentage(amount1, FULL_PRECISION - priceSlippagePercentage),
                recipient: address(this),
                deadline: block.timestamp + 10000
            }));
        } else {
            (liquidity, amount0, amount1) = INonfungiblePositionManager(uniswapV3NonfungiblePositionsManager).increaseLiquidity(INonfungiblePositionManager.IncreaseLiquidityParams({
                tokenId: tokenId,
                amount0Desired: amount0,
                amount1Desired: amount1,
                amount0Min: _calculatePercentage(amount0, FULL_PRECISION - priceSlippagePercentage),
                amount1Min: _calculatePercentage(amount1, FULL_PRECISION - priceSlippagePercentage),
                deadline: block.timestamp + 10000
            }));
        }
        remainingAmount = (amount - (tokenPosition == 0 ? amount0 : amount1));
    }

    function _sendRemainingETH() private {
        uint256 _redeemableETH = redeemableETH;
        if(_redeemableETH != 0) {
            redeemableETH = 0;
            _decreaseReservedBalance(_redeemableETH);
            _safeTransfer(address(0), destinationAddress, _redeemableETH);
        }
    }

    function _afterVestingPeriod() private {
        require(vestingEnds != 0 && block.timestamp >= vestingEnds, "in vesting period");
        _sendRemainingETH();
        if(nextRebalanceEvent != 0 && block.timestamp >= nextRebalanceEvent && farmingDuration != 1) {
            rebalanceIntervalInEventSlots = (MONTH_IN_SECONDS * (farmingDuration = (farmingDuration /= 2) == 0 ? 1 : farmingDuration)) / TIME_SLOT_IN_SECONDS;
        }
        address[] memory rewardReceivers = new address[](1);
        _claimReward(rewardReceivers[0] = treasuryAddress, rewardReceivers, new uint256[](0));
    }
}

interface IConvertInETH {
    function convert(address tokenAddress, uint256 amount, bytes calldata conversionInput) external returns(bytes memory conversionOutput);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"_destinationAddress","type":"address"},{"internalType":"address","name":"_conversionAddress","type":"address"},{"internalType":"uint256","name":"_farmingDuration","type":"uint256"},{"internalType":"address","name":"_uniswapV3NonfungiblePositionsManager","type":"address"},{"internalType":"address","name":"_uniswapV3SwapRouter","type":"address"},{"internalType":"uint24","name":"_fee","type":"uint24"},{"internalType":"uint160","name":"_sqrtPriceX96","type":"uint160"},{"internalType":"uint256","name":"_priceSlippagePercentage","type":"uint256"},{"internalType":"int24","name":"_tickLower","type":"int24"},{"internalType":"int24","name":"_tickUpper","type":"int24"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FULL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MONTH_IN_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_SLOT_IN_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateIfThereIsMoreReward","outputs":[{"internalType":"uint256","name":"seasonReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"rewardReceivers","type":"address[]"},{"internalType":"uint256[]","name":"rewardReceiversPercentage","type":"uint256[]"}],"name":"claimReward","outputs":[{"internalType":"uint256","name":"claimedReward","type":"uint256"},{"internalType":"uint256","name":"_nextRebalanceEvent","type":"uint256"},{"internalType":"uint256","name":"rewardPerEvent_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimRewardOf","outputs":[{"internalType":"uint256","name":"claimedReward","type":"uint256"},{"internalType":"uint256","name":"_nextRebalanceEvent","type":"uint256"},{"internalType":"uint256","name":"rewardPerEvent_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"conversionInput","type":"bytes"}],"name":"collectFees","outputs":[{"internalType":"uint256","name":"collectedAmount0","type":"uint256"},{"internalType":"uint256","name":"collectedAmount1","type":"uint256"},{"internalType":"bytes","name":"conversionOutput","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"completeInitialization","outputs":[{"internalType":"address","name":"operatorAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"conversionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destinationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmingLiquidityProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"treasuryBalance","type":"uint256"},{"internalType":"uint256","name":"additionalLiquidity","type":"uint256"},{"internalType":"uint256","name":"_vestingEnds","type":"uint256"}],"name":"finalizePosition","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lastUpdateEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRebalanceEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"positionOf","outputs":[{"internalType":"uint256","name":"vestedAmount","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint128","name":"positionLiquidity","type":"uint128"},{"internalType":"uint256","name":"farmingBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceSlippagePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceIntervalInEventSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"}],"name":"redeemRevenueSharePositionForever","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemVestingResult","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"redeemableETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setConversionAddress","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setPriceSlippagePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setTreasuryAddress","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sqrtPriceX96","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startEvent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickLower","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickUpper","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFarmingLiquidity","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":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFarmingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV3NonfungiblePositionsManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV3SwapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"vestedAmount","type":"uint256"}],"name":"updatePositionOf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vestingEnds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

61014060405234801562000011575f80fd5b50604051620067ef380380620067ef833981810160405281019062000037919062000604565b8a6200004981620002ad60201b60201c565b506001600a60016101000a81548160ff0219169083151502179055506200008c30896012819055622819a062000080919062000737565b6200034160201b60201c565b8973ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508860175f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525073ffffffffffffffffffffffffffffffffffffffff16634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200017c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a2919062000781565b73ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505081600e60146101000a81548162ffffff021916908360020b62ffffff16021790555080600e60176101000a81548162ffffff021916908360020b62ffffff1602179055508462ffffff166101008162ffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff168152505082601081905550505050505050505050505062000901565b5f620002be6200049860201b60201c565b9050817fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620003d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c8906200080f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16825f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905573ffffffffffffffffffffffffffffffffffffffff16036200047f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000476906200087d565b60405180910390fd5b600f816200048e9190620008ca565b6002819055505050565b5f7fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe54905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620004ef82620004c4565b9050919050565b6200050181620004e3565b81146200050c575f80fd5b50565b5f815190506200051f81620004f6565b92915050565b5f819050919050565b620005398162000525565b811462000544575f80fd5b50565b5f8151905062000557816200052e565b92915050565b5f62ffffff82169050919050565b62000576816200055d565b811462000581575f80fd5b50565b5f8151905062000594816200056b565b92915050565b620005a581620004c4565b8114620005b0575f80fd5b50565b5f81519050620005c3816200059a565b92915050565b5f8160020b9050919050565b620005e081620005c9565b8114620005eb575f80fd5b50565b5f81519050620005fe81620005d5565b92915050565b5f805f805f805f805f805f6101608c8e031215620006275762000626620004c0565b5b5f620006368e828f016200050f565b9b50506020620006498e828f016200050f565b9a505060406200065c8e828f016200050f565b99505060606200066f8e828f0162000547565b9850506080620006828e828f016200050f565b97505060a0620006958e828f016200050f565b96505060c0620006a88e828f0162000584565b95505060e0620006bb8e828f01620005b3565b945050610100620006cf8e828f0162000547565b935050610120620006e38e828f01620005ee565b925050610140620006f78e828f01620005ee565b9150509295989b509295989b9093969950565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620007438262000525565b9150620007508362000525565b9250828202620007608162000525565b915082820484148315176200077a57620007796200070a565b5b5092915050565b5f60208284031215620007995762000798620004c0565b5b5f620007a8848285016200050f565b91505092915050565b5f82825260208201905092915050565b7f4661726d696e673a20414c52454144595f494e495449414c495a4544000000005f82015250565b5f620007f7601c83620007b1565b91506200080482620007c1565b602082019050919050565b5f6020820190508181035f8301526200082881620007e9565b9050919050565b7f4661726d696e673a204c49515549444954595f50524f564944455200000000005f82015250565b5f62000865601b83620007b1565b915062000872826200082f565b602082019050919050565b5f6020820190508181035f830152620008968162000857565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620008d68262000525565b9150620008e38362000525565b925082620008f657620008f56200089d565b5b828204905092915050565b60805160a05160c05160e0516101005161012051615e1a620009d55f395f8181611b3101526123ec01525f8181610efd015281816123cb015281816124b201526131ea01525f8181610eb7015281816121380152818161229101528181612373015281816123a301528181612f6c0152818161311a015261318601525f8181610c2a0152610f1e01525f8181610e7401528181610fbf0152818161166801528181611a3f015281816123300152818161302b015281816130cb015261333c01525f8181612193015261390e0152615e1a5ff3fe6080604052600436106102b0575f3560e01c806381c602b111610174578063c5f956af116100db578063e2fd38e911610094578063f42d437e1161006e578063f42d437e14610a60578063f7c618c114610a8a578063fc0c546a14610ab4578063fd2d39c514610ade576102bf565b8063e2fd38e9146109f2578063ec5687bd14610a1c578063f2fde38b14610a38576102bf565b8063c5f956af146108e4578063ca3254691461090e578063d9dbde6614610938578063dc27f99414610962578063dce7ea531461098c578063ddca3f43146109c8576102bf565b80639c8592f41161012d5780639c8592f41461081e578063a1aabda614610848578063a355120a14610872578063acb50b0e1461088e578063ad5c4648146108a4578063b1f7cec8146108ce576102bf565b806381c602b11461070f578063849e90b3146107395780638d829752146107765780638da5cb5b146107a05780638db791d2146107ca578063921cb5e4146107f4576102bf565b80634b5c4d65116102185780636605bfda116101d15780636605bfda1461060157806368cd03f61461063d578063715018a6146106675780637171225c1461067d57806379fb9a46146106a75780637c64ac43146106e5576102bf565b80634b5c4d65146104f15780634c1314931461051b578063505bbf43146105595780635068f9311461058357806355b812a8146105ad57806359c4f905146105d7576102bf565b806317d70f7c1161026a57806317d70f7c146103e55780631ca93b4b1461040f578063271a3027146104395780633b5cb5f8146104615780633f4676dc1461048b578063441817da146104b5576102bf565b8062bc574b146102c357806305a6c432146102ed5780630c7d67631461032b57806312a4c68414610355578063150b7a021461037f57806316f0115b146103bb576102bf565b366102bf576102bd610b1d565b005b5f80fd5b3480156102ce575f80fd5b506102d7610c28565b6040516102e49190614437565b60405180910390f35b3480156102f8575f80fd5b50610313600480360381019061030e91906146ce565b610c4c565b60405161032293929190614753565b60405180910390f35b348015610336575f80fd5b5061033f610c6f565b60405161034c9190614788565b60405180910390f35b348015610360575f80fd5b50610369610c75565b6040516103769190614788565b60405180910390f35b34801561038a575f80fd5b506103a560048036038101906103a091906147fa565b610c7b565b6040516103b291906148b8565b60405180910390f35b3480156103c6575f80fd5b506103cf610c9c565b6040516103dc9190614437565b60405180910390f35b3480156103f0575f80fd5b506103f9610cc1565b6040516104069190614788565b60405180910390f35b34801561041a575f80fd5b50610423610cc7565b6040516104309190614788565b60405180910390f35b348015610444575f80fd5b5061045f600480360381019061045a91906148d1565b610ce3565b005b34801561046c575f80fd5b50610475610d62565b6040516104829190614788565b60405180910390f35b348015610496575f80fd5b5061049f610d68565b6040516104ac9190614788565b60405180910390f35b3480156104c0575f80fd5b506104db60048036038101906104d691906148fc565b610d6e565b6040516104e89190614437565b60405180910390f35b3480156104fc575f80fd5b50610505610e4d565b6040516105129190614788565b60405180910390f35b348015610526575f80fd5b50610541600480360381019061053c91906149d7565b610e53565b60405161055093929190614a98565b60405180910390f35b348015610564575f80fd5b5061056d610fbd565b60405161057a9190614437565b60405180910390f35b34801561058e575f80fd5b50610597610fe1565b6040516105a49190614788565b60405180910390f35b3480156105b8575f80fd5b506105c1610fe7565b6040516105ce9190614aef565b60405180910390f35b3480156105e2575f80fd5b506105eb610ffa565b6040516105f89190614aef565b60405180910390f35b34801561060c575f80fd5b50610627600480360381019061062291906148fc565b61100d565b6040516106349190614437565b60405180910390f35b348015610648575f80fd5b506106516111f1565b60405161065e9190614788565b60405180910390f35b348015610672575f80fd5b5061067b6111f7565b005b348015610688575f80fd5b50610691611277565b60405161069e9190614788565b60405180910390f35b3480156106b2575f80fd5b506106cd60048036038101906106c891906148fc565b61127e565b6040516106dc93929190614753565b60405180910390f35b3480156106f0575f80fd5b506106f9611383565b6040516107069190614788565b60405180910390f35b34801561071a575f80fd5b50610723611389565b6040516107309190614788565b60405180910390f35b348015610744575f80fd5b5061075f600480360381019061075a9190614b08565b61138f565b60405161076d929190614b46565b60405180910390f35b348015610781575f80fd5b5061078a611b1c565b6040516107979190614788565b60405180910390f35b3480156107ab575f80fd5b506107b4611b21565b6040516107c19190614437565b60405180910390f35b3480156107d5575f80fd5b506107de611b2f565b6040516107eb9190614b7c565b60405180910390f35b3480156107ff575f80fd5b50610808611b53565b6040516108159190614788565b60405180910390f35b348015610829575f80fd5b50610832611b5f565b60405161083f9190614788565b60405180910390f35b348015610853575f80fd5b5061085c611b65565b6040516108699190614788565b60405180910390f35b61088c60048036038101906108879190614b95565b611b81565b005b348015610899575f80fd5b506108a2611dbc565b005b3480156108af575f80fd5b506108b8612136565b6040516108c59190614437565b60405180910390f35b3480156108d9575f80fd5b506108e261215a565b005b3480156108ef575f80fd5b506108f861216c565b6040516109059190614437565b60405180910390f35b348015610919575f80fd5b50610922612191565b60405161092f9190614437565b60405180910390f35b348015610943575f80fd5b5061094c6121b5565b6040516109599190614437565b60405180910390f35b34801561096d575f80fd5b506109766121d8565b6040516109839190614788565b60405180910390f35b348015610997575f80fd5b506109b260048036038101906109ad91906148fc565b6121f5565b6040516109bf9190614437565b60405180910390f35b3480156109d3575f80fd5b506109dc6124b0565b6040516109e99190614c02565b60405180910390f35b3480156109fd575f80fd5b50610a066124d4565b604051610a139190614788565b60405180910390f35b610a366004803603810190610a319190614c1b565b6124da565b005b348015610a43575f80fd5b50610a5e6004803603810190610a5991906148fc565b6126f8565b005b348015610a6b575f80fd5b50610a746127e7565b604051610a819190614437565b60405180910390f35b348015610a95575f80fd5b50610a9e61280c565b604051610aab9190614437565b60405180910390f35b348015610abf575f80fd5b50610ac8612831565b604051610ad59190614437565b60405180910390f35b348015610ae9575f80fd5b50610b046004803603810190610aff91906148fc565b612856565b604051610b149493929190614c95565b60405180910390f35b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b75575f80fd5b5f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19165f357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610be4575f80fd5b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f36604051610c15929190614d06565b604051809103902014610c26575f80fd5b565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805f610c5761289d565b610c62338686612a82565b9250925092509250925092565b60125481565b60025481565b5f8060165414610c89575f80fd5b63150b7a0260e01b905095945050505050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b5f670de0b6b3a7640000600654610cde9190614d78565b905090565b610ceb612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90614e02565b60405180910390fd5b8060108190555050565b60155481565b600b5481565b5f610d77612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90614e02565b60405180910390fd5b60175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160175f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b60185481565b5f80606073ca883a296fa19d0ce326caa8bc6de328bbf47cd863fe372348857f000000000000000000000000000000000000000000000000000000000000000060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000060165460175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518963ffffffff1660e01b8152600401610f60989796959493929190614e95565b5f60405180830381865af4158015610f7a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fa29190614f9a565b809350819450829550505050610fb661289d565b9193909250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045481565b600e60179054906101000a900460020b81565b600e60149054906101000a900460020b81565b5f61101661289d565b3373ffffffffffffffffffffffffffffffffffffffff1660145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16146110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90615050565b60405180910390fd5b8160145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110f981835f601554600b54612b25565b505f600167ffffffffffffffff81111561111657611115614475565b5b6040519080825280602002602001820160405280156111445781602001602082028036833780820191505090505b50905082815f8151811061115b5761115a61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506111e882825f67ffffffffffffffff8111156111b4576111b3614475565b5b6040519080825280602002602001820160405280156111e25781602001602082028036833780820191505090505b50612a82565b50505050919050565b600d5481565b6111ff612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390614e02565b60405180910390fd5b6112755f612c5b565b565b622819a081565b5f805f61128961289d565b5f600167ffffffffffffffff8111156112a5576112a4614475565b5b6040519080825280602002602001820160405280156112d35781602001602082028036833780820191505090505b50905061137585825f815181106112ed576112ec61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250825f67ffffffffffffffff81111561134157611340614475565b5b60405190808252806020026020018201604052801561136f5781602001602082028036833780820191505090505b50612a82565b935093509350509193909250565b600f5481565b60105481565b5f8061139961289d565b5f60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816002015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff160361144c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611443906150e5565b60405180910390fd5b5f815f015490505f825f01819055505f82600101819055505f81146114985761149760135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383612ce7565b5b5f806001601254036114ee5760145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150836003015460155f8282546114dd9190615103565b92505081905550601554905061150b565b8360030154600b5f8282546115039190615136565b925050819055505b61152133835f8760030181905584600b54612b25565b505f600167ffffffffffffffff81111561153e5761153d614475565b5b60405190808252806020026020018201604052801561156c5781602001602082028036833780820191505090505b50905033815f815181106115835761158261506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061161033825f67ffffffffffffffff8111156115dc576115db614475565b5b60405190808252806020026020018201604052801561160a5781602001602082028036833780820191505090505b50612a82565b5050505f600367ffffffffffffffff81111561162f5761162e614475565b5b60405190808252806020026020018201604052801561166257816020015b606081526020019060019003908161164d5790505b5090505f7f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff16630c49ccbe6040518060a0016040528060165481526020018a6002015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020016103e8426117099190615103565b8152506040518263ffffffff1660e01b815260040161172891906151ed565b60408051808303815f875af1158015611743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117679190615206565b809950819a50505060115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a8154906fffffffffffffffffffffffffffffffff0219169055600382015f90555050600d5f8154809291906117f790615244565b919050555063fc6f786560e01b604051806080016040528060165481526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020018b6fffffffffffffffffffffffffffffffff1681526020018a6fffffffffffffffffffffffffffffffff1681525060405160240161187191906152cd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050825f815181106118e1576118e061506e565b5b60200260200101819052506349404b7c60e01b5f33604051602401611907929190615334565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050826001815181106119785761197761506e565b5b602002602001018190525063df2ab5bb60e01b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f336040516024016119c19392919061535b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505082600281518110611a3257611a3161506e565b5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac9650d8836040518263ffffffff1660e01b8152600401611a969190615493565b5f604051808303815f875af1158015611ab1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611ad99190615591565b5f81518110611aeb57611aea61506e565b5b6020026020010151806020019051810190611b069190615206565b809950819a505050505050505050509250929050565b600f81565b5f611b2a612afd565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b670de0b6b3a764000081565b60055481565b5f670de0b6b3a7640000600854611b7c9190614d78565b905090565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd9575f80fd5b611be234612f36565b3460185f828254611bf39190615103565b925050819055505f60115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816001015403611c5d57600d5f815480929190611c57906155d8565b91905055505b34816001015f828254611c709190615103565b925050819055505f80611c8285612f67565b915091508385611c929190615103565b94508084611ca09190615103565b835f015f828254611cb19190615103565b9250508190555081836002015f8282829054906101000a90046fffffffffffffffffffffffffffffffff16611ce6919061561f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084836003015f828254611d2f9190615103565b9250508190555084600b5f828254611d479190615103565b925050819055506a013da329b633647180000083600301541115611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906156ac565b60405180910390fd5b611db35f875f8660030154600b54612b25565b50505050505050565b5f60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f826001015490505f8214158015611e1b57505f8114155b611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906150e5565b60405180910390fd5b5f835f01819055505f83600101819055505f600167ffffffffffffffff811115611e8757611e86614475565b5b604051908082528060200260200182016040528015611eb55781602001602082028036833780820191505090505b5090505f600f541480611ec95750600f5442105b1561205957611ed78261347b565b8160185f828254611ee89190615136565b92505081905550611efa5f3384612ce7565b611f2560135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134ac565b8360030154600b5f828254611f3a9190615136565b92505081905550611f57335f80876003018190555f600b54612b25565b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f81518110611f8d57611f8c61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a8154906fffffffffffffffffffffffffffffffff0219169055600382015f90555050600d5f81548092919061204f90615244565b91905055506120da565b6120d160135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633835f815181106120925761209161506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525085612ce7565b6120d961215a565b5b61212d33825f67ffffffffffffffff8111156120f9576120f8614475565b5b6040519080825280602002602001820160405280156121275781602001602082028036833780820191505090505b50612a82565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61216261289d565b61216a6138eb565b565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6121f0600a5f9054906101000a900460ff16613937565b905090565b5f8073ffffffffffffffffffffffffffffffffffffffff1660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e575f80fd5b8160145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163360135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905573ffffffffffffffffffffffffffffffffffffffff1610612327576001612329565b5f5b60ff1690507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166313ead5625f8314612397577f0000000000000000000000000000000000000000000000000000000000000000612399565b335b600184146123c7577f00000000000000000000000000000000000000000000000000000000000000006123c9565b335b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518563ffffffff1660e01b815260040161242a94939291906156ca565b6020604051808303815f875af1158015612446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246a9190615721565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60035481565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612532575f80fd5b80600f819055505f61254e83856125499190615103565b612f67565b9150505f8111156125855761258460135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826134ac565b5b8360155f8282546125969190615103565b9250508190555083600b5f8282546125ae9190615103565b925050819055505f600167ffffffffffffffff8111156125d1576125d0614475565b5b6040519080825280602002602001820160405280156125ff5781602001602082028036833780820191505090505b5090506126805f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f8151811061263b5761263a61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505f601554600b54612b25565b506126ee815f815181106126975761269661506e565b5b6020026020010151825f67ffffffffffffffff8111156126ba576126b9614475565b5b6040519080825280602002602001820160405280156126e85781602001602082028036833780820191505090505b50612a82565b5050505050505050565b612700612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614e02565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290615796565b60405180910390fd5b6127e481612c5b565b50565b60175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6011602052805f5260405f205f91509050805f015490806001015490806002015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060030154905084565b5f600f54141580156128b15750600f544210155b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e7906157fe565b60405180910390fd5b6128f86138eb565b5f6005541415801561290c57506005544210155b801561291b5750600160125414155b1561296f57600f5f600260125f8282546129359190614d78565b925050819055146129485760125461294b565b60015b6012819055622819a061295e919061581c565b6129689190614d78565b6002819055505b5f600167ffffffffffffffff81111561298b5761298a614475565b5b6040519080825280602002602001820160405280156129b95781602001602082028036833780820191505090505b509050612a7c60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16825f815181106129f4576129f361506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250825f67ffffffffffffffff811115612a4857612a47614475565b5b604051908082528060200260200182016040528015612a765781602001602082028036833780820191505090505b50612a82565b50505050565b5f805f80600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050612add612ad46139bb565b5f83145f613a8e565b8093508194505050612af187828888613c7d565b93505093509350939050565b5f7fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe54905090565b5f612b31825f80613a8e565b50809150505f8067ffffffffffffffff811115612b5157612b50614475565b5b604051908082528060200260200182016040528015612b7f5781602001602082028036833780820191505090505b5090505f8067ffffffffffffffff811115612b9d57612b9c614475565b5b604051908082528060200260200182016040528015612bcb5781602001602082028036833780820191505090505b5090505f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614612c0f57612c0d88878484613c7d565b505b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614612c5057612c4e87868484613c7d565b505b505095945050505050565b5f612c64612afd565b9050817fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f810315612f31573073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315612f31575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612da457612d608282613e1d565b612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d96906158a7565b60405180910390fd5b612f31565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de657612de183826134ac565b612f31565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401612e1a9291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e84919061591c565b5f604051808303815f865af19150503d805f8114612ebd576040519150601f19603f3d011682016040523d82523d5f602084013e612ec2565b606091505b5091509150818015612eef57505f81511480612eee575080806020019051810190612eed9190615967565b5b5b612f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f25906158a7565b60405180910390fd5b50505b505050565b612f5e670de0b6b3a764000082612f4d919061581c565b600854613e3190919063ffffffff16565b60088190555050565b5f805f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1610612fe5576001612fe7565b5f5b60ff16905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b81526004016130689291906158c5565b6020604051808303815f875af1158015613084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a89190615967565b505f805f83146130b9575f866130bc565b855f5b915091505f6016540361333a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052805f871461313e577f0000000000000000000000000000000000000000000000000000000000000000613161565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff168152602001600187146131aa577f00000000000000000000000000000000000000000000000000000000000000006131cd565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff168152602001600e60149054906101000a900460020b60020b8152602001600e60179054906101000a900460020b60020b815260200185815260200184815260200161326e86601054670de0b6b3a76400006132699190615136565b613e89565b815260200161329285601054670de0b6b3a764000061328d9190615136565b613e89565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001612710426132c19190615103565b8152506040518263ffffffff1660e01b81526004016132e09190615a8f565b6080604051808303815f875af11580156132fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133209190615ad3565b60165f829650839750849a50859190505550505050613457565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663219f5d176040518060c0016040528060165481526020018581526020018481526020016133b486601054670de0b6b3a76400006133af9190615136565b613e89565b81526020016133d885601054670de0b6b3a76400006133d39190615136565b613e89565b8152602001612710426133eb9190615103565b8152506040518263ffffffff1660e01b815260040161340a9190615bb0565b6060604051808303815f875af1158015613426573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061344a9190615bc9565b8093508194508297505050505b5f83146134645780613466565b815b866134719190615136565b9350505050915091565b6134a3670de0b6b3a764000082613492919061581c565b600854613ecf90919063ffffffff16565b60088190555050565b5f808373ffffffffffffffffffffffffffffffffffffffff166342966c68846040516024016134db9190614788565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613529919061591c565b5f604051808303815f865af19150503d805f8114613562576040519150601f19603f3d011682016040523d82523d5f602084013e613567565b606091505b509150915081801561359457505f815114806135935750808060200190518101906135929190615967565b5b5b9150816136a9578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b5f856040516024016135cd9291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613637919061591c565b5f604051808303815f865af19150503d805f8114613670576040519150601f19603f3d011682016040523d82523d5f602084013e613675565b606091505b5080925081935050508180156136a657505f815114806136a55750808060200190518101906136a49190615967565b5b5b91505b816137be578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b61dead856040516024016136e29291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161374c919061591c565b5f604051808303815f865af19150503d805f8114613785576040519150601f19603f3d011682016040523d82523d5f602084013e61378a565b606091505b5080925081935050508180156137bb57505f815114806137ba5750808060200190518101906137b99190615967565b5b5b91505b816138e5578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b73deaddeaddeaddeaddeaddeaddeaddeaddeaddead856040516024016138099291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613873919061591c565b5f604051808303815f865af19150503d805f81146138ac576040519150601f19603f3d011682016040523d82523d5f602084013e6138b1565b606091505b5080925081935050508180156138e257505f815114806138e15750808060200190518101906138e09190615967565b5b5b91505b50505050565b5f60185490505f8114613934575f6018819055506139088161347b565b6139335f7f000000000000000000000000000000000000000000000000000000000000000083612ce7565b5b50565b5f600a5f9054906101000a900460ff168015613951575081155b6139b2576139ad60085461399f670de0b6b3a764000061399160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613f27565b613fe190919063ffffffff16565b613ecf90919063ffffffff16565b6139b4565b5f5b9050919050565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613a84578073ffffffffffffffffffffffffffffffffffffffff16633f4676dc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7f9190615c19565b613a88565b600b545b91505090565b5f805f4290505f60095490505f60035490505f6004549050600554955060065494505f8614613b43575f868510613ac55786613ac7565b845b905088158015613ad757505f8414155b15613b41575f838310613aea5782613aec565b835b9050613b3285613b1789613b098587613ecf90919063ffffffff16565b613fe190919063ffffffff16565b613b219190614d78565b600754613e3190919063ffffffff16565b60078190555081600481905550505b505b886009819055508680613b565750858410155b80613b6057505f89145b15613c5b575f600854905084871115613bad57613baa613b9b87613b8d888b613ecf90919063ffffffff16565b613fe190919063ffffffff16565b82613ecf90919063ffffffff16565b90505b5f6004819055505f92505f96505f95505f613bc789613937565b90505f81118015613bd857505f8b14155b15613c33575f613bf4600f600254613fe190919063ffffffff16565b9050869450613c0c8284613e3190919063ffffffff16565b9250613c218188613e3190919063ffffffff16565b98508082613c2f9190614d78565b9750505b83600381905550816008819055508760058190555086600681905550613c588861404d565b50505b670de0b6b3a764000085613c6f9190614d78565b945050505050935093915050565b5f80600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f8201548152602001600182015481526020016002820154815250509050613d04613cf287614124565b825f0151613e3190919063ffffffff16565b815f01818152505084816040018181525050600754816020018181525050613d2c84846141d3565b15613db757670de0b6b3a7640000815f0151613d489190614d78565b91505f821115613db6575f613d85613d71670de0b6b3a764000085613fe190919063ffffffff16565b915081600854613ecf90919063ffffffff16565b600881905550613da181835f0151613ecf90919063ffffffff16565b825f018181525050613db4838686614322565b505b5b80600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015590505050949350505050565b5f805f805f85875af1506001905092915050565b5f828284613e3f9190615103565b9150811015613e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7a90615c8e565b60405180910390fd5b92915050565b5f670de0b6b3a764000080670de0b6b3a764000084613ea8919061581c565b613eb29190614d78565b84613ebd919061581c565b613ec79190614d78565b905092915050565b5f828284613edd9190615136565b9150811115613f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f1890615cf6565b60405180910390fd5b92915050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613fd8578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f949190614437565b602060405180830381865afa158015613faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd39190615c19565b613fda565b475b9050919050565b5f80821480614008575082828385613ff9919061581c565b9250826140069190614d78565b145b614047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403e90615d5e565b60405180910390fd5b92915050565b600a60019054906101000a900460ff16614121575f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461411f578073ffffffffffffffffffffffffffffffffffffffff1663d3f37d4e836040518263ffffffff1660e01b81526004016140f19190614788565b5f604051808303815f87803b158015614108575f80fd5b505af115801561411a573d5f803e3d5ffd5b505050505b505b50565b5f6141cc600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201546141be600c5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154600754613ecf90919063ffffffff16565b613fe190919063ffffffff16565b9050919050565b5f808351036141e4575f905061431c565b600183516141f29190615136565b825114614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161422b90615dc6565b60405180910390fd5b5f670de0b6b3a764000090505f5b83518110156142d3575f84828151811061425f5761425e61506e565b5b602002602001015190505f811415801561427857508281105b6142b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142ae90615dc6565b60405180910390fd5b80836142c39190615136565b9250508080600101915050614242565b505f8103614316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161430d90615dc6565b60405180910390fd5b60019150505b92915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8490505f5b83518110156143be575f61437b8786848151811061436e5761436d61506e565b5b6020026020010151613e89565b90506143a2848784815181106143945761439361506e565b5b602002602001015183612ce7565b80836143ae9190615136565b925050808060010191505061434d565b506143f18285600187516143d29190615136565b815181106143e3576143e261506e565b5b602002602001015183612ce7565b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614421826143f8565b9050919050565b61443181614417565b82525050565b5f60208201905061444a5f830184614428565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144ab82614465565b810181811067ffffffffffffffff821117156144ca576144c9614475565b5b80604052505050565b5f6144dc614450565b90506144e882826144a2565b919050565b5f67ffffffffffffffff82111561450757614506614475565b5b602082029050602081019050919050565b5f80fd5b61452581614417565b811461452f575f80fd5b50565b5f813590506145408161451c565b92915050565b5f614558614553846144ed565b6144d3565b9050808382526020820190506020840283018581111561457b5761457a614518565b5b835b818110156145a457806145908882614532565b84526020840193505060208101905061457d565b5050509392505050565b5f82601f8301126145c2576145c1614461565b5b81356145d2848260208601614546565b91505092915050565b5f67ffffffffffffffff8211156145f5576145f4614475565b5b602082029050602081019050919050565b5f819050919050565b61461881614606565b8114614622575f80fd5b50565b5f813590506146338161460f565b92915050565b5f61464b614646846145db565b6144d3565b9050808382526020820190506020840283018581111561466e5761466d614518565b5b835b8181101561469757806146838882614625565b845260208401935050602081019050614670565b5050509392505050565b5f82601f8301126146b5576146b4614461565b5b81356146c5848260208601614639565b91505092915050565b5f80604083850312156146e4576146e3614459565b5b5f83013567ffffffffffffffff8111156147015761470061445d565b5b61470d858286016145ae565b925050602083013567ffffffffffffffff81111561472e5761472d61445d565b5b61473a858286016146a1565b9150509250929050565b61474d81614606565b82525050565b5f6060820190506147665f830186614744565b6147736020830185614744565b6147806040830184614744565b949350505050565b5f60208201905061479b5f830184614744565b92915050565b5f80fd5b5f8083601f8401126147ba576147b9614461565b5b8235905067ffffffffffffffff8111156147d7576147d66147a1565b5b6020830191508360018202830111156147f3576147f2614518565b5b9250929050565b5f805f805f6080868803121561481357614812614459565b5b5f61482088828901614532565b955050602061483188828901614532565b945050604061484288828901614625565b935050606086013567ffffffffffffffff8111156148635761486261445d565b5b61486f888289016147a5565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148b28161487e565b82525050565b5f6020820190506148cb5f8301846148a9565b92915050565b5f602082840312156148e6576148e5614459565b5b5f6148f384828501614625565b91505092915050565b5f6020828403121561491157614910614459565b5b5f61491e84828501614532565b91505092915050565b5f80fd5b5f67ffffffffffffffff82111561494557614944614475565b5b61494e82614465565b9050602081019050919050565b828183375f83830152505050565b5f61497b6149768461492b565b6144d3565b90508281526020810184848401111561499757614996614927565b5b6149a284828561495b565b509392505050565b5f82601f8301126149be576149bd614461565b5b81356149ce848260208601614969565b91505092915050565b5f602082840312156149ec576149eb614459565b5b5f82013567ffffffffffffffff811115614a0957614a0861445d565b5b614a15848285016149aa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614a55578082015181840152602081019050614a3a565b5f8484015250505050565b5f614a6a82614a1e565b614a748185614a28565b9350614a84818560208601614a38565b614a8d81614465565b840191505092915050565b5f606082019050614aab5f830186614744565b614ab86020830185614744565b8181036040830152614aca8184614a60565b9050949350505050565b5f8160020b9050919050565b614ae981614ad4565b82525050565b5f602082019050614b025f830184614ae0565b92915050565b5f8060408385031215614b1e57614b1d614459565b5b5f614b2b85828601614625565b9250506020614b3c85828601614625565b9150509250929050565b5f604082019050614b595f830185614744565b614b666020830184614744565b9392505050565b614b76816143f8565b82525050565b5f602082019050614b8f5f830184614b6d565b92915050565b5f805f60608486031215614bac57614bab614459565b5b5f614bb986828701614532565b9350506020614bca86828701614625565b9250506040614bdb86828701614625565b9150509250925092565b5f62ffffff82169050919050565b614bfc81614be5565b82525050565b5f602082019050614c155f830184614bf3565b92915050565b5f805f60608486031215614c3257614c31614459565b5b5f614c3f86828701614625565b9350506020614c5086828701614625565b9250506040614c6186828701614625565b9150509250925092565b5f6fffffffffffffffffffffffffffffffff82169050919050565b614c8f81614c6b565b82525050565b5f608082019050614ca85f830187614744565b614cb56020830186614744565b614cc26040830185614c86565b614ccf6060830184614744565b95945050505050565b5f81905092915050565b5f614ced8385614cd8565b9350614cfa83858461495b565b82840190509392505050565b5f614d12828486614ce2565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614d8282614606565b9150614d8d83614606565b925082614d9d57614d9c614d1e565b5b828204905092915050565b5f82825260208201905092915050565b7f556e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f614dec600c83614da8565b9150614df782614db8565b602082019050919050565b5f6020820190508181035f830152614e1981614de0565b9050919050565b5f82825260208201905092915050565b5f614e3a82614a1e565b614e448185614e20565b9350614e54818560208601614a38565b614e5d81614465565b840191505092915050565b614e7181614417565b82525050565b614e8081614606565b82525050565b614e8f81614be5565b82525050565b5f610100820190508181035f830152614eae818b614e30565b9050614ebd602083018a614e68565b614eca6040830189614e68565b614ed76060830188614e68565b614ee46080830187614e77565b614ef160a0830186614e68565b614efe60c0830185614e86565b614f0b60e0830184614e68565b9998505050505050505050565b5f81519050614f268161460f565b92915050565b5f614f3e614f398461492b565b6144d3565b905082815260208101848484011115614f5a57614f59614927565b5b614f65848285614a38565b509392505050565b5f82601f830112614f8157614f80614461565b5b8151614f91848260208601614f2c565b91505092915050565b5f805f60608486031215614fb157614fb0614459565b5b5f614fbe86828701614f18565b9350506020614fcf86828701614f18565b925050604084015167ffffffffffffffff811115614ff057614fef61445d565b5b614ffc86828701614f6d565b9150509250925092565b7f756e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f61503a600c83614da8565b915061504582615006565b602082019050919050565b5f6020820190508181035f8301526150678161502e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f756e6b6e6f776e206163636f756e7400000000000000000000000000000000005f82015250565b5f6150cf600f83614da8565b91506150da8261509b565b602082019050919050565b5f6020820190508181035f8301526150fc816150c3565b9050919050565b5f61510d82614606565b915061511883614606565b92508282019050808211156151305761512f614d4b565b5b92915050565b5f61514082614606565b915061514b83614606565b925082820390508181111561516357615162614d4b565b5b92915050565b61517281614606565b82525050565b61518181614c6b565b82525050565b60a082015f82015161519b5f850182615169565b5060208201516151ae6020850182615178565b5060408201516151c16040850182615169565b5060608201516151d46060850182615169565b5060808201516151e76080850182615169565b50505050565b5f60a0820190506152005f830184615187565b92915050565b5f806040838503121561521c5761521b614459565b5b5f61522985828601614f18565b925050602061523a85828601614f18565b9150509250929050565b5f61524e82614606565b91505f82036152605761525f614d4b565b5b600182039050919050565b61527481614417565b82525050565b608082015f82015161528e5f850182615169565b5060208201516152a1602085018261526b565b5060408201516152b46040850182615178565b5060608201516152c76060850182615178565b50505050565b5f6080820190506152e05f83018461527a565b92915050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f61531e615319615314846152e6565b6152fb565b6152ef565b9050919050565b61532e81615304565b82525050565b5f6040820190506153475f830185615325565b6153546020830184614428565b9392505050565b5f60608201905061536e5f830186614428565b61537b6020830185615325565b6153886040830184614428565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6153d382614a1e565b6153dd81856153b9565b93506153ed818560208601614a38565b6153f681614465565b840191505092915050565b5f61540c83836153c9565b905092915050565b5f602082019050919050565b5f61542a82615390565b615434818561539a565b935083602082028501615446856153aa565b805f5b8581101561548157848403895281516154628582615401565b945061546d83615414565b925060208a01995050600181019050615449565b50829750879550505050505092915050565b5f6020820190508181035f8301526154ab8184615420565b905092915050565b5f67ffffffffffffffff8211156154cd576154cc614475565b5b602082029050602081019050919050565b5f6154f06154eb846154b3565b6144d3565b9050808382526020820190506020840283018581111561551357615512614518565b5b835b8181101561555a57805167ffffffffffffffff81111561553857615537614461565b5b8086016155458982614f6d565b85526020850194505050602081019050615515565b5050509392505050565b5f82601f83011261557857615577614461565b5b81516155888482602086016154de565b91505092915050565b5f602082840312156155a6576155a5614459565b5b5f82015167ffffffffffffffff8111156155c3576155c261445d565b5b6155cf84828501615564565b91505092915050565b5f6155e282614606565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361561457615613614d4b565b5b600182019050919050565b5f61562982614c6b565b915061563483614c6b565b925082820190506fffffffffffffffffffffffffffffffff81111561565c5761565b614d4b565b5b92915050565b7f416e74692d7768616c652073797374656d2061637469766500000000000000005f82015250565b5f615696601883614da8565b91506156a182615662565b602082019050919050565b5f6020820190508181035f8301526156c38161568a565b9050919050565b5f6080820190506156dd5f830187614428565b6156ea6020830186614428565b6156f76040830185614bf3565b6157046060830184614b6d565b95945050505050565b5f8151905061571b8161451c565b92915050565b5f6020828403121561573657615735614459565b5b5f6157438482850161570d565b91505092915050565b7f496e76616c6964000000000000000000000000000000000000000000000000005f82015250565b5f615780600783614da8565b915061578b8261574c565b602082019050919050565b5f6020820190508181035f8301526157ad81615774565b9050919050565b7f696e2076657374696e6720706572696f640000000000000000000000000000005f82015250565b5f6157e8601183614da8565b91506157f3826157b4565b602082019050919050565b5f6020820190508181035f830152615815816157dc565b9050919050565b5f61582682614606565b915061583183614606565b925082820261583f81614606565b9150828204841483151761585657615855614d4b565b5b5092915050565b7f4641524d494e473a205452414e534645525f4641494c454400000000000000005f82015250565b5f615891601883614da8565b915061589c8261585d565b602082019050919050565b5f6020820190508181035f8301526158be81615885565b9050919050565b5f6040820190506158d85f830185614428565b6158e56020830184614744565b9392505050565b5f6158f682614a1e565b6159008185614cd8565b9350615910818560208601614a38565b80840191505092915050565b5f61592782846158ec565b915081905092915050565b5f8115159050919050565b61594681615932565b8114615950575f80fd5b50565b5f815190506159618161593d565b92915050565b5f6020828403121561597c5761597b614459565b5b5f61598984828501615953565b91505092915050565b61599b81614be5565b82525050565b6159aa81614ad4565b82525050565b61016082015f8201516159c55f85018261526b565b5060208201516159d8602085018261526b565b5060408201516159eb6040850182615992565b5060608201516159fe60608501826159a1565b506080820151615a1160808501826159a1565b5060a0820151615a2460a0850182615169565b5060c0820151615a3760c0850182615169565b5060e0820151615a4a60e0850182615169565b50610100820151615a5f610100850182615169565b50610120820151615a7461012085018261526b565b50610140820151615a89610140850182615169565b50505050565b5f61016082019050615aa35f8301846159b0565b92915050565b615ab281614c6b565b8114615abc575f80fd5b50565b5f81519050615acd81615aa9565b92915050565b5f805f8060808587031215615aeb57615aea614459565b5b5f615af887828801614f18565b9450506020615b0987828801615abf565b9350506040615b1a87828801614f18565b9250506060615b2b87828801614f18565b91505092959194509250565b60c082015f820151615b4b5f850182615169565b506020820151615b5e6020850182615169565b506040820151615b716040850182615169565b506060820151615b846060850182615169565b506080820151615b976080850182615169565b5060a0820151615baa60a0850182615169565b50505050565b5f60c082019050615bc35f830184615b37565b92915050565b5f805f60608486031215615be057615bdf614459565b5b5f615bed86828701615abf565b9350506020615bfe86828701614f18565b9250506040615c0f86828701614f18565b9150509250925092565b5f60208284031215615c2e57615c2d614459565b5b5f615c3b84828501614f18565b91505092915050565b7f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000005f82015250565b5f615c78601483614da8565b9150615c8382615c44565b602082019050919050565b5f6020820190508181035f830152615ca581615c6c565b9050919050565b7f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000005f82015250565b5f615ce0601583614da8565b9150615ceb82615cac565b602082019050919050565b5f6020820190508181035f830152615d0d81615cd4565b9050919050565b7f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000005f82015250565b5f615d48601483614da8565b9150615d5382615d14565b602082019050919050565b5f6020820190508181035f830152615d7581615d3c565b9050919050565b7f70657263656e74616765000000000000000000000000000000000000000000005f82015250565b5f615db0600a83614da8565b9150615dbb82615d7c565b602082019050919050565b5f6020820190508181035f830152615ddd81615da4565b905091905056fea264697066735822122097acec69a57de94181cda30ab7ed6376a1914ac8baa163b7852f28988f3ec7d964736f6c634300081800330000000000000000000000005a46c3a544d160f39a96036a88ad09f95035a892000000000000000000000000bc5052b0aa6149fe86747cb7e99524f56fb6402a000000000000000000000000fad75c63c3817f1931357aec9a7736bb8067a1d90000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000183d3e95f01af549e542b2e000000000000000000000000000000000000000000000000006a94d74f430000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6f38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4868

Deployed Bytecode

0x6080604052600436106102b0575f3560e01c806381c602b111610174578063c5f956af116100db578063e2fd38e911610094578063f42d437e1161006e578063f42d437e14610a60578063f7c618c114610a8a578063fc0c546a14610ab4578063fd2d39c514610ade576102bf565b8063e2fd38e9146109f2578063ec5687bd14610a1c578063f2fde38b14610a38576102bf565b8063c5f956af146108e4578063ca3254691461090e578063d9dbde6614610938578063dc27f99414610962578063dce7ea531461098c578063ddca3f43146109c8576102bf565b80639c8592f41161012d5780639c8592f41461081e578063a1aabda614610848578063a355120a14610872578063acb50b0e1461088e578063ad5c4648146108a4578063b1f7cec8146108ce576102bf565b806381c602b11461070f578063849e90b3146107395780638d829752146107765780638da5cb5b146107a05780638db791d2146107ca578063921cb5e4146107f4576102bf565b80634b5c4d65116102185780636605bfda116101d15780636605bfda1461060157806368cd03f61461063d578063715018a6146106675780637171225c1461067d57806379fb9a46146106a75780637c64ac43146106e5576102bf565b80634b5c4d65146104f15780634c1314931461051b578063505bbf43146105595780635068f9311461058357806355b812a8146105ad57806359c4f905146105d7576102bf565b806317d70f7c1161026a57806317d70f7c146103e55780631ca93b4b1461040f578063271a3027146104395780633b5cb5f8146104615780633f4676dc1461048b578063441817da146104b5576102bf565b8062bc574b146102c357806305a6c432146102ed5780630c7d67631461032b57806312a4c68414610355578063150b7a021461037f57806316f0115b146103bb576102bf565b366102bf576102bd610b1d565b005b5f80fd5b3480156102ce575f80fd5b506102d7610c28565b6040516102e49190614437565b60405180910390f35b3480156102f8575f80fd5b50610313600480360381019061030e91906146ce565b610c4c565b60405161032293929190614753565b60405180910390f35b348015610336575f80fd5b5061033f610c6f565b60405161034c9190614788565b60405180910390f35b348015610360575f80fd5b50610369610c75565b6040516103769190614788565b60405180910390f35b34801561038a575f80fd5b506103a560048036038101906103a091906147fa565b610c7b565b6040516103b291906148b8565b60405180910390f35b3480156103c6575f80fd5b506103cf610c9c565b6040516103dc9190614437565b60405180910390f35b3480156103f0575f80fd5b506103f9610cc1565b6040516104069190614788565b60405180910390f35b34801561041a575f80fd5b50610423610cc7565b6040516104309190614788565b60405180910390f35b348015610444575f80fd5b5061045f600480360381019061045a91906148d1565b610ce3565b005b34801561046c575f80fd5b50610475610d62565b6040516104829190614788565b60405180910390f35b348015610496575f80fd5b5061049f610d68565b6040516104ac9190614788565b60405180910390f35b3480156104c0575f80fd5b506104db60048036038101906104d691906148fc565b610d6e565b6040516104e89190614437565b60405180910390f35b3480156104fc575f80fd5b50610505610e4d565b6040516105129190614788565b60405180910390f35b348015610526575f80fd5b50610541600480360381019061053c91906149d7565b610e53565b60405161055093929190614a98565b60405180910390f35b348015610564575f80fd5b5061056d610fbd565b60405161057a9190614437565b60405180910390f35b34801561058e575f80fd5b50610597610fe1565b6040516105a49190614788565b60405180910390f35b3480156105b8575f80fd5b506105c1610fe7565b6040516105ce9190614aef565b60405180910390f35b3480156105e2575f80fd5b506105eb610ffa565b6040516105f89190614aef565b60405180910390f35b34801561060c575f80fd5b50610627600480360381019061062291906148fc565b61100d565b6040516106349190614437565b60405180910390f35b348015610648575f80fd5b506106516111f1565b60405161065e9190614788565b60405180910390f35b348015610672575f80fd5b5061067b6111f7565b005b348015610688575f80fd5b50610691611277565b60405161069e9190614788565b60405180910390f35b3480156106b2575f80fd5b506106cd60048036038101906106c891906148fc565b61127e565b6040516106dc93929190614753565b60405180910390f35b3480156106f0575f80fd5b506106f9611383565b6040516107069190614788565b60405180910390f35b34801561071a575f80fd5b50610723611389565b6040516107309190614788565b60405180910390f35b348015610744575f80fd5b5061075f600480360381019061075a9190614b08565b61138f565b60405161076d929190614b46565b60405180910390f35b348015610781575f80fd5b5061078a611b1c565b6040516107979190614788565b60405180910390f35b3480156107ab575f80fd5b506107b4611b21565b6040516107c19190614437565b60405180910390f35b3480156107d5575f80fd5b506107de611b2f565b6040516107eb9190614b7c565b60405180910390f35b3480156107ff575f80fd5b50610808611b53565b6040516108159190614788565b60405180910390f35b348015610829575f80fd5b50610832611b5f565b60405161083f9190614788565b60405180910390f35b348015610853575f80fd5b5061085c611b65565b6040516108699190614788565b60405180910390f35b61088c60048036038101906108879190614b95565b611b81565b005b348015610899575f80fd5b506108a2611dbc565b005b3480156108af575f80fd5b506108b8612136565b6040516108c59190614437565b60405180910390f35b3480156108d9575f80fd5b506108e261215a565b005b3480156108ef575f80fd5b506108f861216c565b6040516109059190614437565b60405180910390f35b348015610919575f80fd5b50610922612191565b60405161092f9190614437565b60405180910390f35b348015610943575f80fd5b5061094c6121b5565b6040516109599190614437565b60405180910390f35b34801561096d575f80fd5b506109766121d8565b6040516109839190614788565b60405180910390f35b348015610997575f80fd5b506109b260048036038101906109ad91906148fc565b6121f5565b6040516109bf9190614437565b60405180910390f35b3480156109d3575f80fd5b506109dc6124b0565b6040516109e99190614c02565b60405180910390f35b3480156109fd575f80fd5b50610a066124d4565b604051610a139190614788565b60405180910390f35b610a366004803603810190610a319190614c1b565b6124da565b005b348015610a43575f80fd5b50610a5e6004803603810190610a5991906148fc565b6126f8565b005b348015610a6b575f80fd5b50610a746127e7565b604051610a819190614437565b60405180910390f35b348015610a95575f80fd5b50610a9e61280c565b604051610aab9190614437565b60405180910390f35b348015610abf575f80fd5b50610ac8612831565b604051610ad59190614437565b60405180910390f35b348015610ae9575f80fd5b50610b046004803603810190610aff91906148fc565b612856565b604051610b149493929190614c95565b60405180910390f35b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b75575f80fd5b5f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19165f357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610be4575f80fd5b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705f36604051610c15929190614d06565b604051809103902014610c26575f80fd5b565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156481565b5f805f610c5761289d565b610c62338686612a82565b9250925092509250925092565b60125481565b60025481565b5f8060165414610c89575f80fd5b63150b7a0260e01b905095945050505050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b5f670de0b6b3a7640000600654610cde9190614d78565b905090565b610ceb612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90614e02565b60405180910390fd5b8060108190555050565b60155481565b600b5481565b5f610d77612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90614e02565b60405180910390fd5b60175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160175f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b60185481565b5f80606073ca883a296fa19d0ce326caa8bc6de328bbf47cd863fe372348857f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8860135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260165460175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000027107f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615646040518963ffffffff1660e01b8152600401610f60989796959493929190614e95565b5f60405180830381865af4158015610f7a573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fa29190614f9a565b809350819450829550505050610fb661289d565b9193909250565b7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8881565b60045481565b600e60179054906101000a900460020b81565b600e60149054906101000a900460020b81565b5f61101661289d565b3373ffffffffffffffffffffffffffffffffffffffff1660145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff16146110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90615050565b60405180910390fd5b8160145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110f981835f601554600b54612b25565b505f600167ffffffffffffffff81111561111657611115614475565b5b6040519080825280602002602001820160405280156111445781602001602082028036833780820191505090505b50905082815f8151811061115b5761115a61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506111e882825f67ffffffffffffffff8111156111b4576111b3614475565b5b6040519080825280602002602001820160405280156111e25781602001602082028036833780820191505090505b50612a82565b50505050919050565b600d5481565b6111ff612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390614e02565b60405180910390fd5b6112755f612c5b565b565b622819a081565b5f805f61128961289d565b5f600167ffffffffffffffff8111156112a5576112a4614475565b5b6040519080825280602002602001820160405280156112d35781602001602082028036833780820191505090505b50905061137585825f815181106112ed576112ec61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250825f67ffffffffffffffff81111561134157611340614475565b5b60405190808252806020026020018201604052801561136f5781602001602082028036833780820191505090505b50612a82565b935093509350509193909250565b600f5481565b60105481565b5f8061139961289d565b5f60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816002015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff160361144c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611443906150e5565b60405180910390fd5b5f815f015490505f825f01819055505f82600101819055505f81146114985761149760135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383612ce7565b5b5f806001601254036114ee5760145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150836003015460155f8282546114dd9190615103565b92505081905550601554905061150b565b8360030154600b5f8282546115039190615136565b925050819055505b61152133835f8760030181905584600b54612b25565b505f600167ffffffffffffffff81111561153e5761153d614475565b5b60405190808252806020026020018201604052801561156c5781602001602082028036833780820191505090505b50905033815f815181106115835761158261506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061161033825f67ffffffffffffffff8111156115dc576115db614475565b5b60405190808252806020026020018201604052801561160a5781602001602082028036833780820191505090505b50612a82565b5050505f600367ffffffffffffffff81111561162f5761162e614475565b5b60405190808252806020026020018201604052801561166257816020015b606081526020019060019003908161164d5790505b5090505f7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8890508073ffffffffffffffffffffffffffffffffffffffff16630c49ccbe6040518060a0016040528060165481526020018a6002015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020016103e8426117099190615103565b8152506040518263ffffffff1660e01b815260040161172891906151ed565b60408051808303815f875af1158015611743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117679190615206565b809950819a50505060115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a8154906fffffffffffffffffffffffffffffffff0219169055600382015f90555050600d5f8154809291906117f790615244565b919050555063fc6f786560e01b604051806080016040528060165481526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020018b6fffffffffffffffffffffffffffffffff1681526020018a6fffffffffffffffffffffffffffffffff1681525060405160240161187191906152cd565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050825f815181106118e1576118e061506e565b5b60200260200101819052506349404b7c60e01b5f33604051602401611907929190615334565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050826001815181106119785761197761506e565b5b602002602001018190525063df2ab5bb60e01b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f336040516024016119c19392919061535b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505082600281518110611a3257611a3161506e565b5b60200260200101819052507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663ac9650d8836040518263ffffffff1660e01b8152600401611a969190615493565b5f604051808303815f875af1158015611ab1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611ad99190615591565b5f81518110611aeb57611aea61506e565b5b6020026020010151806020019051810190611b069190615206565b809950819a505050505050505050509250929050565b600f81565b5f611b2a612afd565b905090565b7f00000000000000000000000000000000000000000183d3e95f01af549e542b2e81565b670de0b6b3a764000081565b60055481565b5f670de0b6b3a7640000600854611b7c9190614d78565b905090565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd9575f80fd5b611be234612f36565b3460185f828254611bf39190615103565b925050819055505f60115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f816001015403611c5d57600d5f815480929190611c57906155d8565b91905055505b34816001015f828254611c709190615103565b925050819055505f80611c8285612f67565b915091508385611c929190615103565b94508084611ca09190615103565b835f015f828254611cb19190615103565b9250508190555081836002015f8282829054906101000a90046fffffffffffffffffffffffffffffffff16611ce6919061561f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084836003015f828254611d2f9190615103565b9250508190555084600b5f828254611d479190615103565b925050819055506a013da329b633647180000083600301541115611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906156ac565b60405180910390fd5b611db35f875f8660030154600b54612b25565b50505050505050565b5f60115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f826001015490505f8214158015611e1b57505f8114155b611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906150e5565b60405180910390fd5b5f835f01819055505f83600101819055505f600167ffffffffffffffff811115611e8757611e86614475565b5b604051908082528060200260200182016040528015611eb55781602001602082028036833780820191505090505b5090505f600f541480611ec95750600f5442105b1561205957611ed78261347b565b8160185f828254611ee89190615136565b92505081905550611efa5f3384612ce7565b611f2560135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134ac565b8360030154600b5f828254611f3a9190615136565b92505081905550611f57335f80876003018190555f600b54612b25565b5060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f81518110611f8d57611f8c61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060115f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8082015f9055600182015f9055600282015f6101000a8154906fffffffffffffffffffffffffffffffff0219169055600382015f90555050600d5f81548092919061204f90615244565b91905055506120da565b6120d160135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633835f815181106120925761209161506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525085612ce7565b6120d961215a565b5b61212d33825f67ffffffffffffffff8111156120f9576120f8614475565b5b6040519080825280602002602001820160405280156121275781602001602082028036833780820191505090505b50612a82565b50505050505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b61216261289d565b61216a6138eb565b565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000bc5052b0aa6149fe86747cb7e99524f56fb6402a81565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6121f0600a5f9054906101000a900460ff16613937565b905090565b5f8073ffffffffffffffffffffffffffffffffffffffff1660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e575f80fd5b8160145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff163360135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905573ffffffffffffffffffffffffffffffffffffffff1610612327576001612329565b5f5b60ff1690507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff166313ead5625f8314612397577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612399565b335b600184146123c7577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26123c9565b335b7f00000000000000000000000000000000000000000000000000000000000027107f00000000000000000000000000000000000000000183d3e95f01af549e542b2e6040518563ffffffff1660e01b815260040161242a94939291906156ca565b6020604051808303815f875af1158015612446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246a9190615721565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055915050919050565b7f000000000000000000000000000000000000000000000000000000000000271081565b60035481565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612532575f80fd5b80600f819055505f61254e83856125499190615103565b612f67565b9150505f8111156125855761258460135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826134ac565b5b8360155f8282546125969190615103565b9250508190555083600b5f8282546125ae9190615103565b925050819055505f600167ffffffffffffffff8111156125d1576125d0614475565b5b6040519080825280602002602001820160405280156125ff5781602001602082028036833780820191505090505b5090506126805f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f8151811061263b5761263a61506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505f601554600b54612b25565b506126ee815f815181106126975761269661506e565b5b6020026020010151825f67ffffffffffffffff8111156126ba576126b9614475565b5b6040519080825280602002602001820160405280156126e85781602001602082028036833780820191505090505b50612a82565b5050505050505050565b612700612afd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614e02565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d290615796565b60405180910390fd5b6127e481612c5b565b50565b60175f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6011602052805f5260405f205f91509050805f015490806001015490806002015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060030154905084565b5f600f54141580156128b15750600f544210155b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e7906157fe565b60405180910390fd5b6128f86138eb565b5f6005541415801561290c57506005544210155b801561291b5750600160125414155b1561296f57600f5f600260125f8282546129359190614d78565b925050819055146129485760125461294b565b60015b6012819055622819a061295e919061581c565b6129689190614d78565b6002819055505b5f600167ffffffffffffffff81111561298b5761298a614475565b5b6040519080825280602002602001820160405280156129b95781602001602082028036833780820191505090505b509050612a7c60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16825f815181106129f4576129f361506e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250825f67ffffffffffffffff811115612a4857612a47614475565b5b604051908082528060200260200182016040528015612a765781602001602082028036833780820191505090505b50612a82565b50505050565b5f805f80600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050612add612ad46139bb565b5f83145f613a8e565b8093508194505050612af187828888613c7d565b93505093509350939050565b5f7fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe54905090565b5f612b31825f80613a8e565b50809150505f8067ffffffffffffffff811115612b5157612b50614475565b5b604051908082528060200260200182016040528015612b7f5781602001602082028036833780820191505090505b5090505f8067ffffffffffffffff811115612b9d57612b9c614475565b5b604051908082528060200260200182016040528015612bcb5781602001602082028036833780820191505090505b5090505f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614612c0f57612c0d88878484613c7d565b505b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614612c5057612c4e87868484613c7d565b505b505095945050505050565b5f612c64612afd565b9050817fdc6edb7e21c7d6802c30a4249460696aa4c6ef3b5aee9c59996f8fedc7fbaefe558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f810315612f31573073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315612f31575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612da457612d608282613e1d565b612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d96906158a7565b60405180910390fd5b612f31565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612de657612de183826134ac565b612f31565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401612e1a9291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e84919061591c565b5f604051808303815f865af19150503d805f8114612ebd576040519150601f19603f3d011682016040523d82523d5f602084013e612ec2565b606091505b5091509150818015612eef57505f81511480612eee575080806020019051810190612eed9190615967565b5b5b612f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f25906158a7565b60405180910390fd5b50505b505050565b612f5e670de0b6b3a764000082612f4d919061581c565b600854613e3190919063ffffffff16565b60088190555050565b5f805f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1610612fe5576001612fe7565b5f5b60ff16905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88866040518363ffffffff1660e01b81526004016130689291906158c5565b6020604051808303815f875af1158015613084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a89190615967565b505f805f83146130b9575f866130bc565b855f5b915091505f6016540361333a577f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663883164566040518061016001604052805f871461313e577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613161565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff168152602001600187146131aa577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26131cd565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000271062ffffff168152602001600e60149054906101000a900460020b60020b8152602001600e60179054906101000a900460020b60020b815260200185815260200184815260200161326e86601054670de0b6b3a76400006132699190615136565b613e89565b815260200161329285601054670de0b6b3a764000061328d9190615136565b613e89565b81526020013073ffffffffffffffffffffffffffffffffffffffff168152602001612710426132c19190615103565b8152506040518263ffffffff1660e01b81526004016132e09190615a8f565b6080604051808303815f875af11580156132fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133209190615ad3565b60165f829650839750849a50859190505550505050613457565b7f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8873ffffffffffffffffffffffffffffffffffffffff1663219f5d176040518060c0016040528060165481526020018581526020018481526020016133b486601054670de0b6b3a76400006133af9190615136565b613e89565b81526020016133d885601054670de0b6b3a76400006133d39190615136565b613e89565b8152602001612710426133eb9190615103565b8152506040518263ffffffff1660e01b815260040161340a9190615bb0565b6060604051808303815f875af1158015613426573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061344a9190615bc9565b8093508194508297505050505b5f83146134645780613466565b815b866134719190615136565b9350505050915091565b6134a3670de0b6b3a764000082613492919061581c565b600854613ecf90919063ffffffff16565b60088190555050565b5f808373ffffffffffffffffffffffffffffffffffffffff166342966c68846040516024016134db9190614788565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613529919061591c565b5f604051808303815f865af19150503d805f8114613562576040519150601f19603f3d011682016040523d82523d5f602084013e613567565b606091505b509150915081801561359457505f815114806135935750808060200190518101906135929190615967565b5b5b9150816136a9578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b5f856040516024016135cd9291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613637919061591c565b5f604051808303815f865af19150503d805f8114613670576040519150601f19603f3d011682016040523d82523d5f602084013e613675565b606091505b5080925081935050508180156136a657505f815114806136a55750808060200190518101906136a49190615967565b5b5b91505b816137be578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b61dead856040516024016136e29291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161374c919061591c565b5f604051808303815f865af19150503d805f8114613785576040519150601f19603f3d011682016040523d82523d5f602084013e61378a565b606091505b5080925081935050508180156137bb57505f815114806137ba5750808060200190518101906137b99190615967565b5b5b91505b816138e5578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b73deaddeaddeaddeaddeaddeaddeaddeaddeaddead856040516024016138099291906158c5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613873919061591c565b5f604051808303815f865af19150503d805f81146138ac576040519150601f19603f3d011682016040523d82523d5f602084013e6138b1565b606091505b5080925081935050508180156138e257505f815114806138e15750808060200190518101906138e09190615967565b5b5b91505b50505050565b5f60185490505f8114613934575f6018819055506139088161347b565b6139335f7f000000000000000000000000bc5052b0aa6149fe86747cb7e99524f56fb6402a83612ce7565b5b50565b5f600a5f9054906101000a900460ff168015613951575081155b6139b2576139ad60085461399f670de0b6b3a764000061399160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613f27565b613fe190919063ffffffff16565b613ecf90919063ffffffff16565b6139b4565b5f5b9050919050565b5f805f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613a84578073ffffffffffffffffffffffffffffffffffffffff16633f4676dc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7f9190615c19565b613a88565b600b545b91505090565b5f805f4290505f60095490505f60035490505f6004549050600554955060065494505f8614613b43575f868510613ac55786613ac7565b845b905088158015613ad757505f8414155b15613b41575f838310613aea5782613aec565b835b9050613b3285613b1789613b098587613ecf90919063ffffffff16565b613fe190919063ffffffff16565b613b219190614d78565b600754613e3190919063ffffffff16565b60078190555081600481905550505b505b886009819055508680613b565750858410155b80613b6057505f89145b15613c5b575f600854905084871115613bad57613baa613b9b87613b8d888b613ecf90919063ffffffff16565b613fe190919063ffffffff16565b82613ecf90919063ffffffff16565b90505b5f6004819055505f92505f96505f95505f613bc789613937565b90505f81118015613bd857505f8b14155b15613c33575f613bf4600f600254613fe190919063ffffffff16565b9050869450613c0c8284613e3190919063ffffffff16565b9250613c218188613e3190919063ffffffff16565b98508082613c2f9190614d78565b9750505b83600381905550816008819055508760058190555086600681905550613c588861404d565b50505b670de0b6b3a764000085613c6f9190614d78565b945050505050935093915050565b5f80600c5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060600160405290815f8201548152602001600182015481526020016002820154815250509050613d04613cf287614124565b825f0151613e3190919063ffffffff16565b815f01818152505084816040018181525050600754816020018181525050613d2c84846141d3565b15613db757670de0b6b3a7640000815f0151613d489190614d78565b91505f821115613db6575f613d85613d71670de0b6b3a764000085613fe190919063ffffffff16565b915081600854613ecf90919063ffffffff16565b600881905550613da181835f0151613ecf90919063ffffffff16565b825f018181525050613db4838686614322565b505b5b80600c5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015590505050949350505050565b5f805f805f85875af1506001905092915050565b5f828284613e3f9190615103565b9150811015613e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7a90615c8e565b60405180910390fd5b92915050565b5f670de0b6b3a764000080670de0b6b3a764000084613ea8919061581c565b613eb29190614d78565b84613ebd919061581c565b613ec79190614d78565b905092915050565b5f828284613edd9190615136565b9150811115613f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f1890615cf6565b60405180910390fd5b92915050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613fd8578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f949190614437565b602060405180830381865afa158015613faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd39190615c19565b613fda565b475b9050919050565b5f80821480614008575082828385613ff9919061581c565b9250826140069190614d78565b145b614047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403e90615d5e565b60405180910390fd5b92915050565b600a60019054906101000a900460ff16614121575f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461411f578073ffffffffffffffffffffffffffffffffffffffff1663d3f37d4e836040518263ffffffff1660e01b81526004016140f19190614788565b5f604051808303815f87803b158015614108575f80fd5b505af115801561411a573d5f803e3d5ffd5b505050505b505b50565b5f6141cc600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201546141be600c5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154600754613ecf90919063ffffffff16565b613fe190919063ffffffff16565b9050919050565b5f808351036141e4575f905061431c565b600183516141f29190615136565b825114614234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161422b90615dc6565b60405180910390fd5b5f670de0b6b3a764000090505f5b83518110156142d3575f84828151811061425f5761425e61506e565b5b602002602001015190505f811415801561427857508281105b6142b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142ae90615dc6565b60405180910390fd5b80836142c39190615136565b9250508080600101915050614242565b505f8103614316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161430d90615dc6565b60405180910390fd5b60019150505b92915050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8490505f5b83518110156143be575f61437b8786848151811061436e5761436d61506e565b5b6020026020010151613e89565b90506143a2848784815181106143945761439361506e565b5b602002602001015183612ce7565b80836143ae9190615136565b925050808060010191505061434d565b506143f18285600187516143d29190615136565b815181106143e3576143e261506e565b5b602002602001015183612ce7565b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614421826143f8565b9050919050565b61443181614417565b82525050565b5f60208201905061444a5f830184614428565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144ab82614465565b810181811067ffffffffffffffff821117156144ca576144c9614475565b5b80604052505050565b5f6144dc614450565b90506144e882826144a2565b919050565b5f67ffffffffffffffff82111561450757614506614475565b5b602082029050602081019050919050565b5f80fd5b61452581614417565b811461452f575f80fd5b50565b5f813590506145408161451c565b92915050565b5f614558614553846144ed565b6144d3565b9050808382526020820190506020840283018581111561457b5761457a614518565b5b835b818110156145a457806145908882614532565b84526020840193505060208101905061457d565b5050509392505050565b5f82601f8301126145c2576145c1614461565b5b81356145d2848260208601614546565b91505092915050565b5f67ffffffffffffffff8211156145f5576145f4614475565b5b602082029050602081019050919050565b5f819050919050565b61461881614606565b8114614622575f80fd5b50565b5f813590506146338161460f565b92915050565b5f61464b614646846145db565b6144d3565b9050808382526020820190506020840283018581111561466e5761466d614518565b5b835b8181101561469757806146838882614625565b845260208401935050602081019050614670565b5050509392505050565b5f82601f8301126146b5576146b4614461565b5b81356146c5848260208601614639565b91505092915050565b5f80604083850312156146e4576146e3614459565b5b5f83013567ffffffffffffffff8111156147015761470061445d565b5b61470d858286016145ae565b925050602083013567ffffffffffffffff81111561472e5761472d61445d565b5b61473a858286016146a1565b9150509250929050565b61474d81614606565b82525050565b5f6060820190506147665f830186614744565b6147736020830185614744565b6147806040830184614744565b949350505050565b5f60208201905061479b5f830184614744565b92915050565b5f80fd5b5f8083601f8401126147ba576147b9614461565b5b8235905067ffffffffffffffff8111156147d7576147d66147a1565b5b6020830191508360018202830111156147f3576147f2614518565b5b9250929050565b5f805f805f6080868803121561481357614812614459565b5b5f61482088828901614532565b955050602061483188828901614532565b945050604061484288828901614625565b935050606086013567ffffffffffffffff8111156148635761486261445d565b5b61486f888289016147a5565b92509250509295509295909350565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148b28161487e565b82525050565b5f6020820190506148cb5f8301846148a9565b92915050565b5f602082840312156148e6576148e5614459565b5b5f6148f384828501614625565b91505092915050565b5f6020828403121561491157614910614459565b5b5f61491e84828501614532565b91505092915050565b5f80fd5b5f67ffffffffffffffff82111561494557614944614475565b5b61494e82614465565b9050602081019050919050565b828183375f83830152505050565b5f61497b6149768461492b565b6144d3565b90508281526020810184848401111561499757614996614927565b5b6149a284828561495b565b509392505050565b5f82601f8301126149be576149bd614461565b5b81356149ce848260208601614969565b91505092915050565b5f602082840312156149ec576149eb614459565b5b5f82013567ffffffffffffffff811115614a0957614a0861445d565b5b614a15848285016149aa565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614a55578082015181840152602081019050614a3a565b5f8484015250505050565b5f614a6a82614a1e565b614a748185614a28565b9350614a84818560208601614a38565b614a8d81614465565b840191505092915050565b5f606082019050614aab5f830186614744565b614ab86020830185614744565b8181036040830152614aca8184614a60565b9050949350505050565b5f8160020b9050919050565b614ae981614ad4565b82525050565b5f602082019050614b025f830184614ae0565b92915050565b5f8060408385031215614b1e57614b1d614459565b5b5f614b2b85828601614625565b9250506020614b3c85828601614625565b9150509250929050565b5f604082019050614b595f830185614744565b614b666020830184614744565b9392505050565b614b76816143f8565b82525050565b5f602082019050614b8f5f830184614b6d565b92915050565b5f805f60608486031215614bac57614bab614459565b5b5f614bb986828701614532565b9350506020614bca86828701614625565b9250506040614bdb86828701614625565b9150509250925092565b5f62ffffff82169050919050565b614bfc81614be5565b82525050565b5f602082019050614c155f830184614bf3565b92915050565b5f805f60608486031215614c3257614c31614459565b5b5f614c3f86828701614625565b9350506020614c5086828701614625565b9250506040614c6186828701614625565b9150509250925092565b5f6fffffffffffffffffffffffffffffffff82169050919050565b614c8f81614c6b565b82525050565b5f608082019050614ca85f830187614744565b614cb56020830186614744565b614cc26040830185614c86565b614ccf6060830184614744565b95945050505050565b5f81905092915050565b5f614ced8385614cd8565b9350614cfa83858461495b565b82840190509392505050565b5f614d12828486614ce2565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614d8282614606565b9150614d8d83614606565b925082614d9d57614d9c614d1e565b5b828204905092915050565b5f82825260208201905092915050565b7f556e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f614dec600c83614da8565b9150614df782614db8565b602082019050919050565b5f6020820190508181035f830152614e1981614de0565b9050919050565b5f82825260208201905092915050565b5f614e3a82614a1e565b614e448185614e20565b9350614e54818560208601614a38565b614e5d81614465565b840191505092915050565b614e7181614417565b82525050565b614e8081614606565b82525050565b614e8f81614be5565b82525050565b5f610100820190508181035f830152614eae818b614e30565b9050614ebd602083018a614e68565b614eca6040830189614e68565b614ed76060830188614e68565b614ee46080830187614e77565b614ef160a0830186614e68565b614efe60c0830185614e86565b614f0b60e0830184614e68565b9998505050505050505050565b5f81519050614f268161460f565b92915050565b5f614f3e614f398461492b565b6144d3565b905082815260208101848484011115614f5a57614f59614927565b5b614f65848285614a38565b509392505050565b5f82601f830112614f8157614f80614461565b5b8151614f91848260208601614f2c565b91505092915050565b5f805f60608486031215614fb157614fb0614459565b5b5f614fbe86828701614f18565b9350506020614fcf86828701614f18565b925050604084015167ffffffffffffffff811115614ff057614fef61445d565b5b614ffc86828701614f6d565b9150509250925092565b7f756e617574686f72697a656400000000000000000000000000000000000000005f82015250565b5f61503a600c83614da8565b915061504582615006565b602082019050919050565b5f6020820190508181035f8301526150678161502e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f756e6b6e6f776e206163636f756e7400000000000000000000000000000000005f82015250565b5f6150cf600f83614da8565b91506150da8261509b565b602082019050919050565b5f6020820190508181035f8301526150fc816150c3565b9050919050565b5f61510d82614606565b915061511883614606565b92508282019050808211156151305761512f614d4b565b5b92915050565b5f61514082614606565b915061514b83614606565b925082820390508181111561516357615162614d4b565b5b92915050565b61517281614606565b82525050565b61518181614c6b565b82525050565b60a082015f82015161519b5f850182615169565b5060208201516151ae6020850182615178565b5060408201516151c16040850182615169565b5060608201516151d46060850182615169565b5060808201516151e76080850182615169565b50505050565b5f60a0820190506152005f830184615187565b92915050565b5f806040838503121561521c5761521b614459565b5b5f61522985828601614f18565b925050602061523a85828601614f18565b9150509250929050565b5f61524e82614606565b91505f82036152605761525f614d4b565b5b600182039050919050565b61527481614417565b82525050565b608082015f82015161528e5f850182615169565b5060208201516152a1602085018261526b565b5060408201516152b46040850182615178565b5060608201516152c76060850182615178565b50505050565b5f6080820190506152e05f83018461527a565b92915050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f61531e615319615314846152e6565b6152fb565b6152ef565b9050919050565b61532e81615304565b82525050565b5f6040820190506153475f830185615325565b6153546020830184614428565b9392505050565b5f60608201905061536e5f830186614428565b61537b6020830185615325565b6153886040830184614428565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6153d382614a1e565b6153dd81856153b9565b93506153ed818560208601614a38565b6153f681614465565b840191505092915050565b5f61540c83836153c9565b905092915050565b5f602082019050919050565b5f61542a82615390565b615434818561539a565b935083602082028501615446856153aa565b805f5b8581101561548157848403895281516154628582615401565b945061546d83615414565b925060208a01995050600181019050615449565b50829750879550505050505092915050565b5f6020820190508181035f8301526154ab8184615420565b905092915050565b5f67ffffffffffffffff8211156154cd576154cc614475565b5b602082029050602081019050919050565b5f6154f06154eb846154b3565b6144d3565b9050808382526020820190506020840283018581111561551357615512614518565b5b835b8181101561555a57805167ffffffffffffffff81111561553857615537614461565b5b8086016155458982614f6d565b85526020850194505050602081019050615515565b5050509392505050565b5f82601f83011261557857615577614461565b5b81516155888482602086016154de565b91505092915050565b5f602082840312156155a6576155a5614459565b5b5f82015167ffffffffffffffff8111156155c3576155c261445d565b5b6155cf84828501615564565b91505092915050565b5f6155e282614606565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361561457615613614d4b565b5b600182019050919050565b5f61562982614c6b565b915061563483614c6b565b925082820190506fffffffffffffffffffffffffffffffff81111561565c5761565b614d4b565b5b92915050565b7f416e74692d7768616c652073797374656d2061637469766500000000000000005f82015250565b5f615696601883614da8565b91506156a182615662565b602082019050919050565b5f6020820190508181035f8301526156c38161568a565b9050919050565b5f6080820190506156dd5f830187614428565b6156ea6020830186614428565b6156f76040830185614bf3565b6157046060830184614b6d565b95945050505050565b5f8151905061571b8161451c565b92915050565b5f6020828403121561573657615735614459565b5b5f6157438482850161570d565b91505092915050565b7f496e76616c6964000000000000000000000000000000000000000000000000005f82015250565b5f615780600783614da8565b915061578b8261574c565b602082019050919050565b5f6020820190508181035f8301526157ad81615774565b9050919050565b7f696e2076657374696e6720706572696f640000000000000000000000000000005f82015250565b5f6157e8601183614da8565b91506157f3826157b4565b602082019050919050565b5f6020820190508181035f830152615815816157dc565b9050919050565b5f61582682614606565b915061583183614606565b925082820261583f81614606565b9150828204841483151761585657615855614d4b565b5b5092915050565b7f4641524d494e473a205452414e534645525f4641494c454400000000000000005f82015250565b5f615891601883614da8565b915061589c8261585d565b602082019050919050565b5f6020820190508181035f8301526158be81615885565b9050919050565b5f6040820190506158d85f830185614428565b6158e56020830184614744565b9392505050565b5f6158f682614a1e565b6159008185614cd8565b9350615910818560208601614a38565b80840191505092915050565b5f61592782846158ec565b915081905092915050565b5f8115159050919050565b61594681615932565b8114615950575f80fd5b50565b5f815190506159618161593d565b92915050565b5f6020828403121561597c5761597b614459565b5b5f61598984828501615953565b91505092915050565b61599b81614be5565b82525050565b6159aa81614ad4565b82525050565b61016082015f8201516159c55f85018261526b565b5060208201516159d8602085018261526b565b5060408201516159eb6040850182615992565b5060608201516159fe60608501826159a1565b506080820151615a1160808501826159a1565b5060a0820151615a2460a0850182615169565b5060c0820151615a3760c0850182615169565b5060e0820151615a4a60e0850182615169565b50610100820151615a5f610100850182615169565b50610120820151615a7461012085018261526b565b50610140820151615a89610140850182615169565b50505050565b5f61016082019050615aa35f8301846159b0565b92915050565b615ab281614c6b565b8114615abc575f80fd5b50565b5f81519050615acd81615aa9565b92915050565b5f805f8060808587031215615aeb57615aea614459565b5b5f615af887828801614f18565b9450506020615b0987828801615abf565b9350506040615b1a87828801614f18565b9250506060615b2b87828801614f18565b91505092959194509250565b60c082015f820151615b4b5f850182615169565b506020820151615b5e6020850182615169565b506040820151615b716040850182615169565b506060820151615b846060850182615169565b506080820151615b976080850182615169565b5060a0820151615baa60a0850182615169565b50505050565b5f60c082019050615bc35f830184615b37565b92915050565b5f805f60608486031215615be057615bdf614459565b5b5f615bed86828701615abf565b9350506020615bfe86828701614f18565b9250506040615c0f86828701614f18565b9150509250925092565b5f60208284031215615c2e57615c2d614459565b5b5f615c3b84828501614f18565b91505092915050565b7f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000005f82015250565b5f615c78601483614da8565b9150615c8382615c44565b602082019050919050565b5f6020820190508181035f830152615ca581615c6c565b9050919050565b7f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000005f82015250565b5f615ce0601583614da8565b9150615ceb82615cac565b602082019050919050565b5f6020820190508181035f830152615d0d81615cd4565b9050919050565b7f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000005f82015250565b5f615d48601483614da8565b9150615d5382615d14565b602082019050919050565b5f6020820190508181035f830152615d7581615d3c565b9050919050565b7f70657263656e74616765000000000000000000000000000000000000000000005f82015250565b5f615db0600a83614da8565b9150615dbb82615d7c565b602082019050919050565b5f6020820190508181035f830152615ddd81615da4565b905091905056fea264697066735822122097acec69a57de94181cda30ab7ed6376a1914ac8baa163b7852f28988f3ec7d964736f6c63430008180033

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

0000000000000000000000005a46c3a544d160f39a96036a88ad09f95035a892000000000000000000000000bc5052b0aa6149fe86747cb7e99524f56fb6402a000000000000000000000000fad75c63c3817f1931357aec9a7736bb8067a1d90000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000183d3e95f01af549e542b2e000000000000000000000000000000000000000000000000006a94d74f430000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6f38ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4868

-----Decoded View---------------
Arg [0] : initialOwner (address): 0x5a46c3A544d160F39A96036A88ad09f95035A892
Arg [1] : _destinationAddress (address): 0xBC5052B0aa6149fe86747cb7e99524F56FB6402a
Arg [2] : _conversionAddress (address): 0xfAd75C63C3817f1931357AEc9A7736Bb8067a1d9
Arg [3] : _farmingDuration (uint256): 3
Arg [4] : _uniswapV3NonfungiblePositionsManager (address): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
Arg [5] : _uniswapV3SwapRouter (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [6] : _fee (uint24): 10000
Arg [7] : _sqrtPriceX96 (uint160): 468855016456061846625200942
Arg [8] : _priceSlippagePercentage (uint256): 30000000000000000
Arg [9] : _tickLower (int24): -102600
Arg [10] : _tickUpper (int24): -47000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a46c3a544d160f39a96036a88ad09f95035a892
Arg [1] : 000000000000000000000000bc5052b0aa6149fe86747cb7e99524f56fb6402a
Arg [2] : 000000000000000000000000fad75c63c3817f1931357aec9a7736bb8067a1d9
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88
Arg [5] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [7] : 00000000000000000000000000000000000000000183d3e95f01af549e542b2e
Arg [8] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [9] : fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6f38
Arg [10] : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4868


Libraries Used

TreasuryBootstrapRevenueShareLib : 0xca883a296fa19d0ce326caa8bc6de328bbf47cd8

Deployed Bytecode Sourcemap

30840:13271:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32947:10;:8;:10::i;:::-;30840:13271;;;;;31318:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37769:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;31713:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10452:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32973:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31407:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31866:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11089:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33166:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31820:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10863:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33300:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31938:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40874:425;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;31250:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10535:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31542:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31513;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37282:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31168:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1179:106;;;;;;;;;;;;;:::i;:::-;;30944:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38084:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;31571:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31604:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38410:2456;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;10315:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1079:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31469:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10263:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10572:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11328:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34042:1024;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35843:1241;;;;;;;;;;;;;:::i;:::-;;31369:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37182:92;;;;;;;;;;;;;:::i;:::-;;31781:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31200:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10373:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11751:151;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33487:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31435:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10503:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35074:761;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1293:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31897:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10419:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31752:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31651:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;24709:183;24785:1;24762:25;;:11;;;;;;;;;;;:25;;;24754:34;;;;;;24825:1;24818:9;;24807:20;;;:7;;;;:20;;;;24799:29;;;;;;24870:13;24857:8;;24847:19;;;;;;;:::i;:::-;;;;;;;;:36;24839:45;;;;;;24709:183::o;31318:44::-;;;:::o;37769:307::-;37905:21;37928:27;37957:23;37133:21;:19;:21::i;:::-;38000:68:::1;38013:10;38025:15;38042:25;38000:12;:68::i;:::-;37993:75;;;;;;37769:307:::0;;;;;:::o;31713:30::-;;;;:::o;10452:44::-;;;;:::o;32973:185::-;33062:6;33100:1;33089:7;;:12;33081:21;;;;;;33120:30;;;33113:37;;32973:185;;;;;;;:::o;31407:19::-;;;;;;;;;;;;;:::o;31866:22::-;;;;:::o;11089:113::-;11135:7;10304:4;11162:15;;:32;;;;:::i;:::-;11155:39;;11089:113;:::o;33166:126::-;310:8;:6;:8::i;:::-;296:22;;:10;:22;;;288:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;33276:8:::1;33250:23;:34;;;;33166:126:::0;:::o;31820:37::-;;;;:::o;10863:36::-;;;;:::o;33300:179::-;33375:16;310:8;:6;:8::i;:::-;296:22;;:10;:22;;;288:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;33415:17:::1;;;;;;;;;;;33404:28;;33463:8;33443:17;;:28;;;;;;;;;;;;;;;;;;33300:179:::0;;;:::o;31938:28::-;;;;:::o;40874:425::-;40942:24;40968;40994:29;41093:32;:44;41138:15;41155:36;41193:5;;;;;;;;;;;41200:4;41206:7;;41215:17;;;;;;;;;;;41234:3;41239:19;41093:166;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41036:223;;;;;;;;;;;;41270:21;:19;:21::i;:::-;40874:425;;;;;:::o;31250:61::-;;;:::o;10535:30::-;;;;:::o;31542:22::-;;;;;;;;;;;;;:::o;31513:::-;;;;;;;;;;;;;:::o;37282:479::-;37364:16;37133:21;:19;:21::i;:::-;37433:10:::1;37401:42;;37413:15;;;;;;;;;;;37402:26;;;37401:42;;;37393:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37489:8;37471:15;;:26;;;;;;;;;;;;;;;;;;37508:75;37514:8;37524;37534:1;37537:22;;37561:21;;37508:5;:75::i;:::-;;37594:32;37643:1;37629:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37594:51;;37677:8;37656:15;37672:1;37656:18;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;::::0;::::1;37696:57;37709:8;37719:15;37750:1;37736:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37696:12;:57::i;:::-;;;;37382:379;37282:479:::0;;;:::o;31168:23::-;;;;:::o;1179:106::-;310:8;:6;:8::i;:::-;296:22;;:10;:22;;;288:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1247:30:::1;1274:1;1247:18;:30::i;:::-;1179:106::o:0;30944:50::-;30987:7;30944:50;:::o;38084:318::-;38160:21;38183:27;38212:23;37133:21;:19;:21::i;:::-;38248:32:::1;38297:1;38283:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38248:51;;38317:77;38351:7;38330:15;38346:1;38330:18;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;38360:15:::1;38391:1;38377:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38317:12;:77::i;:::-;38310:84;;;;;;;38084:318:::0;;;;;:::o;31571:26::-;;;;:::o;31604:38::-;;;;:::o;38410:2456::-;38530:15;38547;37133:21;:19;:21::i;:::-;38575:40:::1;38618:10;:22;38629:10;38618:22;;;;;;;;;;;;;;;38575:65;;38697:1;38659:16;:34;;;;;;;;;;;;:39;;::::0;38651:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38729:20;38752:16;:29;;;38729:52;;38824:1;38792:16;:29;;:33;;;;38865:1;38836:16;:26;;:30;;;;38896:1;38880:12;:17;38877:95;;38914:46;38928:5;;;;;;;;;;;38935:10;38947:12;38914:13;:46::i;:::-;38877:95;38982:10;39016:17:::0;39070:1:::1;39051:15;;:20:::0;39048:282:::1;;39093:15;;;;;;;;;;;39088:20;;39149:16;:31;;;39123:22;;:57;;;;;;;:::i;:::-;;;;;;;;39207:22;;39195:34;;39048:282;;;39287:16;:31;;;39262:21;;:56;;;;;;;:::i;:::-;;;;;;;;39048:282;39340:92;39346:10;39358:2;39396:1;39362:16;:31;;:35;;;39399:9;39410:21;;39340:5;:92::i;:::-;;39443:32;39492:1;39478:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39443:51;;39526:10;39505:15;39521:1;39505:18;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;::::0;::::1;39547:59;39560:10;39572:15;39603:1;39589:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39547:12;:59::i;:::-;;;;39619:19;39653:1;39641:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39619:36;;39666:54;39751:36;39666:122;;39822:26;:44;;;39867:277;;;;;;;;39943:7;;39867:277;;;;39976:16;:34;;;;;;;;;;;;39867:277;;;;;;40037:10;39867:277;;;;40074:10;39867:277;;;;40128:4;40110:15;:22;;;;:::i;:::-;39867:277;;::::0;39822:323:::1;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39801:344;;;;;;;;40165:10;:22;40176:10;40165:22;;;;;;;;;;;;;;;;40158:29:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40198:8;;:10;;;;;;;;;:::i;:::-;;;;;;40254:43;;;40299:207;;;;;;;;40365:7;;40299:207;;;;40406:1;40299:207;;;;;;40443:7;40299:207;;;;;;40486:7;40299:207;;;;::::0;40231:276:::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40221:4;40226:1;40221:7;;;;;;;;:::i;:::-;;;;;;;:286;;;;40551:47;;;40600:1;40603:10;40528:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40518:4;40523:1;40518:7;;;;;;;;:::i;:::-;;;;;;;:96;;;;40658:46;;;40706:5;;;;;;;;;;;40713:1;40716:10;40635:92;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40625:4;40630:1;40625:7;;;;;;;;:::i;:::-;;;;;;;:102;;;;40781:36;40770:58;;;40829:4;40770:64;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40835:1;40770:67;;;;;;;;:::i;:::-;;;;;;;;40759:99;;;;;;;;;;;;:::i;:::-;40738:120;;;;;;;;38564:2302;;;;;;;38410:2456:::0;;;;;:::o;10315:49::-;10362:2;10315:49;:::o;1079:92::-;1128:7;1155:8;:6;:8::i;:::-;1148:15;;1079:92;:::o;31469:37::-;;;:::o;10263:45::-;10304:4;10263:45;:::o;10572:33::-;;;;:::o;11328:115::-;11375:7;10304:4;11402:16;;:33;;;;:::i;:::-;11395:40;;11328:115;:::o;34042:1024::-;34184:5;;;;;;;;;;;34170:19;;:10;:19;;;34162:28;;;;;;34203:35;34228:9;34203:24;:35::i;:::-;34266:9;34249:13;;:26;;;;;;;:::i;:::-;;;;;;;;34288:40;34331:10;:19;34342:7;34331:19;;;;;;;;;;;;;;;34288:62;;34394:1;34364:16;:26;;;:31;34361:73;;34412:8;;:10;;;;;;;;;:::i;:::-;;;;;;34361:73;34476:9;34446:16;:26;;;:39;;;;;;;:::i;:::-;;;;;;;;34499:17;34518:23;34545:32;34570:6;34545:24;:32::i;:::-;34498:79;;;;34600:12;34590:22;;;;;:::i;:::-;;;34673:15;34658:12;:30;;;;:::i;:::-;34625:16;:29;;;:63;;;;;;;:::i;:::-;;;;;;;;34737:9;34699:16;:34;;;:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34794:6;34759:16;:31;;;:41;;;;;;;:::i;:::-;;;;;;;;34836:6;34811:21;;:31;;;;;;;:::i;:::-;;;;;;;;9039:10;34861:16;:31;;;:70;;34853:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;34973:85;34987:1;34991:7;35000:1;35003:16;:31;;;35036:21;;34973:5;:85::i;:::-;;34149:917;;;34042:1024;;;:::o;35843:1241::-;35894:40;35937:10;:22;35948:10;35937:22;;;;;;;;;;;;;;;35894:65;;35970:20;35993:16;:29;;;35970:52;;36033:17;36053:16;:26;;;36033:46;;36114:1;36098:12;:17;;:35;;;;;36132:1;36119:9;:14;;36098:35;36090:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36196:1;36164:16;:29;;:33;;;;36237:1;36208:16;:26;;:30;;;;36249:32;36298:1;36284:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36249:51;;36329:1;36314:11;;:16;:49;;;;36352:11;;36334:15;:29;36314:49;36311:696;;;36380:35;36405:9;36380:24;:35::i;:::-;36447:9;36430:13;;:26;;;;;;;:::i;:::-;;;;;;;;36471:48;36493:1;36497:10;36509:9;36471:13;:48::i;:::-;36534:30;36544:5;;;;;;;;;;;36551:12;36534:9;:30::i;:::-;36604:16;:31;;;36579:21;;:56;;;;;;;:::i;:::-;;;;;;;;36650:92;36656:10;36676:1;36714;36680:16;:31;;:35;;;36717:1;36720:21;;36650:5;:92::i;:::-;;36778:15;;;;;;;;;;;36757;36773:1;36757:18;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;;36815:10;:22;36826:10;36815:22;;;;;;;;;;;;;;;;36808:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36852:8;;:10;;;;;;;;;:::i;:::-;;;;;;36311:696;;;36895:67;36909:5;;;;;;;;;;;36937:10;36916:15;36932:1;36916:18;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;;36949:12;36895:13;:67::i;:::-;36977:18;:16;:18::i;:::-;36311:696;37017:59;37030:10;37042:15;37073:1;37059:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37017:12;:59::i;:::-;;;;35883:1201;;;;35843:1241::o;31369:29::-;;;:::o;37182:92::-;37133:21;:19;:21::i;:::-;37247:19:::1;:17;:19::i;:::-;37182:92::o:0;31781:30::-;;;;;;;;;;;;;:::o;31200:43::-;;;:::o;10373:39::-;;;;;;;;;;;;:::o;11751:151::-;11813:20;11853:41;11883:10;;;;;;;;;;;11853:29;:41::i;:::-;11846:48;;11751:151;:::o;33487:547::-;33571:23;33632:1;33615:19;;:5;;;;;;;;;;;:19;;;33607:28;;;;;;33664:16;33646:15;;:34;;;;;;;;;;;;;;;;;;33691:21;33738:4;33715:27;;33724:10;33716:5;;:18;;;;;;;;;;;;;;;;;33715:27;;;:35;;33749:1;33715:35;;;33745:1;33715:35;33691:59;;;;33792:36;33775:89;;;33896:1;33879:13;:18;:38;;33913:4;33879:38;;;33900:10;33879:38;33949:1;33932:13;:18;:38;;33966:4;33932:38;;;33953:10;33932:38;33985:3;34003:12;33775:251;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33768:4;;:258;;;;;;;;;;;;;;;;;33761:265;;;33487:547;;;:::o;31435:27::-;;;:::o;10503:25::-;;;;:::o;35074:761::-;35226:5;;;;;;;;;;;35212:19;;:10;:19;;;35204:28;;;;;;35257:12;35243:11;:26;;;;35282:23;35309:63;35352:19;35334:15;:37;;;;:::i;:::-;35309:24;:63::i;:::-;35280:92;;;35404:1;35386:15;:19;35383:84;;;35422:33;35432:5;;;;;;;;;;;35439:15;35422:9;:33::i;:::-;35383:84;35505:15;35479:22;;:41;;;;;;;:::i;:::-;;;;;;;;35556:15;35531:21;;:40;;;;;;;:::i;:::-;;;;;;;;35582:32;35631:1;35617:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35582:51;;35644:105;35658:1;35683:15;;;;;;;;;;;35662;35678:1;35662:18;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;35700:1;35703:22;;35727:21;;35644:5;:105::i;:::-;;35760:67;35773:15;35789:1;35773:18;;;;;;;;:::i;:::-;;;;;;;;35793:15;35824:1;35810:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35760:12;:67::i;:::-;;;;35193:642;;35074:761;;;:::o;1293:173::-;310:8;:6;:8::i;:::-;296:22;;:10;:22;;;288:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1405:1:::1;1385:22;;:8;:22;;::::0;1377:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:28;1449:8;1430:18;:28::i;:::-;1293:173:::0;:::o;31897:32::-;;;;;;;;;;;;;:::o;10419:26::-;;;;;;;;;;;;;:::o;31752:20::-;;;;;;;;;;;;;:::o;31651:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43507:601::-;43580:1;43565:11;;:16;;:50;;;;;43604:11;;43585:15;:30;;43565:50;43557:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;43648:19;:17;:19::i;:::-;43703:1;43681:18;;:23;;:64;;;;;43727:18;;43708:15;:37;;43681:64;:88;;;;;43768:1;43749:15;;:20;;43681:88;43678:265;;;10362:2;43883:1;43877;43858:15;;:20;;;;;;;:::i;:::-;;;;;;;43857:27;:49;;43891:15;;43857:49;;;43887:1;43857:49;43839:15;:67;;;30987:7;43819:88;;;;:::i;:::-;43818:113;;;;:::i;:::-;43786:29;:145;;;;43678:265;43953:32;44002:1;43988:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43953:51;;44015:85;44049:15;;;;;;;;;;;44028;44044:1;44028:18;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;44066:15;44097:1;44083:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44015:12;:85::i;:::-;;;;43546:562;43507:601::o;11910:591::-;12044:21;12067:27;12096:23;12132:25;12160:10;:19;12171:7;12160:19;;;;;;;;;;;;;;;:40;;;12132:68;;12252:63;12266:14;:12;:14::i;:::-;12306:1;12282:20;:25;12309:5;12252:13;:63::i;:::-;12211:104;;;;;;;;12342:151;12370:7;12392:20;12427:15;12457:25;12342:13;:151::i;:::-;12326:167;;12121:380;11910:591;;;;;;;:::o;363:134::-;404:13;469:9;463:16;454:25;;363:134;:::o;12588:762::-;12808:27;12875:53;12889:24;12915:5;12922;12875:13;:53::i;:::-;12850:78;;;;;12941:36;12994:1;12980:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12941:55;;13007:46;13070:1;13056:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13007:65;;13105:1;13089:18;;:4;:18;;;13085:126;;13109:102;13123:4;13129:29;13160:19;13181:29;13109:13;:102::i;:::-;;13085:126;13240:1;13226:16;;:2;:16;;;13222:120;;13244:98;13258:2;13262:27;13291:19;13312:29;13244:13;:98::i;:::-;;13222:120;12837:513;;12588:762;;;;;;;:::o;1474:228::-;1539:16;1558:8;:6;:8::i;:::-;1539:27;;1619:8;1608:9;1601:27;1685:8;1654:40;;1675:8;1654:40;;;;;;;;;;;;1528:174;1474:228;:::o;20837:701::-;20941:1;20932:5;:10;20929:48;20959:7;20929:48;21004:4;20990:19;;:2;:19;;;20987:57;21026:7;20987:57;21081:1;21057:26;;:12;:26;;;21054:135;;21108:19;21117:2;21121:5;21108:8;:19::i;:::-;21100:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;21171:7;;21054:135;21216:1;21202:16;;:2;:16;;;21199:85;;21242:30;21252:12;21266:5;21242:9;:30::i;:::-;21235:37;;21199:85;21295:12;21309:17;21330:12;:17;;21371:41;;;21414:2;21418:5;21348:76;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21330:95;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21294:131;;;;21444:7;:57;;;;;21471:1;21456:4;:11;:16;:44;;;;21487:4;21476:24;;;;;;;;;;;;:::i;:::-;21456:44;21444:57;21436:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;20918:620;;20837:701;;;;:::o;11451:142::-;11540:45;10304:4;11561:6;:23;;;;:::i;:::-;11540:16;;:20;;:45;;;;:::i;:::-;11521:16;:64;;;;11451:142;:::o;41307:1881::-;41373:17;41392:23;41430:21;41462:4;41454:12;;:5;;;;;;;;;;;:12;;;:20;;41473:1;41454:20;;;41469:1;41454:20;41430:44;;;;41501:5;;;;;;;;;;;41487:28;;;41516:36;41554:6;41487:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41575:15;41592;41628:1;41611:13;:18;:64;;41664:1;41668:6;41611:64;;;41633:6;41649:1;41611:64;41574:101;;;;41702:1;41691:7;;:12;41688:1413;;41789:36;41761:70;;;41832:663;;;;;;;;41915:1;41898:13;:18;:33;;41927:4;41898:33;;;41919:5;;;;;;;;;;;41898:33;41832:663;;;;;;41975:1;41958:13;:18;:33;;41987:4;41958:33;;;41979:5;;;;;;;;;;;41958:33;41832:663;;;;;;42015:3;41832:663;;;;;;42048:9;;;;;;;;;;;41832:663;;;;;;42087:9;;;;;;;;;;;41832:663;;;;;;42131:7;41832:663;;;;42173:7;41832:663;;;;42211:71;42232:7;42258:23;;10304:4;42241:40;;;;:::i;:::-;42211:20;:71::i;:::-;41832:663;;;;42313:71;42334:7;42360:23;;10304:4;42343:40;;;;:::i;:::-;42313:20;:71::i;:::-;41832:663;;;;42422:4;41832:663;;;;;;42474:5;42456:15;:23;;;;:::i;:::-;41832:663;;;41761:735;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41721:7;;41720:776;;;;;;;;;;;;;;;;;;41688:1413;;;42589:36;42561:83;;;42645:443;;;;;;;;42725:7;;42645:443;;;;42767:7;42645:443;;;;42809:7;42645:443;;;;42847:71;42868:7;42894:23;;10304:4;42877:40;;;;:::i;:::-;42847:20;:71::i;:::-;42645:443;;;;42949:71;42970:7;42996:23;;10304:4;42979:40;;;;:::i;:::-;42949:20;:71::i;:::-;42645:443;;;;43067:5;43049:15;:23;;;;:::i;:::-;42645:443;;;42561:528;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42529:560;;;;;;;;;;;;41688:1413;43157:1;43140:13;:18;:38;;43171:7;43140:38;;;43161:7;43140:38;43130:6;:49;;;;:::i;:::-;43111:69;;41417:1771;;;41307:1881;;;:::o;11601:142::-;11690:45;10304:4;11711:6;:23;;;;:::i;:::-;11690:16;;:20;;:45;;;;:::i;:::-;11671:16;:64;;;;11601:142;:::o;21546:1199::-;21628:11;21641:23;21668:17;:22;;21714:10;21726:5;21691:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21668:65;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21627:106;;;;21768:6;:68;;;;;21800:1;21779:10;:17;:22;:56;;;;21816:10;21805:30;;;;;;;;;;;;:::i;:::-;21779:56;21768:68;21759:77;;21851:6;21847:269;;21897:17;:22;;21943:48;;;22001:1;22005:5;21920:91;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21897:115;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21874:138;;;;;;;;22036:6;:68;;;;;22068:1;22047:10;:17;:22;:56;;;;22084:10;22073:30;;;;;;;;;;;;:::i;:::-;22047:56;22036:68;22027:77;;21847:269;22130:6;22126:301;;22176:17;:22;;22222:48;;;22272:42;22316:5;22199:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22176:147;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22153:170;;;;;;;;22347:6;:68;;;;;22379:1;22358:10;:17;:22;:56;;;;22395:10;22384:30;;;;;;;;;;;;:::i;:::-;22358:56;22347:68;22338:77;;22126:301;22441:6;22437:301;;22487:17;:22;;22533:48;;;22583:42;22627:5;22510:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22487:147;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22464:170;;;;;;;;22658:6;:68;;;;;22690:1;22669:10;:17;:22;:56;;;;22706:10;22695:30;;;;;;;;;;;;:::i;:::-;22669:56;22658:68;22649:77;;22437:301;21616:1129;;21546:1199;;:::o;43196:303::-;43244:22;43269:13;;43244:38;;43314:1;43296:14;:19;43293:199;;43348:1;43332:13;:17;;;;43364:40;43389:14;43364:24;:40::i;:::-;43419:61;43441:1;43445:18;43465:14;43419:13;:61::i;:::-;43293:199;43233:266;43196:303::o;24062:222::-;24134:20;24182:10;;;;;;;;;;;:20;;;;;24197:5;24196:6;24182:20;:94;;24209:67;24259:16;;24210:43;10304:4;24210:23;24221:11;;;;;;;;;;;24210:10;:23::i;:::-;:27;;:43;;;;:::i;:::-;24209:49;;:67;;;;:::i;:::-;24182:94;;;24205:1;24182:94;24167:109;;24062:222;;;:::o;23757:297::-;23803:7;23823:33;23859:24;;;;;;;;;;23823:60;;23938:4;23901:42;;:25;:42;;;:145;;23996:25;23970:74;;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23901:145;;;23946:21;;23901:145;23894:152;;;23757:297;:::o;13661:3642::-;13761:27;13790:23;13947;13973:15;13947:41;;13999:40;14042:33;;13999:76;;14086:19;14108:10;;14086:32;;14129:24;14156:15;;14129:42;;14261:18;;14239:40;;14308:15;;14290:33;;14452:1;14429:19;:24;14426:788;;14470:20;14511:19;14493:15;:37;:77;;14551:19;14493:77;;;14533:15;14493:77;14470:100;;14797:7;14796:8;:49;;;;;14844:1;14808:32;:37;;14796:49;14793:410;;;14866:31;14919:11;14900:16;:30;:63;;14947:16;14900:63;;;14933:11;14900:63;14866:97;;15006:132;15105:32;15033:68;15085:15;15036:41;15053:23;15036:12;:16;;:41;;;;:::i;:::-;15033:51;;:68;;;;:::i;:::-;15032:105;;;;:::i;:::-;15006:21;;:25;;:132;;;;:::i;:::-;14982:21;:156;;;;15175:12;15157:15;:30;;;;14847:356;14793:410;14455:759;14426:788;15262:24;15226:33;:60;;;;15354:5;:47;;;;15382:19;15363:15;:38;;15354:47;:80;;;;15433:1;15405:24;:29;15354:80;15351:1668;;;15451:24;15478:16;;15451:43;;15537:15;15515:19;:37;15511:186;;;15592:89;15614:65;15663:15;15616:40;15640:15;15616:19;:23;;:40;;;;:::i;:::-;15614:48;;:65;;;;:::i;:::-;15592:16;:20;;:89;;;;:::i;:::-;15573:108;;15511:186;15811:1;15793:15;:19;;;;15900:1;15886:15;;15938:1;15916:23;;15972:1;15954:19;;15990:20;16013:36;16043:5;16013:29;:36::i;:::-;15990:59;;16220:1;16205:12;:16;:49;;;;;16253:1;16225:24;:29;;16205:49;16202:469;;;16275:34;16312:55;10362:2;16312:29;;:33;;:55;;;;:::i;:::-;16275:92;;16402:15;16388:29;;16455:34;16476:12;16455:16;:20;;:34;;;;:::i;:::-;16436:53;;16530:47;16550:26;16530:15;:19;;:47;;;;:::i;:::-;16508:69;;16629:26;16614:12;:41;;;;:::i;:::-;16596:59;;16256:415;16202:469;16776:11;16763:10;:24;;;;16821:16;16802;:35;;;;16873:19;16852:18;:40;;;;16925:15;16907;:33;;;;16957:48;16985:19;16957:27;:48::i;:::-;15436:1583;;15351:1668;10304:4;17261:15;:32;;;;:::i;:::-;17243:50;;13815:3488;;;;13661:3642;;;;;;:::o;17694:1580::-;17864:21;17898:31;17932:10;:19;17943:7;17932:19;;;;;;;;;;;;;;;17898:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18048:67;18081:33;18106:7;18081:24;:33::i;:::-;18048:8;:28;;;:32;;:67;;;;:::i;:::-;18017:8;:28;;:98;;;;;18158:25;18126:8;:29;;:57;;;;;18224:21;;18194:8;:27;;:51;;;;;18305:66;18328:15;18345:25;18305:22;:66::i;:::-;18301:858;;;10304:4;18495:8;:28;;;:45;;;;:::i;:::-;18479:61;;18577:1;18561:13;:17;18557:591;;;18599:21;18800:71;18837:33;10304:4;18837:13;:17;;:33;;;;:::i;:::-;18821:49;;;18800:16;;:20;;:71;;;;:::i;:::-;18781:16;:90;;;;18921:47;18954:13;18921:8;:28;;;:32;;:47;;;;:::i;:::-;18890:8;:28;;:78;;;;;19058:74;19074:13;19089:15;19106:25;19058:15;:74::i;:::-;18580:568;18557:591;18301:858;19258:8;19236:10;:19;19247:7;19236:19;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;17887:1387;17694:1580;;;;;;:::o;22753:187::-;22814:4;22898:1;22895;22892;22889;22882:5;22878:2;22871:5;22866:34;22840:71;22928:4;22921:11;;22753:187;;;;:::o;9437:128::-;9489:6;9531:1;9525;9521;:5;;;;:::i;:::-;9517:9;;;9516:16;;9508:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;9437:128;;;;:::o;20651:178::-;20739:7;20817:4;10304;20790;20777:10;:17;;;;:::i;:::-;20776:36;;;;:::i;:::-;20767:5;:46;;;;:::i;:::-;20766:55;;;;:::i;:::-;20759:62;;20651:178;;;;:::o;9573:129::-;9625:6;9667:1;9661;9657;:5;;;;:::i;:::-;9653:9;;;9652:16;;9644:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9573:129;;;;:::o;22948:201::-;23011:7;23062:1;23038:26;;:12;:26;;;:103;;23103:12;23091:35;;;23135:4;23091:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23038:103;;;23067:21;23038:103;23031:110;;22948:201;;;:::o;9710:142::-;9762:6;9794:1;9789;:6;:30;;;;9818:1;9813;9808;9804;:5;;;;:::i;:::-;9800:9;;;9799:15;;;;:::i;:::-;:20;9789:30;9781:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9710:142;;;;:::o;23157:592::-;23245:16;;;;;;;;;;;23278:7;23242:54;23368:33;23404:24;;;;;;;;;;;23368:60;;23593:25;23579:39;;:10;:39;;;23576:166;;23661:25;23635:74;;;23710:19;23635:95;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23576:166;23231:518;23157:592;;:::o;17376:229::-;17448:14;17484:113;17556:10;:19;17567:7;17556:19;;;;;;;;;;;;;;;:40;;;17485:65;17511:10;:19;17522:7;17511:19;;;;;;;;;;;;;;;:38;;;17485:21;;:25;;:65;;;;:::i;:::-;17484:71;;:113;;;;:::i;:::-;17475:122;;17376:229;;;:::o;19915:728::-;20046:4;20092:1;20066:15;:22;:27;20063:71;;20117:5;20110:12;;;;20063:71;20214:1;20189:15;:22;:26;;;;:::i;:::-;20152:25;:32;:64;20144:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;20242:23;10304:4;20242:40;;20297:9;20293:267;20316:25;:32;20312:1;:36;20293:267;;;20370:18;20391:25;20417:1;20391:28;;;;;;;;:::i;:::-;;;;;;;;20370:49;;20456:1;20442:10;:15;;:47;;;;;20474:15;20461:10;:28;20442:47;20434:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;20538:10;20519:29;;;;;:::i;:::-;;;20355:205;20350:3;;;;;;;20293:267;;;;20597:1;20578:15;:20;20570:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20631:4;20624:11;;;19915:728;;;;;:::o;19282:625::-;19427:20;19450:11;;;;;;;;;;;19427:34;;19472:23;19498:13;19472:39;;19526:9;19522:278;19545:25;:32;19541:1;:36;19522:278;;;19599:13;19615:65;19636:13;19651:25;19677:1;19651:28;;;;;;;;:::i;:::-;;;;;;;;19615:20;:65::i;:::-;19599:81;;19695:54;19709:12;19723:15;19739:1;19723:18;;;;;;;;:::i;:::-;;;;;;;;19743:5;19695:13;:54::i;:::-;19783:5;19764:24;;;;;:::i;:::-;;;19584:216;19579:3;;;;;;;19522:278;;;;19810:89;19824:12;19838:15;19879:1;19854:15;:22;:26;;;;:::i;:::-;19838:43;;;;;;;;:::i;:::-;;;;;;;;19883:15;19810:13;:89::i;:::-;19416:491;;19282:625;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:75::-;626:6;659:2;653:9;643:19;;593:75;:::o;674:117::-;783:1;780;773:12;797:117;906:1;903;896:12;920:117;1029:1;1026;1019:12;1043:102;1084:6;1135:2;1131:7;1126:2;1119:5;1115:14;1111:28;1101:38;;1043:102;;;:::o;1151:180::-;1199:77;1196:1;1189:88;1296:4;1293:1;1286:15;1320:4;1317:1;1310:15;1337:281;1420:27;1442:4;1420:27;:::i;:::-;1412:6;1408:40;1550:6;1538:10;1535:22;1514:18;1502:10;1499:34;1496:62;1493:88;;;1561:18;;:::i;:::-;1493:88;1601:10;1597:2;1590:22;1380:238;1337:281;;:::o;1624:129::-;1658:6;1685:20;;:::i;:::-;1675:30;;1714:33;1742:4;1734:6;1714:33;:::i;:::-;1624:129;;;:::o;1759:311::-;1836:4;1926:18;1918:6;1915:30;1912:56;;;1948:18;;:::i;:::-;1912:56;1998:4;1990:6;1986:17;1978:25;;2058:4;2052;2048:15;2040:23;;1759:311;;;:::o;2076:117::-;2185:1;2182;2175:12;2199:122;2272:24;2290:5;2272:24;:::i;:::-;2265:5;2262:35;2252:63;;2311:1;2308;2301:12;2252:63;2199:122;:::o;2327:139::-;2373:5;2411:6;2398:20;2389:29;;2427:33;2454:5;2427:33;:::i;:::-;2327:139;;;;:::o;2489:710::-;2585:5;2610:81;2626:64;2683:6;2626:64;:::i;:::-;2610:81;:::i;:::-;2601:90;;2711:5;2740:6;2733:5;2726:21;2774:4;2767:5;2763:16;2756:23;;2827:4;2819:6;2815:17;2807:6;2803:30;2856:3;2848:6;2845:15;2842:122;;;2875:79;;:::i;:::-;2842:122;2990:6;2973:220;3007:6;3002:3;2999:15;2973:220;;;3082:3;3111:37;3144:3;3132:10;3111:37;:::i;:::-;3106:3;3099:50;3178:4;3173:3;3169:14;3162:21;;3049:144;3033:4;3028:3;3024:14;3017:21;;2973:220;;;2977:21;2591:608;;2489:710;;;;;:::o;3222:370::-;3293:5;3342:3;3335:4;3327:6;3323:17;3319:27;3309:122;;3350:79;;:::i;:::-;3309:122;3467:6;3454:20;3492:94;3582:3;3574:6;3567:4;3559:6;3555:17;3492:94;:::i;:::-;3483:103;;3299:293;3222:370;;;;:::o;3598:311::-;3675:4;3765:18;3757:6;3754:30;3751:56;;;3787:18;;:::i;:::-;3751:56;3837:4;3829:6;3825:17;3817:25;;3897:4;3891;3887:15;3879:23;;3598:311;;;:::o;3915:77::-;3952:7;3981:5;3970:16;;3915:77;;;:::o;3998:122::-;4071:24;4089:5;4071:24;:::i;:::-;4064:5;4061:35;4051:63;;4110:1;4107;4100:12;4051:63;3998:122;:::o;4126:139::-;4172:5;4210:6;4197:20;4188:29;;4226:33;4253:5;4226:33;:::i;:::-;4126:139;;;;:::o;4288:710::-;4384:5;4409:81;4425:64;4482:6;4425:64;:::i;:::-;4409:81;:::i;:::-;4400:90;;4510:5;4539:6;4532:5;4525:21;4573:4;4566:5;4562:16;4555:23;;4626:4;4618:6;4614:17;4606:6;4602:30;4655:3;4647:6;4644:15;4641:122;;;4674:79;;:::i;:::-;4641:122;4789:6;4772:220;4806:6;4801:3;4798:15;4772:220;;;4881:3;4910:37;4943:3;4931:10;4910:37;:::i;:::-;4905:3;4898:50;4977:4;4972:3;4968:14;4961:21;;4848:144;4832:4;4827:3;4823:14;4816:21;;4772:220;;;4776:21;4390:608;;4288:710;;;;;:::o;5021:370::-;5092:5;5141:3;5134:4;5126:6;5122:17;5118:27;5108:122;;5149:79;;:::i;:::-;5108:122;5266:6;5253:20;5291:94;5381:3;5373:6;5366:4;5358:6;5354:17;5291:94;:::i;:::-;5282:103;;5098:293;5021:370;;;;:::o;5397:894::-;5515:6;5523;5572:2;5560:9;5551:7;5547:23;5543:32;5540:119;;;5578:79;;:::i;:::-;5540:119;5726:1;5715:9;5711:17;5698:31;5756:18;5748:6;5745:30;5742:117;;;5778:79;;:::i;:::-;5742:117;5883:78;5953:7;5944:6;5933:9;5929:22;5883:78;:::i;:::-;5873:88;;5669:302;6038:2;6027:9;6023:18;6010:32;6069:18;6061:6;6058:30;6055:117;;;6091:79;;:::i;:::-;6055:117;6196:78;6266:7;6257:6;6246:9;6242:22;6196:78;:::i;:::-;6186:88;;5981:303;5397:894;;;;;:::o;6297:118::-;6384:24;6402:5;6384:24;:::i;:::-;6379:3;6372:37;6297:118;;:::o;6421:442::-;6570:4;6608:2;6597:9;6593:18;6585:26;;6621:71;6689:1;6678:9;6674:17;6665:6;6621:71;:::i;:::-;6702:72;6770:2;6759:9;6755:18;6746:6;6702:72;:::i;:::-;6784;6852:2;6841:9;6837:18;6828:6;6784:72;:::i;:::-;6421:442;;;;;;:::o;6869:222::-;6962:4;7000:2;6989:9;6985:18;6977:26;;7013:71;7081:1;7070:9;7066:17;7057:6;7013:71;:::i;:::-;6869:222;;;;:::o;7097:117::-;7206:1;7203;7196:12;7233:552;7290:8;7300:6;7350:3;7343:4;7335:6;7331:17;7327:27;7317:122;;7358:79;;:::i;:::-;7317:122;7471:6;7458:20;7448:30;;7501:18;7493:6;7490:30;7487:117;;;7523:79;;:::i;:::-;7487:117;7637:4;7629:6;7625:17;7613:29;;7691:3;7683:4;7675:6;7671:17;7661:8;7657:32;7654:41;7651:128;;;7698:79;;:::i;:::-;7651:128;7233:552;;;;;:::o;7791:963::-;7888:6;7896;7904;7912;7920;7969:3;7957:9;7948:7;7944:23;7940:33;7937:120;;;7976:79;;:::i;:::-;7937:120;8096:1;8121:53;8166:7;8157:6;8146:9;8142:22;8121:53;:::i;:::-;8111:63;;8067:117;8223:2;8249:53;8294:7;8285:6;8274:9;8270:22;8249:53;:::i;:::-;8239:63;;8194:118;8351:2;8377:53;8422:7;8413:6;8402:9;8398:22;8377:53;:::i;:::-;8367:63;;8322:118;8507:2;8496:9;8492:18;8479:32;8538:18;8530:6;8527:30;8524:117;;;8560:79;;:::i;:::-;8524:117;8673:64;8729:7;8720:6;8709:9;8705:22;8673:64;:::i;:::-;8655:82;;;;8450:297;7791:963;;;;;;;;:::o;8760:149::-;8796:7;8836:66;8829:5;8825:78;8814:89;;8760:149;;;:::o;8915:115::-;9000:23;9017:5;9000:23;:::i;:::-;8995:3;8988:36;8915:115;;:::o;9036:218::-;9127:4;9165:2;9154:9;9150:18;9142:26;;9178:69;9244:1;9233:9;9229:17;9220:6;9178:69;:::i;:::-;9036:218;;;;:::o;9260:329::-;9319:6;9368:2;9356:9;9347:7;9343:23;9339:32;9336:119;;;9374:79;;:::i;:::-;9336:119;9494:1;9519:53;9564:7;9555:6;9544:9;9540:22;9519:53;:::i;:::-;9509:63;;9465:117;9260:329;;;;:::o;9595:::-;9654:6;9703:2;9691:9;9682:7;9678:23;9674:32;9671:119;;;9709:79;;:::i;:::-;9671:119;9829:1;9854:53;9899:7;9890:6;9879:9;9875:22;9854:53;:::i;:::-;9844:63;;9800:117;9595:329;;;;:::o;9930:117::-;10039:1;10036;10029:12;10053:307;10114:4;10204:18;10196:6;10193:30;10190:56;;;10226:18;;:::i;:::-;10190:56;10264:29;10286:6;10264:29;:::i;:::-;10256:37;;10348:4;10342;10338:15;10330:23;;10053:307;;;:::o;10366:146::-;10463:6;10458:3;10453;10440:30;10504:1;10495:6;10490:3;10486:16;10479:27;10366:146;;;:::o;10518:423::-;10595:5;10620:65;10636:48;10677:6;10636:48;:::i;:::-;10620:65;:::i;:::-;10611:74;;10708:6;10701:5;10694:21;10746:4;10739:5;10735:16;10784:3;10775:6;10770:3;10766:16;10763:25;10760:112;;;10791:79;;:::i;:::-;10760:112;10881:54;10928:6;10923:3;10918;10881:54;:::i;:::-;10601:340;10518:423;;;;;:::o;10960:338::-;11015:5;11064:3;11057:4;11049:6;11045:17;11041:27;11031:122;;11072:79;;:::i;:::-;11031:122;11189:6;11176:20;11214:78;11288:3;11280:6;11273:4;11265:6;11261:17;11214:78;:::i;:::-;11205:87;;11021:277;10960:338;;;;:::o;11304:507::-;11372:6;11421:2;11409:9;11400:7;11396:23;11392:32;11389:119;;;11427:79;;:::i;:::-;11389:119;11575:1;11564:9;11560:17;11547:31;11605:18;11597:6;11594:30;11591:117;;;11627:79;;:::i;:::-;11591:117;11732:62;11786:7;11777:6;11766:9;11762:22;11732:62;:::i;:::-;11722:72;;11518:286;11304:507;;;;:::o;11817:98::-;11868:6;11902:5;11896:12;11886:22;;11817:98;;;:::o;11921:168::-;12004:11;12038:6;12033:3;12026:19;12078:4;12073:3;12069:14;12054:29;;11921:168;;;;:::o;12095:246::-;12176:1;12186:113;12200:6;12197:1;12194:13;12186:113;;;12285:1;12280:3;12276:11;12270:18;12266:1;12261:3;12257:11;12250:39;12222:2;12219:1;12215:10;12210:15;;12186:113;;;12333:1;12324:6;12319:3;12315:16;12308:27;12157:184;12095:246;;;:::o;12347:373::-;12433:3;12461:38;12493:5;12461:38;:::i;:::-;12515:70;12578:6;12573:3;12515:70;:::i;:::-;12508:77;;12594:65;12652:6;12647:3;12640:4;12633:5;12629:16;12594:65;:::i;:::-;12684:29;12706:6;12684:29;:::i;:::-;12679:3;12675:39;12668:46;;12437:283;12347:373;;;;:::o;12726:529::-;12893:4;12931:2;12920:9;12916:18;12908:26;;12944:71;13012:1;13001:9;12997:17;12988:6;12944:71;:::i;:::-;13025:72;13093:2;13082:9;13078:18;13069:6;13025:72;:::i;:::-;13144:9;13138:4;13134:20;13129:2;13118:9;13114:18;13107:48;13172:76;13243:4;13234:6;13172:76;:::i;:::-;13164:84;;12726:529;;;;;;:::o;13261:90::-;13296:7;13339:5;13336:1;13325:20;13314:31;;13261:90;;;:::o;13357:112::-;13440:22;13456:5;13440:22;:::i;:::-;13435:3;13428:35;13357:112;;:::o;13475:214::-;13564:4;13602:2;13591:9;13587:18;13579:26;;13615:67;13679:1;13668:9;13664:17;13655:6;13615:67;:::i;:::-;13475:214;;;;:::o;13695:474::-;13763:6;13771;13820:2;13808:9;13799:7;13795:23;13791:32;13788:119;;;13826:79;;:::i;:::-;13788:119;13946:1;13971:53;14016:7;14007:6;13996:9;13992:22;13971:53;:::i;:::-;13961:63;;13917:117;14073:2;14099:53;14144:7;14135:6;14124:9;14120:22;14099:53;:::i;:::-;14089:63;;14044:118;13695:474;;;;;:::o;14175:332::-;14296:4;14334:2;14323:9;14319:18;14311:26;;14347:71;14415:1;14404:9;14400:17;14391:6;14347:71;:::i;:::-;14428:72;14496:2;14485:9;14481:18;14472:6;14428:72;:::i;:::-;14175:332;;;;;:::o;14513:118::-;14600:24;14618:5;14600:24;:::i;:::-;14595:3;14588:37;14513:118;;:::o;14637:222::-;14730:4;14768:2;14757:9;14753:18;14745:26;;14781:71;14849:1;14838:9;14834:17;14825:6;14781:71;:::i;:::-;14637:222;;;;:::o;14865:619::-;14942:6;14950;14958;15007:2;14995:9;14986:7;14982:23;14978:32;14975:119;;;15013:79;;:::i;:::-;14975:119;15133:1;15158:53;15203:7;15194:6;15183:9;15179:22;15158:53;:::i;:::-;15148:63;;15104:117;15260:2;15286:53;15331:7;15322:6;15311:9;15307:22;15286:53;:::i;:::-;15276:63;;15231:118;15388:2;15414:53;15459:7;15450:6;15439:9;15435:22;15414:53;:::i;:::-;15404:63;;15359:118;14865:619;;;;;:::o;15490:91::-;15526:7;15566:8;15559:5;15555:20;15544:31;;15490:91;;;:::o;15587:115::-;15672:23;15689:5;15672:23;:::i;:::-;15667:3;15660:36;15587:115;;:::o;15708:218::-;15799:4;15837:2;15826:9;15822:18;15814:26;;15850:69;15916:1;15905:9;15901:17;15892:6;15850:69;:::i;:::-;15708:218;;;;:::o;15932:619::-;16009:6;16017;16025;16074:2;16062:9;16053:7;16049:23;16045:32;16042:119;;;16080:79;;:::i;:::-;16042:119;16200:1;16225:53;16270:7;16261:6;16250:9;16246:22;16225:53;:::i;:::-;16215:63;;16171:117;16327:2;16353:53;16398:7;16389:6;16378:9;16374:22;16353:53;:::i;:::-;16343:63;;16298:118;16455:2;16481:53;16526:7;16517:6;16506:9;16502:22;16481:53;:::i;:::-;16471:63;;16426:118;15932:619;;;;;:::o;16557:118::-;16594:7;16634:34;16627:5;16623:46;16612:57;;16557:118;;;:::o;16681:::-;16768:24;16786:5;16768:24;:::i;:::-;16763:3;16756:37;16681:118;;:::o;16805:553::-;16982:4;17020:3;17009:9;17005:19;16997:27;;17034:71;17102:1;17091:9;17087:17;17078:6;17034:71;:::i;:::-;17115:72;17183:2;17172:9;17168:18;17159:6;17115:72;:::i;:::-;17197;17265:2;17254:9;17250:18;17241:6;17197:72;:::i;:::-;17279;17347:2;17336:9;17332:18;17323:6;17279:72;:::i;:::-;16805:553;;;;;;;:::o;17364:147::-;17465:11;17502:3;17487:18;;17364:147;;;;:::o;17539:327::-;17653:3;17674:88;17755:6;17750:3;17674:88;:::i;:::-;17667:95;;17772:56;17821:6;17816:3;17809:5;17772:56;:::i;:::-;17853:6;17848:3;17844:16;17837:23;;17539:327;;;;;:::o;17872:291::-;18012:3;18034:103;18133:3;18124:6;18116;18034:103;:::i;:::-;18027:110;;18154:3;18147:10;;17872:291;;;;;:::o;18169:180::-;18217:77;18214:1;18207:88;18314:4;18311:1;18304:15;18338:4;18335:1;18328:15;18355:180;18403:77;18400:1;18393:88;18500:4;18497:1;18490:15;18524:4;18521:1;18514:15;18541:185;18581:1;18598:20;18616:1;18598:20;:::i;:::-;18593:25;;18632:20;18650:1;18632:20;:::i;:::-;18627:25;;18671:1;18661:35;;18676:18;;:::i;:::-;18661:35;18718:1;18715;18711:9;18706:14;;18541:185;;;;:::o;18732:169::-;18816:11;18850:6;18845:3;18838:19;18890:4;18885:3;18881:14;18866:29;;18732:169;;;;:::o;18907:162::-;19047:14;19043:1;19035:6;19031:14;19024:38;18907:162;:::o;19075:366::-;19217:3;19238:67;19302:2;19297:3;19238:67;:::i;:::-;19231:74;;19314:93;19403:3;19314:93;:::i;:::-;19432:2;19427:3;19423:12;19416:19;;19075:366;;;:::o;19447:419::-;19613:4;19651:2;19640:9;19636:18;19628:26;;19700:9;19694:4;19690:20;19686:1;19675:9;19671:17;19664:47;19728:131;19854:4;19728:131;:::i;:::-;19720:139;;19447:419;;;:::o;19872:176::-;19963:11;19997:6;19992:3;19985:19;20037:4;20032:3;20028:14;20013:29;;19872:176;;;;:::o;20054:389::-;20148:3;20176:38;20208:5;20176:38;:::i;:::-;20230:78;20301:6;20296:3;20230:78;:::i;:::-;20223:85;;20317:65;20375:6;20370:3;20363:4;20356:5;20352:16;20317:65;:::i;:::-;20407:29;20429:6;20407:29;:::i;:::-;20402:3;20398:39;20391:46;;20152:291;20054:389;;;;:::o;20449:126::-;20544:24;20562:5;20544:24;:::i;:::-;20539:3;20532:37;20449:126;;:::o;20581:::-;20676:24;20694:5;20676:24;:::i;:::-;20671:3;20664:37;20581:126;;:::o;20713:123::-;20806:23;20823:5;20806:23;:::i;:::-;20801:3;20794:36;20713:123;;:::o;20842:1152::-;21155:4;21193:3;21182:9;21178:19;21170:27;;21243:9;21237:4;21233:20;21229:1;21218:9;21214:17;21207:47;21271:84;21350:4;21341:6;21271:84;:::i;:::-;21263:92;;21365:80;21441:2;21430:9;21426:18;21417:6;21365:80;:::i;:::-;21455;21531:2;21520:9;21516:18;21507:6;21455:80;:::i;:::-;21545;21621:2;21610:9;21606:18;21597:6;21545:80;:::i;:::-;21635:81;21711:3;21700:9;21696:19;21687:6;21635:81;:::i;:::-;21726;21802:3;21791:9;21787:19;21778:6;21726:81;:::i;:::-;21817:79;21891:3;21880:9;21876:19;21867:6;21817:79;:::i;:::-;21906:81;21982:3;21971:9;21967:19;21958:6;21906:81;:::i;:::-;20842:1152;;;;;;;;;;;:::o;22000:143::-;22057:5;22088:6;22082:13;22073:22;;22104:33;22131:5;22104:33;:::i;:::-;22000:143;;;;:::o;22149:432::-;22237:5;22262:65;22278:48;22319:6;22278:48;:::i;:::-;22262:65;:::i;:::-;22253:74;;22350:6;22343:5;22336:21;22388:4;22381:5;22377:16;22426:3;22417:6;22412:3;22408:16;22405:25;22402:112;;;22433:79;;:::i;:::-;22402:112;22523:52;22568:6;22563:3;22558;22523:52;:::i;:::-;22243:338;22149:432;;;;;:::o;22600:353::-;22666:5;22715:3;22708:4;22700:6;22696:17;22692:27;22682:122;;22723:79;;:::i;:::-;22682:122;22833:6;22827:13;22858:89;22943:3;22935:6;22928:4;22920:6;22916:17;22858:89;:::i;:::-;22849:98;;22672:281;22600:353;;;;:::o;22959:834::-;23056:6;23064;23072;23121:2;23109:9;23100:7;23096:23;23092:32;23089:119;;;23127:79;;:::i;:::-;23089:119;23247:1;23272:64;23328:7;23319:6;23308:9;23304:22;23272:64;:::i;:::-;23262:74;;23218:128;23385:2;23411:64;23467:7;23458:6;23447:9;23443:22;23411:64;:::i;:::-;23401:74;;23356:129;23545:2;23534:9;23530:18;23524:25;23576:18;23568:6;23565:30;23562:117;;;23598:79;;:::i;:::-;23562:117;23703:73;23768:7;23759:6;23748:9;23744:22;23703:73;:::i;:::-;23693:83;;23495:291;22959:834;;;;;:::o;23799:162::-;23939:14;23935:1;23927:6;23923:14;23916:38;23799:162;:::o;23967:366::-;24109:3;24130:67;24194:2;24189:3;24130:67;:::i;:::-;24123:74;;24206:93;24295:3;24206:93;:::i;:::-;24324:2;24319:3;24315:12;24308:19;;23967:366;;;:::o;24339:419::-;24505:4;24543:2;24532:9;24528:18;24520:26;;24592:9;24586:4;24582:20;24578:1;24567:9;24563:17;24556:47;24620:131;24746:4;24620:131;:::i;:::-;24612:139;;24339:419;;;:::o;24764:180::-;24812:77;24809:1;24802:88;24909:4;24906:1;24899:15;24933:4;24930:1;24923:15;24950:165;25090:17;25086:1;25078:6;25074:14;25067:41;24950:165;:::o;25121:366::-;25263:3;25284:67;25348:2;25343:3;25284:67;:::i;:::-;25277:74;;25360:93;25449:3;25360:93;:::i;:::-;25478:2;25473:3;25469:12;25462:19;;25121:366;;;:::o;25493:419::-;25659:4;25697:2;25686:9;25682:18;25674:26;;25746:9;25740:4;25736:20;25732:1;25721:9;25717:17;25710:47;25774:131;25900:4;25774:131;:::i;:::-;25766:139;;25493:419;;;:::o;25918:191::-;25958:3;25977:20;25995:1;25977:20;:::i;:::-;25972:25;;26011:20;26029:1;26011:20;:::i;:::-;26006:25;;26054:1;26051;26047:9;26040:16;;26075:3;26072:1;26069:10;26066:36;;;26082:18;;:::i;:::-;26066:36;25918:191;;;;:::o;26115:194::-;26155:4;26175:20;26193:1;26175:20;:::i;:::-;26170:25;;26209:20;26227:1;26209:20;:::i;:::-;26204:25;;26253:1;26250;26246:9;26238:17;;26277:1;26271:4;26268:11;26265:37;;;26282:18;;:::i;:::-;26265:37;26115:194;;;;:::o;26315:108::-;26392:24;26410:5;26392:24;:::i;:::-;26387:3;26380:37;26315:108;;:::o;26429:::-;26506:24;26524:5;26506:24;:::i;:::-;26501:3;26494:37;26429:108;;:::o;26671:1083::-;26848:4;26843:3;26839:14;26938:4;26931:5;26927:16;26921:23;26957:63;27014:4;27009:3;27005:14;26991:12;26957:63;:::i;:::-;26863:167;27117:4;27110:5;27106:16;27100:23;27136:63;27193:4;27188:3;27184:14;27170:12;27136:63;:::i;:::-;27040:169;27297:4;27290:5;27286:16;27280:23;27316:63;27373:4;27368:3;27364:14;27350:12;27316:63;:::i;:::-;27219:170;27477:4;27470:5;27466:16;27460:23;27496:63;27553:4;27548:3;27544:14;27530:12;27496:63;:::i;:::-;27399:170;27655:4;27648:5;27644:16;27638:23;27674:63;27731:4;27726:3;27722:14;27708:12;27674:63;:::i;:::-;27579:168;26817:937;26671:1083;;:::o;27760:383::-;27933:4;27971:3;27960:9;27956:19;27948:27;;27985:151;28133:1;28122:9;28118:17;28109:6;27985:151;:::i;:::-;27760:383;;;;:::o;28149:507::-;28228:6;28236;28285:2;28273:9;28264:7;28260:23;28256:32;28253:119;;;28291:79;;:::i;:::-;28253:119;28411:1;28436:64;28492:7;28483:6;28472:9;28468:22;28436:64;:::i;:::-;28426:74;;28382:128;28549:2;28575:64;28631:7;28622:6;28611:9;28607:22;28575:64;:::i;:::-;28565:74;;28520:129;28149:507;;;;;:::o;28662:171::-;28701:3;28724:24;28742:5;28724:24;:::i;:::-;28715:33;;28770:4;28763:5;28760:15;28757:41;;28778:18;;:::i;:::-;28757:41;28825:1;28818:5;28814:13;28807:20;;28662:171;;;:::o;28839:108::-;28916:24;28934:5;28916:24;:::i;:::-;28911:3;28904:37;28839:108;;:::o;29061:885::-;29218:4;29213:3;29209:14;29308:4;29301:5;29297:16;29291:23;29327:63;29384:4;29379:3;29375:14;29361:12;29327:63;:::i;:::-;29233:167;29487:4;29480:5;29476:16;29470:23;29506:63;29563:4;29558:3;29554:14;29540:12;29506:63;:::i;:::-;29410:169;29667:4;29660:5;29656:16;29650:23;29686:63;29743:4;29738:3;29734:14;29720:12;29686:63;:::i;:::-;29589:170;29847:4;29840:5;29836:16;29830:23;29866:63;29923:4;29918:3;29914:14;29900:12;29866:63;:::i;:::-;29769:170;29187:759;29061:885;;:::o;29952:343::-;30105:4;30143:3;30132:9;30128:19;30120:27;;30157:131;30285:1;30274:9;30270:17;30261:6;30157:131;:::i;:::-;29952:343;;;;:::o;30301:85::-;30346:7;30375:5;30364:16;;30301:85;;;:::o;30392:86::-;30427:7;30467:4;30460:5;30456:16;30445:27;;30392:86;;;:::o;30484:60::-;30512:3;30533:5;30526:12;;30484:60;;;:::o;30550:154::-;30606:9;30639:59;30655:42;30664:32;30690:5;30664:32;:::i;:::-;30655:42;:::i;:::-;30639:59;:::i;:::-;30626:72;;30550:154;;;:::o;30710:143::-;30803:43;30840:5;30803:43;:::i;:::-;30798:3;30791:56;30710:143;;:::o;30859:344::-;30986:4;31024:2;31013:9;31009:18;31001:26;;31037:77;31111:1;31100:9;31096:17;31087:6;31037:77;:::i;:::-;31124:72;31192:2;31181:9;31177:18;31168:6;31124:72;:::i;:::-;30859:344;;;;;:::o;31209:454::-;31364:4;31402:2;31391:9;31387:18;31379:26;;31415:71;31483:1;31472:9;31468:17;31459:6;31415:71;:::i;:::-;31496:78;31570:2;31559:9;31555:18;31546:6;31496:78;:::i;:::-;31584:72;31652:2;31641:9;31637:18;31628:6;31584:72;:::i;:::-;31209:454;;;;;;:::o;31669:123::-;31745:6;31779:5;31773:12;31763:22;;31669:123;;;:::o;31798:193::-;31906:11;31940:6;31935:3;31928:19;31980:4;31975:3;31971:14;31956:29;;31798:193;;;;:::o;31997:141::-;32073:4;32096:3;32088:11;;32126:4;32121:3;32117:14;32109:22;;31997:141;;;:::o;32144:158::-;32217:11;32251:6;32246:3;32239:19;32291:4;32286:3;32282:14;32267:29;;32144:158;;;;:::o;32308:353::-;32384:3;32412:38;32444:5;32412:38;:::i;:::-;32466:60;32519:6;32514:3;32466:60;:::i;:::-;32459:67;;32535:65;32593:6;32588:3;32581:4;32574:5;32570:16;32535:65;:::i;:::-;32625:29;32647:6;32625:29;:::i;:::-;32620:3;32616:39;32609:46;;32388:273;32308:353;;;;:::o;32667:192::-;32754:10;32789:64;32849:3;32841:6;32789:64;:::i;:::-;32775:78;;32667:192;;;;:::o;32865:122::-;32944:4;32976;32971:3;32967:14;32959:22;;32865:122;;;:::o;33019:983::-;33156:3;33185:63;33242:5;33185:63;:::i;:::-;33264:95;33352:6;33347:3;33264:95;:::i;:::-;33257:102;;33385:3;33430:4;33422:6;33418:17;33413:3;33409:27;33460:65;33519:5;33460:65;:::i;:::-;33548:7;33579:1;33564:393;33589:6;33586:1;33583:13;33564:393;;;33660:9;33654:4;33650:20;33645:3;33638:33;33711:6;33705:13;33739:82;33816:4;33801:13;33739:82;:::i;:::-;33731:90;;33844:69;33906:6;33844:69;:::i;:::-;33834:79;;33942:4;33937:3;33933:14;33926:21;;33624:333;33611:1;33608;33604:9;33599:14;;33564:393;;;33568:14;33973:4;33966:11;;33993:3;33986:10;;33161:841;;;;;33019:983;;;;:::o;34008:409::-;34169:4;34207:2;34196:9;34192:18;34184:26;;34256:9;34250:4;34246:20;34242:1;34231:9;34227:17;34220:47;34284:126;34405:4;34396:6;34284:126;:::i;:::-;34276:134;;34008:409;;;;:::o;34423:320::-;34509:4;34599:18;34591:6;34588:30;34585:56;;;34621:18;;:::i;:::-;34585:56;34671:4;34663:6;34659:17;34651:25;;34731:4;34725;34721:15;34713:23;;34423:320;;;:::o;34764:957::-;34880:5;34905:90;34921:73;34987:6;34921:73;:::i;:::-;34905:90;:::i;:::-;34896:99;;35015:5;35044:6;35037:5;35030:21;35078:4;35071:5;35067:16;35060:23;;35131:4;35123:6;35119:17;35111:6;35107:30;35160:3;35152:6;35149:15;35146:122;;;35179:79;;:::i;:::-;35146:122;35294:6;35277:438;35311:6;35306:3;35303:15;35277:438;;;35393:3;35387:10;35429:18;35416:11;35413:35;35410:122;;;35451:79;;:::i;:::-;35410:122;35575:11;35567:6;35563:24;35613:57;35666:3;35654:10;35613:57;:::i;:::-;35608:3;35601:70;35700:4;35695:3;35691:14;35684:21;;35353:362;;35337:4;35332:3;35328:14;35321:21;;35277:438;;;35281:21;34886:835;;34764:957;;;;;:::o;35742:403::-;35833:5;35882:3;35875:4;35867:6;35863:17;35859:27;35849:122;;35890:79;;:::i;:::-;35849:122;36000:6;35994:13;36025:114;36135:3;36127:6;36120:4;36112:6;36108:17;36025:114;:::i;:::-;36016:123;;35839:306;35742:403;;;;:::o;36151:572::-;36255:6;36304:2;36292:9;36283:7;36279:23;36275:32;36272:119;;;36310:79;;:::i;:::-;36272:119;36451:1;36440:9;36436:17;36430:24;36481:18;36473:6;36470:30;36467:117;;;36503:79;;:::i;:::-;36467:117;36608:98;36698:7;36689:6;36678:9;36674:22;36608:98;:::i;:::-;36598:108;;36401:315;36151:572;;;;:::o;36729:233::-;36768:3;36791:24;36809:5;36791:24;:::i;:::-;36782:33;;36837:66;36830:5;36827:77;36824:103;;36907:18;;:::i;:::-;36824:103;36954:1;36947:5;36943:13;36936:20;;36729:233;;;:::o;36968:224::-;37008:3;37027:20;37045:1;37027:20;:::i;:::-;37022:25;;37061:20;37079:1;37061:20;:::i;:::-;37056:25;;37104:1;37101;37097:9;37090:16;;37127:34;37122:3;37119:43;37116:69;;;37165:18;;:::i;:::-;37116:69;36968:224;;;;:::o;37198:174::-;37338:26;37334:1;37326:6;37322:14;37315:50;37198:174;:::o;37378:366::-;37520:3;37541:67;37605:2;37600:3;37541:67;:::i;:::-;37534:74;;37617:93;37706:3;37617:93;:::i;:::-;37735:2;37730:3;37726:12;37719:19;;37378:366;;;:::o;37750:419::-;37916:4;37954:2;37943:9;37939:18;37931:26;;38003:9;37997:4;37993:20;37989:1;37978:9;37974:17;37967:47;38031:131;38157:4;38031:131;:::i;:::-;38023:139;;37750:419;;;:::o;38175:549::-;38350:4;38388:3;38377:9;38373:19;38365:27;;38402:71;38470:1;38459:9;38455:17;38446:6;38402:71;:::i;:::-;38483:72;38551:2;38540:9;38536:18;38527:6;38483:72;:::i;:::-;38565:70;38631:2;38620:9;38616:18;38607:6;38565:70;:::i;:::-;38645:72;38713:2;38702:9;38698:18;38689:6;38645:72;:::i;:::-;38175:549;;;;;;;:::o;38730:143::-;38787:5;38818:6;38812:13;38803:22;;38834:33;38861:5;38834:33;:::i;:::-;38730:143;;;;:::o;38879:351::-;38949:6;38998:2;38986:9;38977:7;38973:23;38969:32;38966:119;;;39004:79;;:::i;:::-;38966:119;39124:1;39149:64;39205:7;39196:6;39185:9;39181:22;39149:64;:::i;:::-;39139:74;;39095:128;38879:351;;;;:::o;39236:157::-;39376:9;39372:1;39364:6;39360:14;39353:33;39236:157;:::o;39399:365::-;39541:3;39562:66;39626:1;39621:3;39562:66;:::i;:::-;39555:73;;39637:93;39726:3;39637:93;:::i;:::-;39755:2;39750:3;39746:12;39739:19;;39399:365;;;:::o;39770:419::-;39936:4;39974:2;39963:9;39959:18;39951:26;;40023:9;40017:4;40013:20;40009:1;39998:9;39994:17;39987:47;40051:131;40177:4;40051:131;:::i;:::-;40043:139;;39770:419;;;:::o;40195:167::-;40335:19;40331:1;40323:6;40319:14;40312:43;40195:167;:::o;40368:366::-;40510:3;40531:67;40595:2;40590:3;40531:67;:::i;:::-;40524:74;;40607:93;40696:3;40607:93;:::i;:::-;40725:2;40720:3;40716:12;40709:19;;40368:366;;;:::o;40740:419::-;40906:4;40944:2;40933:9;40929:18;40921:26;;40993:9;40987:4;40983:20;40979:1;40968:9;40964:17;40957:47;41021:131;41147:4;41021:131;:::i;:::-;41013:139;;40740:419;;;:::o;41165:410::-;41205:7;41228:20;41246:1;41228:20;:::i;:::-;41223:25;;41262:20;41280:1;41262:20;:::i;:::-;41257:25;;41317:1;41314;41310:9;41339:30;41357:11;41339:30;:::i;:::-;41328:41;;41518:1;41509:7;41505:15;41502:1;41499:22;41479:1;41472:9;41452:83;41429:139;;41548:18;;:::i;:::-;41429:139;41213:362;41165:410;;;;:::o;41581:174::-;41721:26;41717:1;41709:6;41705:14;41698:50;41581:174;:::o;41761:366::-;41903:3;41924:67;41988:2;41983:3;41924:67;:::i;:::-;41917:74;;42000:93;42089:3;42000:93;:::i;:::-;42118:2;42113:3;42109:12;42102:19;;41761:366;;;:::o;42133:419::-;42299:4;42337:2;42326:9;42322:18;42314:26;;42386:9;42380:4;42376:20;42372:1;42361:9;42357:17;42350:47;42414:131;42540:4;42414:131;:::i;:::-;42406:139;;42133:419;;;:::o;42558:332::-;42679:4;42717:2;42706:9;42702:18;42694:26;;42730:71;42798:1;42787:9;42783:17;42774:6;42730:71;:::i;:::-;42811:72;42879:2;42868:9;42864:18;42855:6;42811:72;:::i;:::-;42558:332;;;;;:::o;42896:386::-;43000:3;43028:38;43060:5;43028:38;:::i;:::-;43082:88;43163:6;43158:3;43082:88;:::i;:::-;43075:95;;43179:65;43237:6;43232:3;43225:4;43218:5;43214:16;43179:65;:::i;:::-;43269:6;43264:3;43260:16;43253:23;;43004:278;42896:386;;;;:::o;43288:271::-;43418:3;43440:93;43529:3;43520:6;43440:93;:::i;:::-;43433:100;;43550:3;43543:10;;43288:271;;;;:::o;43565:90::-;43599:7;43642:5;43635:13;43628:21;43617:32;;43565:90;;;:::o;43661:116::-;43731:21;43746:5;43731:21;:::i;:::-;43724:5;43721:32;43711:60;;43767:1;43764;43757:12;43711:60;43661:116;:::o;43783:137::-;43837:5;43868:6;43862:13;43853:22;;43884:30;43908:5;43884:30;:::i;:::-;43783:137;;;;:::o;43926:345::-;43993:6;44042:2;44030:9;44021:7;44017:23;44013:32;44010:119;;;44048:79;;:::i;:::-;44010:119;44168:1;44193:61;44246:7;44237:6;44226:9;44222:22;44193:61;:::i;:::-;44183:71;;44139:125;43926:345;;;;:::o;44277:105::-;44352:23;44369:5;44352:23;:::i;:::-;44347:3;44340:36;44277:105;;:::o;44388:102::-;44461:22;44477:5;44461:22;:::i;:::-;44456:3;44449:35;44388:102;;:::o;44598:2135::-;44749:6;44744:3;44740:16;44840:4;44833:5;44829:16;44823:23;44859:63;44916:4;44911:3;44907:14;44893:12;44859:63;:::i;:::-;44766:166;45016:4;45009:5;45005:16;44999:23;45035:63;45092:4;45087:3;45083:14;45069:12;45035:63;:::i;:::-;44942:166;45189:4;45182:5;45178:16;45172:23;45208:61;45263:4;45258:3;45254:14;45240:12;45208:61;:::i;:::-;45118:161;45366:4;45359:5;45355:16;45349:23;45385:59;45438:4;45433:3;45429:14;45415:12;45385:59;:::i;:::-;45289:165;45541:4;45534:5;45530:16;45524:23;45560:59;45613:4;45608:3;45604:14;45590:12;45560:59;:::i;:::-;45464:165;45721:4;45714:5;45710:16;45704:23;45740:63;45797:4;45792:3;45788:14;45774:12;45740:63;:::i;:::-;45639:174;45905:4;45898:5;45894:16;45888:23;45924:63;45981:4;45976:3;45972:14;45958:12;45924:63;:::i;:::-;45823:174;46085:4;46078:5;46074:16;46068:23;46104:63;46161:4;46156:3;46152:14;46138:12;46104:63;:::i;:::-;46007:170;46265:6;46258:5;46254:18;46248:25;46286:65;46343:6;46338:3;46334:16;46320:12;46286:65;:::i;:::-;46187:174;46448:6;46441:5;46437:18;46431:25;46469:65;46526:6;46521:3;46517:16;46503:12;46469:65;:::i;:::-;46371:173;46630:6;46623:5;46619:18;46613:25;46651:65;46708:6;46703:3;46699:16;46685:12;46651:65;:::i;:::-;46554:172;44718:2015;44598:2135;;:::o;46739:331::-;46886:4;46924:3;46913:9;46909:19;46901:27;;46938:125;47060:1;47049:9;47045:17;47036:6;46938:125;:::i;:::-;46739:331;;;;:::o;47076:122::-;47149:24;47167:5;47149:24;:::i;:::-;47142:5;47139:35;47129:63;;47188:1;47185;47178:12;47129:63;47076:122;:::o;47204:143::-;47261:5;47292:6;47286:13;47277:22;;47308:33;47335:5;47308:33;:::i;:::-;47204:143;;;;:::o;47353:820::-;47450:6;47458;47466;47474;47523:3;47511:9;47502:7;47498:23;47494:33;47491:120;;;47530:79;;:::i;:::-;47491:120;47650:1;47675:64;47731:7;47722:6;47711:9;47707:22;47675:64;:::i;:::-;47665:74;;47621:128;47788:2;47814:64;47870:7;47861:6;47850:9;47846:22;47814:64;:::i;:::-;47804:74;;47759:129;47927:2;47953:64;48009:7;48000:6;47989:9;47985:22;47953:64;:::i;:::-;47943:74;;47898:129;48066:2;48092:64;48148:7;48139:6;48128:9;48124:22;48092:64;:::i;:::-;48082:74;;48037:129;47353:820;;;;;;;:::o;48307:1272::-;48484:4;48479:3;48475:14;48574:4;48567:5;48563:16;48557:23;48593:63;48650:4;48645:3;48641:14;48627:12;48593:63;:::i;:::-;48499:167;48758:4;48751:5;48747:16;48741:23;48777:63;48834:4;48829:3;48825:14;48811:12;48777:63;:::i;:::-;48676:174;48942:4;48935:5;48931:16;48925:23;48961:63;49018:4;49013:3;49009:14;48995:12;48961:63;:::i;:::-;48860:174;49122:4;49115:5;49111:16;49105:23;49141:63;49198:4;49193:3;49189:14;49175:12;49141:63;:::i;:::-;49044:170;49302:4;49295:5;49291:16;49285:23;49321:63;49378:4;49373:3;49369:14;49355:12;49321:63;:::i;:::-;49224:170;49480:4;49473:5;49469:16;49463:23;49499:63;49556:4;49551:3;49547:14;49533:12;49499:63;:::i;:::-;49404:168;48453:1126;48307:1272;;:::o;49585:383::-;49758:4;49796:3;49785:9;49781:19;49773:27;;49810:151;49958:1;49947:9;49943:17;49934:6;49810:151;:::i;:::-;49585:383;;;;:::o;49974:663::-;50062:6;50070;50078;50127:2;50115:9;50106:7;50102:23;50098:32;50095:119;;;50133:79;;:::i;:::-;50095:119;50253:1;50278:64;50334:7;50325:6;50314:9;50310:22;50278:64;:::i;:::-;50268:74;;50224:128;50391:2;50417:64;50473:7;50464:6;50453:9;50449:22;50417:64;:::i;:::-;50407:74;;50362:129;50530:2;50556:64;50612:7;50603:6;50592:9;50588:22;50556:64;:::i;:::-;50546:74;;50501:129;49974:663;;;;;:::o;50643:351::-;50713:6;50762:2;50750:9;50741:7;50737:23;50733:32;50730:119;;;50768:79;;:::i;:::-;50730:119;50888:1;50913:64;50969:7;50960:6;50949:9;50945:22;50913:64;:::i;:::-;50903:74;;50859:128;50643:351;;;;:::o;51000:170::-;51140:22;51136:1;51128:6;51124:14;51117:46;51000:170;:::o;51176:366::-;51318:3;51339:67;51403:2;51398:3;51339:67;:::i;:::-;51332:74;;51415:93;51504:3;51415:93;:::i;:::-;51533:2;51528:3;51524:12;51517:19;;51176:366;;;:::o;51548:419::-;51714:4;51752:2;51741:9;51737:18;51729:26;;51801:9;51795:4;51791:20;51787:1;51776:9;51772:17;51765:47;51829:131;51955:4;51829:131;:::i;:::-;51821:139;;51548:419;;;:::o;51973:171::-;52113:23;52109:1;52101:6;52097:14;52090:47;51973:171;:::o;52150:366::-;52292:3;52313:67;52377:2;52372:3;52313:67;:::i;:::-;52306:74;;52389:93;52478:3;52389:93;:::i;:::-;52507:2;52502:3;52498:12;52491:19;;52150:366;;;:::o;52522:419::-;52688:4;52726:2;52715:9;52711:18;52703:26;;52775:9;52769:4;52765:20;52761:1;52750:9;52746:17;52739:47;52803:131;52929:4;52803:131;:::i;:::-;52795:139;;52522:419;;;:::o;52947:170::-;53087:22;53083:1;53075:6;53071:14;53064:46;52947:170;:::o;53123:366::-;53265:3;53286:67;53350:2;53345:3;53286:67;:::i;:::-;53279:74;;53362:93;53451:3;53362:93;:::i;:::-;53480:2;53475:3;53471:12;53464:19;;53123:366;;;:::o;53495:419::-;53661:4;53699:2;53688:9;53684:18;53676:26;;53748:9;53742:4;53738:20;53734:1;53723:9;53719:17;53712:47;53776:131;53902:4;53776:131;:::i;:::-;53768:139;;53495:419;;;:::o;53920:160::-;54060:12;54056:1;54048:6;54044:14;54037:36;53920:160;:::o;54086:366::-;54228:3;54249:67;54313:2;54308:3;54249:67;:::i;:::-;54242:74;;54325:93;54414:3;54325:93;:::i;:::-;54443:2;54438:3;54434:12;54427:19;;54086:366;;;:::o;54458:419::-;54624:4;54662:2;54651:9;54647:18;54639:26;;54711:9;54705:4;54701:20;54697:1;54686:9;54682:17;54675:47;54739:131;54865:4;54739:131;:::i;:::-;54731:139;;54458:419;;;:::o

Swarm Source

ipfs://97acec69a57de94181cda30ab7ed6376a1914ac8baa163b7852f28988f3ec7d9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.