Address Details
contract
token

0x2e031Fd9930b6aa96e8aC7ad528459817c96Ed70

Token
Revo FP Token (RFP)
Creator
0xff0944–49a35b at 0xe5a2eb–c4772e
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
66 Transactions
Transfers
62 Transfers
Gas Used
15,092,808
Last Balance Update
26631227
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
UbeswapFarmBot




Optimization enabled
false
Compiler version
v0.8.7+commit.e28d00a7




EVM Version
london




Verified at
2022-02-16T06:54:44.253293Z

UbeswapFarmBot.sol

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

import "hardhat/console.sol";

import "./IMoolaStakingRewards.sol";
import "./ubeswap/contracts/uniswapv2/interfaces/IUniswapV2Router02.sol";
import "./ubeswap/contracts/uniswapv2/interfaces/IUniswapV2Pair.sol";
import "./IRevoFees.sol";
import "./openzeppelin-solidity/contracts/ERC20.sol";
import "./openzeppelin-solidity/contracts/AccessControl.sol";
import "./openzeppelin-solidity/contracts/SafeERC20.sol";

contract UbeswapFarmBot is ERC20, AccessControl {
    using SafeERC20 for IERC20;

    event FeesUpdated(address indexed by, address indexed to);
    event ReserveUpdated(address indexed by, address indexed reserveAddress);
    event SlippageUpdated(
        address indexed by,
        uint256 numerator,
        uint256 denominator
    );
    event Deposit(address indexed by, uint256 lpAmount);
    event Withdraw(address indexed by, uint256 lpAmount, uint256 fee);
    event Compound(
        address indexed by,
        uint256 lpStaked,
        uint256 newLPTotalBalance,
        uint256 compounderFeeAmount,
        uint256 reserveFeeAmount
    );
    event GrantRole(
        address indexed by,
        address indexed newRoleRecipient,
        bytes32 role
    );

    bytes32 public constant COMPOUNDER_ROLE = keccak256("COMPOUNDER_ROLE");

    uint256 public lpTotalBalance; // total number of LP tokens owned by Farm Bot

    // fractional increase of LP balance last time compound was called. Used to calculate withdrawal fee.
    uint256 public interestEarnedNumerator;
    uint256 public interestEarnedDenominator = 10000;

    IMoolaStakingRewards public stakingRewards;

    // List of rewards tokens. The first token in this list is assumed to be the primary token;
    // the rest correspond to the staking reward contract's external reward tokens. The order of these tokens
    // is very important; the first must correspond to the MoolaStakingRewards contract's "native" reward token,
    // and the rest must correspond to its "external" tokens, in the same order as they appear in the contract.
    IERC20[] public rewardsTokens;

    IUniswapV2Pair public stakingToken; // LP that's being staked
    IERC20 public stakingToken0; // LP token0
    IERC20 public stakingToken1; // LP token1

    IUniswapV2Router02 public router; // Router address

    // Acceptable slippage when minting LP; can be updated by admin
    uint256 public slippageNumerator = 99;
    uint256 public slippageDenominator = 100;

    // Configurable fees contract. Determines:
    //  - "compounder fee" for calling compound on behalf of farm investors.
    //  - "reserve fee" sent to reserve
    //  - "compounder bonus" (paid by reserve) for calling compound
    //  - "withdrawal fee" for withdrawing (necessary for security, guaranteed <= 0.25%)
    //  Note that compounder fees + reserve fees are "performance fees", meaning they are charged only on earnings.
    //  Performance fees are guaranteed to be at most 4%, the current standard, and should be much less.
    IRevoFees public revoFees;
    uint256 public maxPerformanceFeeNumerator = 40;
    uint256 public maxPerformanceFeeDenominator = 1000;
    uint256 public maxWithdrawalFeeNumerator = 25;
    uint256 public maxWithdrawalFeeDenominator = 10000;

    address public reserveAddress;

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "FarmBot: EXPIRED");
        _;
    }

    constructor(
        address _owner,
        address _reserveAddress,
        address _stakingRewards,
        address _stakingToken,
        address _revoFees,
        address _router,
        address[] memory _rewardsTokens,
        string memory _symbol
    ) ERC20("Revo FP Token", _symbol) {
        stakingRewards = IMoolaStakingRewards(_stakingRewards);

        for (uint256 i = 0; i < _rewardsTokens.length; i++) {
            rewardsTokens.push(IERC20(_rewardsTokens[i]));
        }

        revoFees = IRevoFees(_revoFees);

        stakingToken = IUniswapV2Pair(_stakingToken);
        stakingToken0 = IERC20(stakingToken.token0());
        stakingToken1 = IERC20(stakingToken.token1());

        reserveAddress = _reserveAddress;

        router = IUniswapV2Router02(_router);

        _setupRole(DEFAULT_ADMIN_ROLE, _owner);
        emit GrantRole(msg.sender, _owner, DEFAULT_ADMIN_ROLE);
    }

    function grantRole(bytes32 role, address account)
        public
        virtual
        override
        onlyRole(getRoleAdmin(role))
    {
        super.grantRole(role, account);
        emit GrantRole(msg.sender, account, role);
    }

    function updateReserveAddress(address _reserveAddress)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        reserveAddress = _reserveAddress;
        emit ReserveUpdated(msg.sender, _reserveAddress);
    }

    function updateFees(address _revoFees)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        revoFees = IRevoFees(_revoFees);
        emit FeesUpdated(msg.sender, _revoFees);
    }

    function updateSlippage(
        uint256 _slippageNumerator,
        uint256 _slippageDenominator
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        slippageNumerator = _slippageNumerator;
        slippageDenominator = _slippageDenominator;
        emit SlippageUpdated(
            msg.sender,
            _slippageNumerator,
            _slippageDenominator
        );
    }

    function getFpAmount(uint256 _lpAmount) public view returns (uint256) {
        if (lpTotalBalance == 0) {
            return _lpAmount;
        } else {
            return (_lpAmount * totalSupply()) / lpTotalBalance;
        }
    }

    function getLpAmount(uint256 _fpAmount) public view returns (uint256) {
        if (totalSupply() == 0) {
            return 0;
        } else {
            return (_fpAmount * lpTotalBalance) / totalSupply();
        }
    }

    function deposit(uint256 _lpAmount) public {
        bool transferSuccess = stakingToken.transferFrom(
            msg.sender,
            address(this),
            _lpAmount
        );
        require(transferSuccess, "Transfer failed, aborting deposit");

        uint256 _fpAmount = this.getFpAmount(_lpAmount);
        _mint(msg.sender, _fpAmount);
        lpTotalBalance += _lpAmount;
        investInFarm(_lpAmount);
        emit Deposit(msg.sender, _lpAmount);
    }

    function withdrawAll() public {
        require(balanceOf(msg.sender) > 0, "Cannot withdraw zero balance");
        uint256 _lpAmount = getLpAmount(balanceOf(msg.sender));
        withdraw(_lpAmount);
    }

    function withdraw(uint256 _lpAmount) public {
        uint256 _fpAmount = this.getFpAmount(_lpAmount);
        require(
            balanceOf(msg.sender) >= _fpAmount,
            "Cannot withdraw more than the total balance of the owner"
        );

        uint256 tokenBalance = stakingToken.balanceOf(address(this));
        if (_lpAmount > tokenBalance) {
            stakingRewards.withdraw(_lpAmount - tokenBalance);
        }

        // fee
        (uint256 feeNumerator, uint256 feeDenominator) = revoFees.withdrawalFee(
            interestEarnedNumerator,
            interestEarnedDenominator
        );
        uint256 _withdrawalFee = (feeNumerator * _lpAmount) / feeDenominator;
        uint256 _maxWithdrawalFee = (maxPerformanceFeeNumerator * _lpAmount) /
            maxPerformanceFeeDenominator;
        if (_withdrawalFee > _maxWithdrawalFee) {
            // guarantee the max fee
            _withdrawalFee = _maxWithdrawalFee;
        }

        bool feeSuccess = stakingToken.transfer(reserveAddress, _withdrawalFee);
        require(feeSuccess, "Fee failed, aborting withdrawal");
        bool transferSuccess = stakingToken.transfer(
            msg.sender,
            _lpAmount - _withdrawalFee
        );
        require(transferSuccess, "Transfer failed, aborting withdrawal");
        _burn(msg.sender, _fpAmount);
        lpTotalBalance -= _lpAmount;
        emit Withdraw(msg.sender, _lpAmount, _withdrawalFee);
    }

    function investInFarm(uint256 _lpAmount) private {
        require(_lpAmount > 0, "Cannot invest in farm because _lpAmount is 0");
        stakingToken.approve(address(stakingRewards), _lpAmount);
        stakingRewards.stake(_lpAmount);
    }

    // Figure out best-case scenario amount of token we can get and swap
    function swapForTokenInPool(
        address[] memory _swapPath,
        uint256 _startTokenBudget,
        IERC20 _startToken,
        uint256 _minAmountOut,
        uint256 _deadline
    ) private returns (uint256) {
        if (_swapPath.length >= 2) {
            _startToken.approve(address(router), _startTokenBudget);
            uint256[] memory _swapResultAmounts = router
                .swapExactTokensForTokens(
                    _startTokenBudget,
                    _minAmountOut,
                    _swapPath,
                    address(this),
                    _deadline
                );
            return _swapResultAmounts[_swapResultAmounts.length - 1];
        } else {
            return _startTokenBudget;
        }
    }

    function addLiquidity(
        uint256[] memory _tokenBalances,
        address[][2][] memory _paths,
        uint256[2][] memory _minAmountsOut,
        uint256 _deadline
    ) private {
        uint256 _totalAmountToken0 = 0;
        uint256 _totalAmountToken1 = 0;
        for (uint256 i = 0; i < _tokenBalances.length; i++) {
            uint256 _halfTokens = _tokenBalances[i] / 2;
            _totalAmountToken0 += swapForTokenInPool(
                _paths[i][0],
                _halfTokens,
                rewardsTokens[i],
                _minAmountsOut[i][0],
                _deadline
            );
            _totalAmountToken1 += swapForTokenInPool(
                _paths[i][1],
                _halfTokens,
                rewardsTokens[i],
                _minAmountsOut[i][1],
                _deadline
            );
        }

        // Approve the router to spend the bot's token0/token1
        stakingToken0.approve(address(router), _totalAmountToken0);
        stakingToken1.approve(address(router), _totalAmountToken1);
        // Actually add liquidity
        router.addLiquidity(
            address(stakingToken0),
            address(stakingToken1),
            _totalAmountToken0,
            _totalAmountToken1,
            (_totalAmountToken0 * slippageNumerator) / slippageDenominator,
            (_totalAmountToken1 * slippageNumerator) / slippageDenominator,
            address(this),
            _deadline
        );
    }

    /**
     * The _paths parameter represents a list of paths to use when swapping each rewards token to token0/token1 of the LP.
     *  Each top-level entry represents a pair of paths for each rewardsToken.
     *
     * Example:
     *  // string token names used in place of addresses for readability
     *  rewardsTokens = ['cUSD', 'Celo', 'UBE']
     *  stakingTokens = ['cEUR', 'MOO']
     *  paths = [
     *    [ // paths from cUSD to staking tokens
     *      ['cUSD', 'cEUR'], // order matters here (need first staking token first)
     *      ['cUSD', 'mcUSD', 'MOO']
     *    ],
     *    [ // paths from Celo to staking tokens
     *      ...
     *    ],
     *    [ // paths from UBE to staking tokens
     *      ...
     *    ]
     *  ]
     *
     * The _minAmountsOut parameter represents a list of minimum amounts for token0/token1 we expect to receive when swapping
     *  each rewardsToken. If we do not receive at least this much of token0/token1 for some swap, the transaction will revert.
     * If a path corresponding to some swap has length < 2, the minimum amount specified for that swap will be ignored.
     */
    function compound(
        address[][2][] memory _paths,
        uint256[2][] memory _minAmountsOut,
        uint256 _deadline
    ) public ensure(_deadline) onlyRole(COMPOUNDER_ROLE) {
        require(
            _paths.length == rewardsTokens.length,
            "Parameter _paths must have length equal to rewardsTokens"
        );
        require(
            _minAmountsOut.length == rewardsTokens.length,
            "Parameter _minAmountsOut must have length equal to rewardsTokens"
        );

        stakingRewards.getReward();

        uint256[] memory _tokenBalances = new uint256[](rewardsTokens.length);
        for (uint256 i = 0; i < rewardsTokens.length; i++) {
            _tokenBalances[i] = rewardsTokens[i].balanceOf(address(this));
        }

        // Perform swaps and add liquidity
        addLiquidity(_tokenBalances, _paths, _minAmountsOut, _deadline);

        // send fees to compounder and reserve
        uint256 lpBalance = stakingToken.balanceOf(address(this));
        uint256 compounderFee = revoFees.compounderFee(lpBalance);
        uint256 reserveFee = revoFees.reserveFee(lpBalance);
        require(
            compounderFee + reserveFee <=
                (lpBalance * maxPerformanceFeeNumerator) /
                    maxPerformanceFeeDenominator,
            "Performance fee too high"
        );
        bool compounderFeeSuccess = stakingToken.transfer(
            msg.sender,
            compounderFee
        );
        bool reserveFeeSuccess = stakingToken.transfer(
            reserveAddress,
            reserveFee
        );
        require(
            compounderFeeSuccess && reserveFeeSuccess,
            "Sending fees failed"
        );

        // reinvest LPs and adjust FP weight
        uint256 lpEarnings = lpBalance - compounderFee - reserveFee;
        investInFarm(lpEarnings);
        lpTotalBalance += lpEarnings;

        // update interest rate
        interestEarnedNumerator =
            (lpEarnings * interestEarnedDenominator) /
            lpTotalBalance;

        revoFees.issueCompounderBonus(msg.sender);
        emit Compound(
            msg.sender,
            lpEarnings,
            lpTotalBalance,
            compounderFee,
            reserveFee
        );
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_reserveAddress","internalType":"address"},{"type":"address","name":"_stakingRewards","internalType":"address"},{"type":"address","name":"_stakingToken","internalType":"address"},{"type":"address","name":"_revoFees","internalType":"address"},{"type":"address","name":"_router","internalType":"address"},{"type":"address[]","name":"_rewardsTokens","internalType":"address[]"},{"type":"string","name":"_symbol","internalType":"string"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Compound","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"lpStaked","internalType":"uint256","indexed":false},{"type":"uint256","name":"newLPTotalBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"compounderFeeAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"reserveFeeAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"lpAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeesUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"GrantRole","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"address","name":"newRoleRecipient","internalType":"address","indexed":true},{"type":"bytes32","name":"role","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"ReserveUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"address","name":"reserveAddress","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SlippageUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"numerator","internalType":"uint256","indexed":false},{"type":"uint256","name":"denominator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"lpAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"fee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"COMPOUNDER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"compound","inputs":[{"type":"address[][2][]","name":"_paths","internalType":"address[][2][]"},{"type":"uint256[2][]","name":"_minAmountsOut","internalType":"uint256[2][]"},{"type":"uint256","name":"_deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_lpAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFpAmount","inputs":[{"type":"uint256","name":"_lpAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLpAmount","inputs":[{"type":"uint256","name":"_fpAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"interestEarnedDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"interestEarnedNumerator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lpTotalBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxPerformanceFeeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxPerformanceFeeNumerator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWithdrawalFeeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWithdrawalFeeNumerator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"reserveAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRevoFees"}],"name":"revoFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"rewardsTokens","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"slippageDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"slippageNumerator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMoolaStakingRewards"}],"name":"stakingRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Pair"}],"name":"stakingToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stakingToken0","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"stakingToken1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateFees","inputs":[{"type":"address","name":"_revoFees","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateReserveAddress","inputs":[{"type":"address","name":"_reserveAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSlippage","inputs":[{"type":"uint256","name":"_slippageNumerator","internalType":"uint256"},{"type":"uint256","name":"_slippageDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_lpAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAll","inputs":[]}]
              

Contract Creation Code

0x60806040526127106008556063600f55606460105560286012556103e860135560196014556127106015553480156200003757600080fd5b506040516200655f3803806200655f83398181016040528101906200005d9190620008a6565b6040518060400160405280600d81526020017f5265766f20465020546f6b656e00000000000000000000000000000000000000815250818160039080519060200190620000ac92919062000681565b508060049080519060200190620000c592919062000681565b50505085600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8251811015620001ac57600a8382815181106200012e576200012d62000bff565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080620001a39062000b53565b9150506200010c565b5083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029857600080fd5b505afa158015620002ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d3919062000874565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037c57600080fd5b505afa15801562000391573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b7919062000874565b600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200048e6000801b896200050660201b60201c565b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe7442843a65013dba5eebc77d5a00f5fafa588af0da4bf39250936d4783bb5536000801b604051620004f09190620009be565b60405180910390a3505050505050505062000ca1565b6200051882826200051c60201b60201c565b5050565b6200052e82826200060e60201b60201c565b6200060a5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005af6200067960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200068f9062000ae7565b90600052602060002090601f016020900481019282620006b35760008555620006ff565b82601f10620006ce57805160ff1916838001178555620006ff565b82800160010185558215620006ff579182015b82811115620006fe578251825591602001919060010190620006e1565b5b5090506200070e919062000712565b5090565b5b808211156200072d57600081600090555060010162000713565b5090565b600062000748620007428462000a04565b620009db565b905080838252602082019050828560208602820111156200076e576200076d62000c62565b5b60005b85811015620007a25781620007878882620007f7565b84526020840193506020830192505060018101905062000771565b5050509392505050565b6000620007c3620007bd8462000a33565b620009db565b905082815260208101848484011115620007e257620007e162000c67565b5b620007ef84828562000ab1565b509392505050565b600081519050620008088162000c87565b92915050565b600082601f83011262000826576200082562000c5d565b5b81516200083884826020860162000731565b91505092915050565b600082601f83011262000859576200085862000c5d565b5b81516200086b848260208601620007ac565b91505092915050565b6000602082840312156200088d576200088c62000c71565b5b60006200089d84828501620007f7565b91505092915050565b600080600080600080600080610100898b031215620008ca57620008c962000c71565b5b6000620008da8b828c01620007f7565b9850506020620008ed8b828c01620007f7565b9750506040620009008b828c01620007f7565b9650506060620009138b828c01620007f7565b9550506080620009268b828c01620007f7565b94505060a0620009398b828c01620007f7565b93505060c089015167ffffffffffffffff8111156200095d576200095c62000c6c565b5b6200096b8b828c016200080e565b92505060e089015167ffffffffffffffff8111156200098f576200098e62000c6c565b5b6200099d8b828c0162000841565b9150509295985092959890939650565b620009b88162000a7d565b82525050565b6000602082019050620009d56000830184620009ad565b92915050565b6000620009e7620009fa565b9050620009f5828262000b1d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a225762000a2162000c2e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a515762000a5062000c2e565b5b62000a5c8262000c76565b9050602081019050919050565b600062000a768262000a87565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000ad157808201518184015260208101905062000ab4565b8381111562000ae1576000848401525b50505050565b6000600282049050600182168062000b0057607f821691505b6020821081141562000b175762000b1662000bd0565b5b50919050565b62000b288262000c76565b810181811067ffffffffffffffff8211171562000b4a5762000b4962000c2e565b5b80604052505050565b600062000b608262000aa7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b965762000b9562000ba1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000c928162000a69565b811462000c9e57600080fd5b50565b6158ae8062000cb16000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c806372f702f31161015c578063bac385c4116100ce578063dbae9b0f11610087578063dbae9b0f146107ca578063dd62ed3e146107e8578063f79ed94b14610818578063f84afd4814610836578063f887ea4014610852578063fd3865e1146108705761027f565b8063bac385c414610708578063c7493abb14610724578063c838b07414610742578063c9ce0e8c14610760578063d484064114610790578063d547741f146107ae5761027f565b806395d89b411161012057806395d89b4114610620578063a217fddf1461063e578063a457c2d71461065c578063a9059cbb1461068c578063b6b55f25146106bc578063b6d0dcd8146106d85761027f565b806372f702f31461058e5780637aca573c146105ac578063853828b6146105ca5780638c00ca9d146105d457806391d14854146105f05761027f565b80632f2ff15d116101f55780634a1510b4116101b95780634a1510b4146104b85780635a3746ca146104d65780635f8e9e91146104f257806364b87a7014610522578063684cb2741461054057806370a082311461055e5761027f565b80632f2ff15d14610414578063313ce5671461043057806336568abe1461044e5780633902cbff1461046a57806339509351146104885761027f565b806318160ddd1161024757806318160ddd1461033e57806323b872dd1461035c578063248a9ca31461038c57806327b74a5d146103bc5780632e1a7d4d146103da5780632e5bd7ab146103f65761027f565b806301ffc9a71461028457806306fdde03146102b4578063095ea7b3146102d25780630ab8985b14610302578063147bd3af14610320575b600080fd5b61029e60048036038101906102999190613fb2565b61088e565b6040516102ab919061472f565b60405180910390f35b6102bc610908565b6040516102c991906147ec565b60405180910390f35b6102ec60048036038101906102e79190613e04565b61099a565b6040516102f9919061472f565b60405180910390f35b61030a6109b8565b6040516103179190614765565b60405180910390f35b6103286109de565b6040516103359190614aee565b60405180910390f35b6103466109e4565b6040516103539190614aee565b60405180910390f35b61037660048036038101906103719190613db1565b6109ee565b604051610383919061472f565b60405180910390f35b6103a660048036038101906103a19190613f45565b610aef565b6040516103b3919061474a565b60405180910390f35b6103c4610b0f565b6040516103d19190614aee565b60405180910390f35b6103f460048036038101906103ef9190613fdf565b610b15565b005b6103fe6110cb565b60405161040b9190614aee565b60405180910390f35b61042e60048036038101906104299190613f72565b6110d1565b005b610438611157565b6040516104459190614bd1565b60405180910390f35b61046860048036038101906104639190613f72565b611160565b005b6104726111e3565b60405161047f9190614aee565b60405180910390f35b6104a2600480360381019061049d9190613e04565b6111e9565b6040516104af919061472f565b60405180910390f35b6104c0611295565b6040516104cd9190614aee565b60405180910390f35b6104f060048036038101906104eb9190613e44565b61129b565b005b61050c60048036038101906105079190613fdf565b611b18565b6040516105199190614aee565b60405180910390f35b61052a611b5a565b6040516105379190614780565b60405180910390f35b610548611b80565b604051610555919061474a565b60405180910390f35b61057860048036038101906105739190613d44565b611ba4565b6040516105859190614aee565b60405180910390f35b610596611bec565b6040516105a391906147b6565b60405180910390f35b6105b4611c12565b6040516105c1919061479b565b60405180910390f35b6105d2611c38565b005b6105ee60048036038101906105e99190614039565b611ca4565b005b61060a60048036038101906106059190613f72565b611d14565b604051610617919061472f565b60405180910390f35b610628611d7f565b60405161063591906147ec565b60405180910390f35b610646611e11565b604051610653919061474a565b60405180910390f35b61067660048036038101906106719190613e04565b611e18565b604051610683919061472f565b60405180910390f35b6106a660048036038101906106a19190613e04565b611f0c565b6040516106b3919061472f565b60405180910390f35b6106d660048036038101906106d19190613fdf565b611f2a565b005b6106f260048036038101906106ed9190613fdf565b61212b565b6040516106ff9190614765565b60405180910390f35b610722600480360381019061071d9190613d44565b61216a565b005b61072c612216565b6040516107399190614aee565b60405180910390f35b61074a61221c565b6040516107579190614aee565b60405180910390f35b61077a60048036038101906107759190613fdf565b612222565b6040516107879190614aee565b60405180910390f35b61079861225e565b6040516107a59190614aee565b60405180910390f35b6107c860048036038101906107c39190613f72565b612264565b005b6107d2612285565b6040516107df9190614aee565b60405180910390f35b61080260048036038101906107fd9190613d71565b61228b565b60405161080f9190614aee565b60405180910390f35b610820612312565b60405161082d9190614636565b60405180910390f35b610850600480360381019061084b9190613d44565b612338565b005b61085a6123e4565b60405161086791906147d1565b60405180910390f35b61087861240a565b6040516108859190614765565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610901575061090082612430565b5b9050919050565b60606003805461091790614fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461094390614fe8565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109ae6109a761249a565b84846124a2565b6001905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000600254905090565b60006109fb84848461266d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a4661249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd9061496e565b60405180910390fd5b610ae385610ad261249a565b8584610ade9190614e4e565b6124a2565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b60065481565b60003073ffffffffffffffffffffffffffffffffffffffff1663c9ce0e8c836040518263ffffffff1660e01b8152600401610b509190614aee565b60206040518083038186803b158015610b6857600080fd5b505afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba0919061400c565b905080610bac33611ba4565b1015610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490614a2e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c4a9190614636565b60206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061400c565b905080831115610d3d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8285610cee9190614e4e565b6040518263ffffffff1660e01b8152600401610d0a9190614aee565b600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634ae2859c6007546008546040518363ffffffff1660e01b8152600401610da1929190614b09565b604080518083038186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190614079565b915091506000818684610e039190614df4565b610e0d9190614dc3565b9050600060135487601254610e229190614df4565b610e2c9190614dc3565b905080821115610e3a578091505b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610ebb929190614706565b602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0d9190613f18565b905080610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690614a6e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33868c610f9c9190614e4e565b6040518363ffffffff1660e01b8152600401610fb9929190614706565b602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b9190613f18565b90508061104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906149ae565b60405180910390fd5b61105733896128ec565b88600660008282546110699190614e4e565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688a866040516110b8929190614b09565b60405180910390a2505050505050505050565b60155481565b6110da82610aef565b6110e381612ac0565b6110ed8383612ad4565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe7442843a65013dba5eebc77d5a00f5fafa588af0da4bf39250936d4783bb5538560405161114a919061474a565b60405180910390a3505050565b60006012905090565b61116861249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90614aae565b60405180910390fd5b6111df8282612af5565b5050565b60085481565b600061128b6111f661249a565b84846001600061120461249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112869190614d6d565b6124a2565b6001905092915050565b60135481565b80428110156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906148ee565b60405180910390fd5b7f29944e936a0f6e1cbaa227df218d7d6025c2a2785db840e42a3425f24e9e68ac61130981612ac0565b600a80549050855114611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906149ee565b60405180910390fd5b600a80549050845114611399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113909061490e565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561140357600080fd5b505af1158015611417573d6000803e3d6000fd5b505050506000600a8054905067ffffffffffffffff81111561143c5761143b615150565b5b60405190808252806020026020018201604052801561146a5781602001602082028036833780820191505090505b50905060005b600a8054905081101561157657600a818154811061149157611490615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114f49190614636565b60206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061400c565b82828151811061155757611556615121565b5b602002602001018181525050808061156e9061504b565b915050611470565b5061158381878787612bd7565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115e09190614636565b60206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061400c565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392ce27f8836040518263ffffffff1660e01b815260040161168f9190614aee565b60206040518083038186803b1580156116a757600080fd5b505afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df919061400c565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631deae18c846040518263ffffffff1660e01b815260040161173e9190614aee565b60206040518083038186803b15801561175657600080fd5b505afa15801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e919061400c565b9050601354601254846117a19190614df4565b6117ab9190614dc3565b81836117b79190614d6d565b11156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906148ce565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401611857929190614706565b602060405180830381600087803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190613f18565b90506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161192c929190614706565b602060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190613f18565b905081801561198a5750805b6119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c09061494e565b60405180910390fd5b60008385876119d89190614e4e565b6119e29190614e4e565b90506119ed81613080565b80600660008282546119ff9190614d6d565b9250508190555060065460085482611a179190614df4565b611a219190614dc3565b600781905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a564992336040518263ffffffff1660e01b8152600401611a829190614636565b600060405180830381600087803b158015611a9c57600080fd5b505af1158015611ab0573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f36c54fe3f6742709ba65ab76880ce98cbacfc0e2f273d55f4e4d50d8830c2600826006548888604051611b029493929190614b8c565b60405180910390a2505050505050505050505050565b600080611b236109e4565b1415611b325760009050611b55565b611b3a6109e4565b60065483611b489190614df4565b611b529190614dc3565b90505b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f29944e936a0f6e1cbaa227df218d7d6025c2a2785db840e42a3425f24e9e68ac81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c4333611ba4565b11611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a9061492e565b60405180910390fd5b6000611c96611c9133611ba4565b611b18565b9050611ca181610b15565b50565b6000801b611cb181612ac0565b82600f81905550816010819055503373ffffffffffffffffffffffffffffffffffffffff167fe8a0df875bece805d1b6bd1bf60bdf2abc88b51be72ed2bb5cd590532bc446a88484604051611d07929190614b09565b60405180910390a2505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611d8e90614fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba90614fe8565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b5050505050905090565b6000801b81565b60008060016000611e2761249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614a8e565b60405180910390fd5b611f01611eef61249a565b858584611efc9190614e4e565b6124a2565b600191505092915050565b6000611f20611f1961249a565b848461266d565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611f8b93929190614651565b602060405180830381600087803b158015611fa557600080fd5b505af1158015611fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdd9190613f18565b90508061201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061498e565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663c9ce0e8c846040518263ffffffff1660e01b815260040161205a9190614aee565b60206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa919061400c565b90506120b63382613225565b82600660008282546120c89190614d6d565b925050819055506120d883613080565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161211e9190614aee565b60405180910390a2505050565b600a818154811061213b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b61217781612ac0565b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff76e779f769943b728cc826f493098475a7601f9ca3c1fa2696bc810f505056360405160405180910390a35050565b60145481565b60075481565b600080600654141561223657819050612259565b6006546122416109e4565b8361224c9190614df4565b6122569190614dc3565b90505b919050565b60105481565b61226d82610aef565b61227681612ac0565b6122808383612af5565b505050565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b61234581612ac0565b81601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbd45c5f5d28e3962d234f9fa4e443f6f92e4525b10556e441307306fab9f9e0360405160405180910390a35050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799061488e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126609190614aee565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d490614a0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127449061482e565b60405180910390fd5b612758838383613379565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d5906148ae565b60405180910390fd5b81816127ea9190614e4e565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287a9190614d6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128de9190614aee565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612953906149ce565b60405180910390fd5b61296882600083613379565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e59061486e565b60405180910390fd5b81816129fa9190614e4e565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612a4e9190614e4e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ab39190614aee565b60405180910390a3505050565b612ad181612acc61249a565b61337e565b50565b612add82610aef565b612ae681612ac0565b612af0838361341b565b505050565b612aff8282611d14565b15612bd35760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b7861249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060005b8651811015612d9d5760006002888381518110612bfd57612bfc615121565b5b6020026020010151612c0f9190614dc3565b9050612cc0878381518110612c2757612c26615121565b5b6020026020010151600060028110612c4257612c41615121565b5b602002015182600a8581548110612c5c57612c5b615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898681518110612c9a57612c99615121565b5b6020026020010151600060028110612cb557612cb4615121565b5b6020020151896134fc565b84612ccb9190614d6d565b9350612d7c878381518110612ce357612ce2615121565b5b6020026020010151600160028110612cfe57612cfd615121565b5b602002015182600a8581548110612d1857612d17615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898681518110612d5657612d55615121565b5b6020026020010151600160028110612d7157612d70615121565b5b6020020151896134fc565b83612d879190614d6d565b9250508080612d959061504b565b915050612bdd565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e1d929190614706565b602060405180830381600087803b158015612e3757600080fd5b505af1158015612e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6f9190613f18565b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612eef929190614706565b602060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f419190613f18565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585601054600f5489612fd99190614df4565b612fe39190614dc3565b601054600f5489612ff49190614df4565b612ffe9190614dc3565b308b6040518963ffffffff1660e01b8152600401613023989796959493929190614688565b606060405180830381600087803b15801561303d57600080fd5b505af1158015613051573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307591906140b9565b505050505050505050565b600081116130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba9061484e565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613142929190614706565b602060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131949190613f18565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b81526004016131f09190614aee565b600060405180830381600087803b15801561320a57600080fd5b505af115801561321e573d6000803e3d6000fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328c90614ace565b60405180910390fd5b6132a160008383613379565b80600260008282546132b39190614d6d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133089190614d6d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161336d9190614aee565b60405180910390a35050565b505050565b6133888282611d14565b613417576133ad8173ffffffffffffffffffffffffffffffffffffffff1660146136b2565b6133bb8360001c60206136b2565b6040516020016133cc9291906145fc565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340e91906147ec565b60405180910390fd5b5050565b6134258282611d14565b6134f85760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061349d61249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060028651106136a5578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b8152600401613564929190614706565b602060405180830381600087803b15801561357e57600080fd5b505af1158015613592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b69190613f18565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed173987868a30886040518663ffffffff1660e01b815260040161361c959493929190614b32565b600060405180830381600087803b15801561363657600080fd5b505af115801561364a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906136739190613ecf565b905080600182516136849190614e4e565b8151811061369557613694615121565b5b60200260200101519150506136a9565b8490505b95945050505050565b6060600060028360026136c59190614df4565b6136cf9190614d6d565b67ffffffffffffffff8111156136e8576136e7615150565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061375257613751615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106137b6576137b5615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026137f69190614df4565b6138009190614d6d565b90505b60018111156138a0577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061384257613841615121565b5b1a60f81b82828151811061385957613858615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061389990614fbe565b9050613803565b50600084146138e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138db9061480e565b60405180910390fd5b8091505092915050565b60006139016138fc84614c11565b614bec565b9050808382526020820190508285602086028201111561392457613923615184565b5b60005b85811015613954578161393a8882613bb8565b845260208401935060208301925050600181019050613927565b5050509392505050565b600061397161396c84614c3d565b614bec565b9050808285602086028201111561398b5761398a615184565b5b60005b858110156139d957813567ffffffffffffffff8111156139b1576139b061517f565b5b8086016139be8982613bcd565b8552602085019450602084019350505060018101905061398e565b5050509392505050565b60006139f66139f184614c63565b614bec565b90508083825260208201905082856020860282011115613a1957613a18615184565b5b60005b85811015613a6757813567ffffffffffffffff811115613a3f57613a3e61517f565b5b808601613a4c8982613bfb565b85526020850194506020840193505050600181019050613a1c565b5050509392505050565b6000613a84613a7f84614c8f565b614bec565b90508083825260208201905082856040860282011115613aa757613aa6615184565b5b60005b85811015613ad75781613abd8882613c82565b845260208401935060408301925050600181019050613aaa565b5050509392505050565b6000613af4613aef84614cbb565b614bec565b90508082856020860282011115613b0e57613b0d615184565b5b60005b85811015613b3e5781613b248882613d1a565b845260208401935060208301925050600181019050613b11565b5050509392505050565b6000613b5b613b5684614ce1565b614bec565b90508083825260208201905082856020860282011115613b7e57613b7d615184565b5b60005b85811015613bae5781613b948882613d2f565b845260208401935060208301925050600181019050613b81565b5050509392505050565b600081359050613bc781615805565b92915050565b600082601f830112613be257613be161517f565b5b8135613bf28482602086016138ee565b91505092915050565b600082601f830112613c1057613c0f61517f565b5b6002613c1d84828561395e565b91505092915050565b600082601f830112613c3b57613c3a61517f565b5b8135613c4b8482602086016139e3565b91505092915050565b600082601f830112613c6957613c6861517f565b5b8135613c79848260208601613a71565b91505092915050565b600082601f830112613c9757613c9661517f565b5b6002613ca4848285613ae1565b91505092915050565b600082601f830112613cc257613cc161517f565b5b8151613cd2848260208601613b48565b91505092915050565b600081519050613cea8161581c565b92915050565b600081359050613cff81615833565b92915050565b600081359050613d148161584a565b92915050565b600081359050613d2981615861565b92915050565b600081519050613d3e81615861565b92915050565b600060208284031215613d5a57613d5961518e565b5b6000613d6884828501613bb8565b91505092915050565b60008060408385031215613d8857613d8761518e565b5b6000613d9685828601613bb8565b9250506020613da785828601613bb8565b9150509250929050565b600080600060608486031215613dca57613dc961518e565b5b6000613dd886828701613bb8565b9350506020613de986828701613bb8565b9250506040613dfa86828701613d1a565b9150509250925092565b60008060408385031215613e1b57613e1a61518e565b5b6000613e2985828601613bb8565b9250506020613e3a85828601613d1a565b9150509250929050565b600080600060608486031215613e5d57613e5c61518e565b5b600084013567ffffffffffffffff811115613e7b57613e7a615189565b5b613e8786828701613c26565b935050602084013567ffffffffffffffff811115613ea857613ea7615189565b5b613eb486828701613c54565b9250506040613ec586828701613d1a565b9150509250925092565b600060208284031215613ee557613ee461518e565b5b600082015167ffffffffffffffff811115613f0357613f02615189565b5b613f0f84828501613cad565b91505092915050565b600060208284031215613f2e57613f2d61518e565b5b6000613f3c84828501613cdb565b91505092915050565b600060208284031215613f5b57613f5a61518e565b5b6000613f6984828501613cf0565b91505092915050565b60008060408385031215613f8957613f8861518e565b5b6000613f9785828601613cf0565b9250506020613fa885828601613bb8565b9150509250929050565b600060208284031215613fc857613fc761518e565b5b6000613fd684828501613d05565b91505092915050565b600060208284031215613ff557613ff461518e565b5b600061400384828501613d1a565b91505092915050565b6000602082840312156140225761402161518e565b5b600061403084828501613d2f565b91505092915050565b600080604083850312156140505761404f61518e565b5b600061405e85828601613d1a565b925050602061406f85828601613d1a565b9150509250929050565b600080604083850312156140905761408f61518e565b5b600061409e85828601613d2f565b92505060206140af85828601613d2f565b9150509250929050565b6000806000606084860312156140d2576140d161518e565b5b60006140e086828701613d2f565b93505060206140f186828701613d2f565b925050604061410286828701613d2f565b9150509250925092565b60006141188383614124565b60208301905092915050565b61412d81614e82565b82525050565b61413c81614e82565b82525050565b600061414d82614d1d565b6141578185614d40565b935061416283614d0d565b8060005b8381101561419357815161417a888261410c565b975061418583614d33565b925050600181019050614166565b5085935050505092915050565b6141a981614e94565b82525050565b6141b881614ea0565b82525050565b6141c781614f0d565b82525050565b6141d681614f1f565b82525050565b6141e581614f31565b82525050565b6141f481614f43565b82525050565b61420381614f55565b82525050565b600061421482614d28565b61421e8185614d51565b935061422e818560208601614f8b565b61423781615193565b840191505092915050565b600061424d82614d28565b6142578185614d62565b9350614267818560208601614f8b565b80840191505092915050565b6000614280602083614d51565b915061428b826151a4565b602082019050919050565b60006142a3602383614d51565b91506142ae826151cd565b604082019050919050565b60006142c6602c83614d51565b91506142d18261521c565b604082019050919050565b60006142e9602283614d51565b91506142f48261526b565b604082019050919050565b600061430c602283614d51565b9150614317826152ba565b604082019050919050565b600061432f602683614d51565b915061433a82615309565b604082019050919050565b6000614352601883614d51565b915061435d82615358565b602082019050919050565b6000614375601083614d51565b915061438082615381565b602082019050919050565b6000614398604083614d51565b91506143a3826153aa565b604082019050919050565b60006143bb601c83614d51565b91506143c6826153f9565b602082019050919050565b60006143de601383614d51565b91506143e982615422565b602082019050919050565b6000614401602883614d51565b915061440c8261544b565b604082019050919050565b6000614424602183614d51565b915061442f8261549a565b604082019050919050565b6000614447602483614d51565b9150614452826154e9565b604082019050919050565b600061446a602183614d51565b915061447582615538565b604082019050919050565b600061448d603883614d51565b915061449882615587565b604082019050919050565b60006144b0602583614d51565b91506144bb826155d6565b604082019050919050565b60006144d3603883614d51565b91506144de82615625565b604082019050919050565b60006144f6602483614d51565b915061450182615674565b604082019050919050565b6000614519601f83614d51565b9150614524826156c3565b602082019050919050565b600061453c601783614d62565b9150614547826156ec565b601782019050919050565b600061455f602583614d51565b915061456a82615715565b604082019050919050565b6000614582601183614d62565b915061458d82615764565b601182019050919050565b60006145a5602f83614d51565b91506145b08261578d565b604082019050919050565b60006145c8601f83614d51565b91506145d3826157dc565b602082019050919050565b6145e781614ef6565b82525050565b6145f681614f00565b82525050565b60006146078261452f565b91506146138285614242565b915061461e82614575565b915061462a8284614242565b91508190509392505050565b600060208201905061464b6000830184614133565b92915050565b60006060820190506146666000830186614133565b6146736020830185614133565b61468060408301846145de565b949350505050565b60006101008201905061469e600083018b614133565b6146ab602083018a614133565b6146b860408301896145de565b6146c560608301886145de565b6146d260808301876145de565b6146df60a08301866145de565b6146ec60c0830185614133565b6146f960e08301846145de565b9998505050505050505050565b600060408201905061471b6000830185614133565b61472860208301846145de565b9392505050565b600060208201905061474460008301846141a0565b92915050565b600060208201905061475f60008301846141af565b92915050565b600060208201905061477a60008301846141be565b92915050565b600060208201905061479560008301846141cd565b92915050565b60006020820190506147b060008301846141dc565b92915050565b60006020820190506147cb60008301846141eb565b92915050565b60006020820190506147e660008301846141fa565b92915050565b600060208201905081810360008301526148068184614209565b905092915050565b6000602082019050818103600083015261482781614273565b9050919050565b6000602082019050818103600083015261484781614296565b9050919050565b60006020820190508181036000830152614867816142b9565b9050919050565b60006020820190508181036000830152614887816142dc565b9050919050565b600060208201905081810360008301526148a7816142ff565b9050919050565b600060208201905081810360008301526148c781614322565b9050919050565b600060208201905081810360008301526148e781614345565b9050919050565b6000602082019050818103600083015261490781614368565b9050919050565b600060208201905081810360008301526149278161438b565b9050919050565b60006020820190508181036000830152614947816143ae565b9050919050565b60006020820190508181036000830152614967816143d1565b9050919050565b60006020820190508181036000830152614987816143f4565b9050919050565b600060208201905081810360008301526149a781614417565b9050919050565b600060208201905081810360008301526149c78161443a565b9050919050565b600060208201905081810360008301526149e78161445d565b9050919050565b60006020820190508181036000830152614a0781614480565b9050919050565b60006020820190508181036000830152614a27816144a3565b9050919050565b60006020820190508181036000830152614a47816144c6565b9050919050565b60006020820190508181036000830152614a67816144e9565b9050919050565b60006020820190508181036000830152614a878161450c565b9050919050565b60006020820190508181036000830152614aa781614552565b9050919050565b60006020820190508181036000830152614ac781614598565b9050919050565b60006020820190508181036000830152614ae7816145bb565b9050919050565b6000602082019050614b0360008301846145de565b92915050565b6000604082019050614b1e60008301856145de565b614b2b60208301846145de565b9392505050565b600060a082019050614b4760008301886145de565b614b5460208301876145de565b8181036040830152614b668186614142565b9050614b756060830185614133565b614b8260808301846145de565b9695505050505050565b6000608082019050614ba160008301876145de565b614bae60208301866145de565b614bbb60408301856145de565b614bc860608301846145de565b95945050505050565b6000602082019050614be660008301846145ed565b92915050565b6000614bf6614c07565b9050614c02828261501a565b919050565b6000604051905090565b600067ffffffffffffffff821115614c2c57614c2b615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5857614c57615150565b5b602082029050919050565b600067ffffffffffffffff821115614c7e57614c7d615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614caa57614ca9615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cd657614cd5615150565b5b602082029050919050565b600067ffffffffffffffff821115614cfc57614cfb615150565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d7882614ef6565b9150614d8383614ef6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614db857614db7615094565b5b828201905092915050565b6000614dce82614ef6565b9150614dd983614ef6565b925082614de957614de86150c3565b5b828204905092915050565b6000614dff82614ef6565b9150614e0a83614ef6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e4357614e42615094565b5b828202905092915050565b6000614e5982614ef6565b9150614e6483614ef6565b925082821015614e7757614e76615094565b5b828203905092915050565b6000614e8d82614ed6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614f1882614f67565b9050919050565b6000614f2a82614f67565b9050919050565b6000614f3c82614f67565b9050919050565b6000614f4e82614f67565b9050919050565b6000614f6082614f67565b9050919050565b6000614f7282614f79565b9050919050565b6000614f8482614ed6565b9050919050565b60005b83811015614fa9578082015181840152602081019050614f8e565b83811115614fb8576000848401525b50505050565b6000614fc982614ef6565b91506000821415614fdd57614fdc615094565b5b600182039050919050565b6000600282049050600182168061500057607f821691505b60208210811415615014576150136150f2565b5b50919050565b61502382615193565b810181811067ffffffffffffffff8211171561504257615041615150565b5b80604052505050565b600061505682614ef6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561508957615088615094565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420696e7665737420696e206661726d2062656361757365205f6c60008201527f70416d6f756e7420697320300000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f506572666f726d616e63652066656520746f6f20686967680000000000000000600082015250565b7f4661726d426f743a204558504952454400000000000000000000000000000000600082015250565b7f506172616d65746572205f6d696e416d6f756e74734f7574206d75737420686160008201527f7665206c656e67746820657175616c20746f2072657761726473546f6b656e73602082015250565b7f43616e6e6f74207769746864726177207a65726f2062616c616e636500000000600082015250565b7f53656e64696e672066656573206661696c656400000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642c2061626f7274696e67206465706f736960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642c2061626f7274696e672077697468647260008201527f6177616c00000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f506172616d65746572205f7061746873206d7573742068617665206c656e677460008201527f6820657175616c20746f2072657761726473546f6b656e730000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207769746864726177206d6f7265207468616e2074686520746f60008201527f74616c2062616c616e6365206f6620746865206f776e65720000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f466565206661696c65642c2061626f7274696e67207769746864726177616c00600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61580e81614e82565b811461581957600080fd5b50565b61582581614e94565b811461583057600080fd5b50565b61583c81614ea0565b811461584757600080fd5b50565b61585381614eaa565b811461585e57600080fd5b50565b61586a81614ef6565b811461587557600080fd5b5056fea2646970667358221220e0aa4b0dff59ba6e96d0c2a7dd179f23569bd1396d38515e1ebe4503883e711064736f6c63430008070033000000000000000000000000ff094409563b0888af6160dbaaaf3a8c0b49a35b00000000000000000000000099649af776ff1b024f12e8fe9dfa59a6c0b4bd9c0000000000000000000000002ca16986bea18d562d26354b4ff4c504f14fb01c000000000000000000000000f94fea0c87d2b357dc72b743b45a8cb682b0716e000000000000000000000000866b23e29f8025283e35ff7777d63f7fc6c8d957000000000000000000000000e3d8bd6aed4f159bc8000a9cd47cffdb95f96121000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000471ece3750da237f93b8e339c536989b8978a43800000000000000000000000000be915b9dcf56a3cbe739d9b9c202ca692409ec00000000000000000000000017700282592d6917f6a73d0bf8accf4d578c131e00000000000000000000000000000000000000000000000000000000000000035246500000000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c806372f702f31161015c578063bac385c4116100ce578063dbae9b0f11610087578063dbae9b0f146107ca578063dd62ed3e146107e8578063f79ed94b14610818578063f84afd4814610836578063f887ea4014610852578063fd3865e1146108705761027f565b8063bac385c414610708578063c7493abb14610724578063c838b07414610742578063c9ce0e8c14610760578063d484064114610790578063d547741f146107ae5761027f565b806395d89b411161012057806395d89b4114610620578063a217fddf1461063e578063a457c2d71461065c578063a9059cbb1461068c578063b6b55f25146106bc578063b6d0dcd8146106d85761027f565b806372f702f31461058e5780637aca573c146105ac578063853828b6146105ca5780638c00ca9d146105d457806391d14854146105f05761027f565b80632f2ff15d116101f55780634a1510b4116101b95780634a1510b4146104b85780635a3746ca146104d65780635f8e9e91146104f257806364b87a7014610522578063684cb2741461054057806370a082311461055e5761027f565b80632f2ff15d14610414578063313ce5671461043057806336568abe1461044e5780633902cbff1461046a57806339509351146104885761027f565b806318160ddd1161024757806318160ddd1461033e57806323b872dd1461035c578063248a9ca31461038c57806327b74a5d146103bc5780632e1a7d4d146103da5780632e5bd7ab146103f65761027f565b806301ffc9a71461028457806306fdde03146102b4578063095ea7b3146102d25780630ab8985b14610302578063147bd3af14610320575b600080fd5b61029e60048036038101906102999190613fb2565b61088e565b6040516102ab919061472f565b60405180910390f35b6102bc610908565b6040516102c991906147ec565b60405180910390f35b6102ec60048036038101906102e79190613e04565b61099a565b6040516102f9919061472f565b60405180910390f35b61030a6109b8565b6040516103179190614765565b60405180910390f35b6103286109de565b6040516103359190614aee565b60405180910390f35b6103466109e4565b6040516103539190614aee565b60405180910390f35b61037660048036038101906103719190613db1565b6109ee565b604051610383919061472f565b60405180910390f35b6103a660048036038101906103a19190613f45565b610aef565b6040516103b3919061474a565b60405180910390f35b6103c4610b0f565b6040516103d19190614aee565b60405180910390f35b6103f460048036038101906103ef9190613fdf565b610b15565b005b6103fe6110cb565b60405161040b9190614aee565b60405180910390f35b61042e60048036038101906104299190613f72565b6110d1565b005b610438611157565b6040516104459190614bd1565b60405180910390f35b61046860048036038101906104639190613f72565b611160565b005b6104726111e3565b60405161047f9190614aee565b60405180910390f35b6104a2600480360381019061049d9190613e04565b6111e9565b6040516104af919061472f565b60405180910390f35b6104c0611295565b6040516104cd9190614aee565b60405180910390f35b6104f060048036038101906104eb9190613e44565b61129b565b005b61050c60048036038101906105079190613fdf565b611b18565b6040516105199190614aee565b60405180910390f35b61052a611b5a565b6040516105379190614780565b60405180910390f35b610548611b80565b604051610555919061474a565b60405180910390f35b61057860048036038101906105739190613d44565b611ba4565b6040516105859190614aee565b60405180910390f35b610596611bec565b6040516105a391906147b6565b60405180910390f35b6105b4611c12565b6040516105c1919061479b565b60405180910390f35b6105d2611c38565b005b6105ee60048036038101906105e99190614039565b611ca4565b005b61060a60048036038101906106059190613f72565b611d14565b604051610617919061472f565b60405180910390f35b610628611d7f565b60405161063591906147ec565b60405180910390f35b610646611e11565b604051610653919061474a565b60405180910390f35b61067660048036038101906106719190613e04565b611e18565b604051610683919061472f565b60405180910390f35b6106a660048036038101906106a19190613e04565b611f0c565b6040516106b3919061472f565b60405180910390f35b6106d660048036038101906106d19190613fdf565b611f2a565b005b6106f260048036038101906106ed9190613fdf565b61212b565b6040516106ff9190614765565b60405180910390f35b610722600480360381019061071d9190613d44565b61216a565b005b61072c612216565b6040516107399190614aee565b60405180910390f35b61074a61221c565b6040516107579190614aee565b60405180910390f35b61077a60048036038101906107759190613fdf565b612222565b6040516107879190614aee565b60405180910390f35b61079861225e565b6040516107a59190614aee565b60405180910390f35b6107c860048036038101906107c39190613f72565b612264565b005b6107d2612285565b6040516107df9190614aee565b60405180910390f35b61080260048036038101906107fd9190613d71565b61228b565b60405161080f9190614aee565b60405180910390f35b610820612312565b60405161082d9190614636565b60405180910390f35b610850600480360381019061084b9190613d44565b612338565b005b61085a6123e4565b60405161086791906147d1565b60405180910390f35b61087861240a565b6040516108859190614765565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610901575061090082612430565b5b9050919050565b60606003805461091790614fe8565b80601f016020809104026020016040519081016040528092919081815260200182805461094390614fe8565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109ae6109a761249a565b84846124a2565b6001905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000600254905090565b60006109fb84848461266d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a4661249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd9061496e565b60405180910390fd5b610ae385610ad261249a565b8584610ade9190614e4e565b6124a2565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b60065481565b60003073ffffffffffffffffffffffffffffffffffffffff1663c9ce0e8c836040518263ffffffff1660e01b8152600401610b509190614aee565b60206040518083038186803b158015610b6857600080fd5b505afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba0919061400c565b905080610bac33611ba4565b1015610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be490614a2e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c4a9190614636565b60206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061400c565b905080831115610d3d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8285610cee9190614e4e565b6040518263ffffffff1660e01b8152600401610d0a9190614aee565b600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634ae2859c6007546008546040518363ffffffff1660e01b8152600401610da1929190614b09565b604080518083038186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190614079565b915091506000818684610e039190614df4565b610e0d9190614dc3565b9050600060135487601254610e229190614df4565b610e2c9190614dc3565b905080821115610e3a578091505b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401610ebb929190614706565b602060405180830381600087803b158015610ed557600080fd5b505af1158015610ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0d9190613f18565b905080610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690614a6e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33868c610f9c9190614e4e565b6040518363ffffffff1660e01b8152600401610fb9929190614706565b602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b9190613f18565b90508061104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906149ae565b60405180910390fd5b61105733896128ec565b88600660008282546110699190614e4e565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688a866040516110b8929190614b09565b60405180910390a2505050505050505050565b60155481565b6110da82610aef565b6110e381612ac0565b6110ed8383612ad4565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe7442843a65013dba5eebc77d5a00f5fafa588af0da4bf39250936d4783bb5538560405161114a919061474a565b60405180910390a3505050565b60006012905090565b61116861249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90614aae565b60405180910390fd5b6111df8282612af5565b5050565b60085481565b600061128b6111f661249a565b84846001600061120461249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112869190614d6d565b6124a2565b6001905092915050565b60135481565b80428110156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d6906148ee565b60405180910390fd5b7f29944e936a0f6e1cbaa227df218d7d6025c2a2785db840e42a3425f24e9e68ac61130981612ac0565b600a80549050855114611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906149ee565b60405180910390fd5b600a80549050845114611399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113909061490e565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561140357600080fd5b505af1158015611417573d6000803e3d6000fd5b505050506000600a8054905067ffffffffffffffff81111561143c5761143b615150565b5b60405190808252806020026020018201604052801561146a5781602001602082028036833780820191505090505b50905060005b600a8054905081101561157657600a818154811061149157611490615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114f49190614636565b60206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061400c565b82828151811061155757611556615121565b5b602002602001018181525050808061156e9061504b565b915050611470565b5061158381878787612bd7565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115e09190614636565b60206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611630919061400c565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392ce27f8836040518263ffffffff1660e01b815260040161168f9190614aee565b60206040518083038186803b1580156116a757600080fd5b505afa1580156116bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116df919061400c565b90506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631deae18c846040518263ffffffff1660e01b815260040161173e9190614aee565b60206040518083038186803b15801561175657600080fd5b505afa15801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e919061400c565b9050601354601254846117a19190614df4565b6117ab9190614dc3565b81836117b79190614d6d565b11156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906148ce565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401611857929190614706565b602060405180830381600087803b15801561187157600080fd5b505af1158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190613f18565b90506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161192c929190614706565b602060405180830381600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190613f18565b905081801561198a5750805b6119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c09061494e565b60405180910390fd5b60008385876119d89190614e4e565b6119e29190614e4e565b90506119ed81613080565b80600660008282546119ff9190614d6d565b9250508190555060065460085482611a179190614df4565b611a219190614dc3565b600781905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a564992336040518263ffffffff1660e01b8152600401611a829190614636565b600060405180830381600087803b158015611a9c57600080fd5b505af1158015611ab0573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f36c54fe3f6742709ba65ab76880ce98cbacfc0e2f273d55f4e4d50d8830c2600826006548888604051611b029493929190614b8c565b60405180910390a2505050505050505050505050565b600080611b236109e4565b1415611b325760009050611b55565b611b3a6109e4565b60065483611b489190614df4565b611b529190614dc3565b90505b919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f29944e936a0f6e1cbaa227df218d7d6025c2a2785db840e42a3425f24e9e68ac81565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c4333611ba4565b11611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a9061492e565b60405180910390fd5b6000611c96611c9133611ba4565b611b18565b9050611ca181610b15565b50565b6000801b611cb181612ac0565b82600f81905550816010819055503373ffffffffffffffffffffffffffffffffffffffff167fe8a0df875bece805d1b6bd1bf60bdf2abc88b51be72ed2bb5cd590532bc446a88484604051611d07929190614b09565b60405180910390a2505050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611d8e90614fe8565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba90614fe8565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b5050505050905090565b6000801b81565b60008060016000611e2761249a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614a8e565b60405180910390fd5b611f01611eef61249a565b858584611efc9190614e4e565b6124a2565b600191505092915050565b6000611f20611f1961249a565b848461266d565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611f8b93929190614651565b602060405180830381600087803b158015611fa557600080fd5b505af1158015611fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdd9190613f18565b90508061201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061498e565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff1663c9ce0e8c846040518263ffffffff1660e01b815260040161205a9190614aee565b60206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa919061400c565b90506120b63382613225565b82600660008282546120c89190614d6d565b925050819055506120d883613080565b3373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8460405161211e9190614aee565b60405180910390a2505050565b600a818154811061213b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b61217781612ac0565b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff76e779f769943b728cc826f493098475a7601f9ca3c1fa2696bc810f505056360405160405180910390a35050565b60145481565b60075481565b600080600654141561223657819050612259565b6006546122416109e4565b8361224c9190614df4565b6122569190614dc3565b90505b919050565b60105481565b61226d82610aef565b61227681612ac0565b6122808383612af5565b505050565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801b61234581612ac0565b81601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbd45c5f5d28e3962d234f9fa4e443f6f92e4525b10556e441307306fab9f9e0360405160405180910390a35050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125799061488e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126609190614aee565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d490614a0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127449061482e565b60405180910390fd5b612758838383613379565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d5906148ae565b60405180910390fd5b81816127ea9190614e4e565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287a9190614d6d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128de9190614aee565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612953906149ce565b60405180910390fd5b61296882600083613379565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e59061486e565b60405180910390fd5b81816129fa9190614e4e565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612a4e9190614e4e565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ab39190614aee565b60405180910390a3505050565b612ad181612acc61249a565b61337e565b50565b612add82610aef565b612ae681612ac0565b612af0838361341b565b505050565b612aff8282611d14565b15612bd35760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b7861249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008060005b8651811015612d9d5760006002888381518110612bfd57612bfc615121565b5b6020026020010151612c0f9190614dc3565b9050612cc0878381518110612c2757612c26615121565b5b6020026020010151600060028110612c4257612c41615121565b5b602002015182600a8581548110612c5c57612c5b615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898681518110612c9a57612c99615121565b5b6020026020010151600060028110612cb557612cb4615121565b5b6020020151896134fc565b84612ccb9190614d6d565b9350612d7c878381518110612ce357612ce2615121565b5b6020026020010151600160028110612cfe57612cfd615121565b5b602002015182600a8581548110612d1857612d17615121565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898681518110612d5657612d55615121565b5b6020026020010151600160028110612d7157612d70615121565b5b6020020151896134fc565b83612d879190614d6d565b9250508080612d959061504b565b915050612bdd565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e1d929190614706565b602060405180830381600087803b158015612e3757600080fd5b505af1158015612e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6f9190613f18565b50600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612eef929190614706565b602060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f419190613f18565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585601054600f5489612fd99190614df4565b612fe39190614dc3565b601054600f5489612ff49190614df4565b612ffe9190614dc3565b308b6040518963ffffffff1660e01b8152600401613023989796959493929190614688565b606060405180830381600087803b15801561303d57600080fd5b505af1158015613051573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307591906140b9565b505050505050505050565b600081116130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba9061484e565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613142929190614706565b602060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131949190613f18565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b81526004016131f09190614aee565b600060405180830381600087803b15801561320a57600080fd5b505af115801561321e573d6000803e3d6000fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328c90614ace565b60405180910390fd5b6132a160008383613379565b80600260008282546132b39190614d6d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133089190614d6d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161336d9190614aee565b60405180910390a35050565b505050565b6133888282611d14565b613417576133ad8173ffffffffffffffffffffffffffffffffffffffff1660146136b2565b6133bb8360001c60206136b2565b6040516020016133cc9291906145fc565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340e91906147ec565b60405180910390fd5b5050565b6134258282611d14565b6134f85760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061349d61249a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060028651106136a5578373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b8152600401613564929190614706565b602060405180830381600087803b15801561357e57600080fd5b505af1158015613592573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135b69190613f18565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed173987868a30886040518663ffffffff1660e01b815260040161361c959493929190614b32565b600060405180830381600087803b15801561363657600080fd5b505af115801561364a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906136739190613ecf565b905080600182516136849190614e4e565b8151811061369557613694615121565b5b60200260200101519150506136a9565b8490505b95945050505050565b6060600060028360026136c59190614df4565b6136cf9190614d6d565b67ffffffffffffffff8111156136e8576136e7615150565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061375257613751615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106137b6576137b5615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026137f69190614df4565b6138009190614d6d565b90505b60018111156138a0577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061384257613841615121565b5b1a60f81b82828151811061385957613858615121565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061389990614fbe565b9050613803565b50600084146138e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138db9061480e565b60405180910390fd5b8091505092915050565b60006139016138fc84614c11565b614bec565b9050808382526020820190508285602086028201111561392457613923615184565b5b60005b85811015613954578161393a8882613bb8565b845260208401935060208301925050600181019050613927565b5050509392505050565b600061397161396c84614c3d565b614bec565b9050808285602086028201111561398b5761398a615184565b5b60005b858110156139d957813567ffffffffffffffff8111156139b1576139b061517f565b5b8086016139be8982613bcd565b8552602085019450602084019350505060018101905061398e565b5050509392505050565b60006139f66139f184614c63565b614bec565b90508083825260208201905082856020860282011115613a1957613a18615184565b5b60005b85811015613a6757813567ffffffffffffffff811115613a3f57613a3e61517f565b5b808601613a4c8982613bfb565b85526020850194506020840193505050600181019050613a1c565b5050509392505050565b6000613a84613a7f84614c8f565b614bec565b90508083825260208201905082856040860282011115613aa757613aa6615184565b5b60005b85811015613ad75781613abd8882613c82565b845260208401935060408301925050600181019050613aaa565b5050509392505050565b6000613af4613aef84614cbb565b614bec565b90508082856020860282011115613b0e57613b0d615184565b5b60005b85811015613b3e5781613b248882613d1a565b845260208401935060208301925050600181019050613b11565b5050509392505050565b6000613b5b613b5684614ce1565b614bec565b90508083825260208201905082856020860282011115613b7e57613b7d615184565b5b60005b85811015613bae5781613b948882613d2f565b845260208401935060208301925050600181019050613b81565b5050509392505050565b600081359050613bc781615805565b92915050565b600082601f830112613be257613be161517f565b5b8135613bf28482602086016138ee565b91505092915050565b600082601f830112613c1057613c0f61517f565b5b6002613c1d84828561395e565b91505092915050565b600082601f830112613c3b57613c3a61517f565b5b8135613c4b8482602086016139e3565b91505092915050565b600082601f830112613c6957613c6861517f565b5b8135613c79848260208601613a71565b91505092915050565b600082601f830112613c9757613c9661517f565b5b6002613ca4848285613ae1565b91505092915050565b600082601f830112613cc257613cc161517f565b5b8151613cd2848260208601613b48565b91505092915050565b600081519050613cea8161581c565b92915050565b600081359050613cff81615833565b92915050565b600081359050613d148161584a565b92915050565b600081359050613d2981615861565b92915050565b600081519050613d3e81615861565b92915050565b600060208284031215613d5a57613d5961518e565b5b6000613d6884828501613bb8565b91505092915050565b60008060408385031215613d8857613d8761518e565b5b6000613d9685828601613bb8565b9250506020613da785828601613bb8565b9150509250929050565b600080600060608486031215613dca57613dc961518e565b5b6000613dd886828701613bb8565b9350506020613de986828701613bb8565b9250506040613dfa86828701613d1a565b9150509250925092565b60008060408385031215613e1b57613e1a61518e565b5b6000613e2985828601613bb8565b9250506020613e3a85828601613d1a565b9150509250929050565b600080600060608486031215613e5d57613e5c61518e565b5b600084013567ffffffffffffffff811115613e7b57613e7a615189565b5b613e8786828701613c26565b935050602084013567ffffffffffffffff811115613ea857613ea7615189565b5b613eb486828701613c54565b9250506040613ec586828701613d1a565b9150509250925092565b600060208284031215613ee557613ee461518e565b5b600082015167ffffffffffffffff811115613f0357613f02615189565b5b613f0f84828501613cad565b91505092915050565b600060208284031215613f2e57613f2d61518e565b5b6000613f3c84828501613cdb565b91505092915050565b600060208284031215613f5b57613f5a61518e565b5b6000613f6984828501613cf0565b91505092915050565b60008060408385031215613f8957613f8861518e565b5b6000613f9785828601613cf0565b9250506020613fa885828601613bb8565b9150509250929050565b600060208284031215613fc857613fc761518e565b5b6000613fd684828501613d05565b91505092915050565b600060208284031215613ff557613ff461518e565b5b600061400384828501613d1a565b91505092915050565b6000602082840312156140225761402161518e565b5b600061403084828501613d2f565b91505092915050565b600080604083850312156140505761404f61518e565b5b600061405e85828601613d1a565b925050602061406f85828601613d1a565b9150509250929050565b600080604083850312156140905761408f61518e565b5b600061409e85828601613d2f565b92505060206140af85828601613d2f565b9150509250929050565b6000806000606084860312156140d2576140d161518e565b5b60006140e086828701613d2f565b93505060206140f186828701613d2f565b925050604061410286828701613d2f565b9150509250925092565b60006141188383614124565b60208301905092915050565b61412d81614e82565b82525050565b61413c81614e82565b82525050565b600061414d82614d1d565b6141578185614d40565b935061416283614d0d565b8060005b8381101561419357815161417a888261410c565b975061418583614d33565b925050600181019050614166565b5085935050505092915050565b6141a981614e94565b82525050565b6141b881614ea0565b82525050565b6141c781614f0d565b82525050565b6141d681614f1f565b82525050565b6141e581614f31565b82525050565b6141f481614f43565b82525050565b61420381614f55565b82525050565b600061421482614d28565b61421e8185614d51565b935061422e818560208601614f8b565b61423781615193565b840191505092915050565b600061424d82614d28565b6142578185614d62565b9350614267818560208601614f8b565b80840191505092915050565b6000614280602083614d51565b915061428b826151a4565b602082019050919050565b60006142a3602383614d51565b91506142ae826151cd565b604082019050919050565b60006142c6602c83614d51565b91506142d18261521c565b604082019050919050565b60006142e9602283614d51565b91506142f48261526b565b604082019050919050565b600061430c602283614d51565b9150614317826152ba565b604082019050919050565b600061432f602683614d51565b915061433a82615309565b604082019050919050565b6000614352601883614d51565b915061435d82615358565b602082019050919050565b6000614375601083614d51565b915061438082615381565b602082019050919050565b6000614398604083614d51565b91506143a3826153aa565b604082019050919050565b60006143bb601c83614d51565b91506143c6826153f9565b602082019050919050565b60006143de601383614d51565b91506143e982615422565b602082019050919050565b6000614401602883614d51565b915061440c8261544b565b604082019050919050565b6000614424602183614d51565b915061442f8261549a565b604082019050919050565b6000614447602483614d51565b9150614452826154e9565b604082019050919050565b600061446a602183614d51565b915061447582615538565b604082019050919050565b600061448d603883614d51565b915061449882615587565b604082019050919050565b60006144b0602583614d51565b91506144bb826155d6565b604082019050919050565b60006144d3603883614d51565b91506144de82615625565b604082019050919050565b60006144f6602483614d51565b915061450182615674565b604082019050919050565b6000614519601f83614d51565b9150614524826156c3565b602082019050919050565b600061453c601783614d62565b9150614547826156ec565b601782019050919050565b600061455f602583614d51565b915061456a82615715565b604082019050919050565b6000614582601183614d62565b915061458d82615764565b601182019050919050565b60006145a5602f83614d51565b91506145b08261578d565b604082019050919050565b60006145c8601f83614d51565b91506145d3826157dc565b602082019050919050565b6145e781614ef6565b82525050565b6145f681614f00565b82525050565b60006146078261452f565b91506146138285614242565b915061461e82614575565b915061462a8284614242565b91508190509392505050565b600060208201905061464b6000830184614133565b92915050565b60006060820190506146666000830186614133565b6146736020830185614133565b61468060408301846145de565b949350505050565b60006101008201905061469e600083018b614133565b6146ab602083018a614133565b6146b860408301896145de565b6146c560608301886145de565b6146d260808301876145de565b6146df60a08301866145de565b6146ec60c0830185614133565b6146f960e08301846145de565b9998505050505050505050565b600060408201905061471b6000830185614133565b61472860208301846145de565b9392505050565b600060208201905061474460008301846141a0565b92915050565b600060208201905061475f60008301846141af565b92915050565b600060208201905061477a60008301846141be565b92915050565b600060208201905061479560008301846141cd565b92915050565b60006020820190506147b060008301846141dc565b92915050565b60006020820190506147cb60008301846141eb565b92915050565b60006020820190506147e660008301846141fa565b92915050565b600060208201905081810360008301526148068184614209565b905092915050565b6000602082019050818103600083015261482781614273565b9050919050565b6000602082019050818103600083015261484781614296565b9050919050565b60006020820190508181036000830152614867816142b9565b9050919050565b60006020820190508181036000830152614887816142dc565b9050919050565b600060208201905081810360008301526148a7816142ff565b9050919050565b600060208201905081810360008301526148c781614322565b9050919050565b600060208201905081810360008301526148e781614345565b9050919050565b6000602082019050818103600083015261490781614368565b9050919050565b600060208201905081810360008301526149278161438b565b9050919050565b60006020820190508181036000830152614947816143ae565b9050919050565b60006020820190508181036000830152614967816143d1565b9050919050565b60006020820190508181036000830152614987816143f4565b9050919050565b600060208201905081810360008301526149a781614417565b9050919050565b600060208201905081810360008301526149c78161443a565b9050919050565b600060208201905081810360008301526149e78161445d565b9050919050565b60006020820190508181036000830152614a0781614480565b9050919050565b60006020820190508181036000830152614a27816144a3565b9050919050565b60006020820190508181036000830152614a47816144c6565b9050919050565b60006020820190508181036000830152614a67816144e9565b9050919050565b60006020820190508181036000830152614a878161450c565b9050919050565b60006020820190508181036000830152614aa781614552565b9050919050565b60006020820190508181036000830152614ac781614598565b9050919050565b60006020820190508181036000830152614ae7816145bb565b9050919050565b6000602082019050614b0360008301846145de565b92915050565b6000604082019050614b1e60008301856145de565b614b2b60208301846145de565b9392505050565b600060a082019050614b4760008301886145de565b614b5460208301876145de565b8181036040830152614b668186614142565b9050614b756060830185614133565b614b8260808301846145de565b9695505050505050565b6000608082019050614ba160008301876145de565b614bae60208301866145de565b614bbb60408301856145de565b614bc860608301846145de565b95945050505050565b6000602082019050614be660008301846145ed565b92915050565b6000614bf6614c07565b9050614c02828261501a565b919050565b6000604051905090565b600067ffffffffffffffff821115614c2c57614c2b615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c5857614c57615150565b5b602082029050919050565b600067ffffffffffffffff821115614c7e57614c7d615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614caa57614ca9615150565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614cd657614cd5615150565b5b602082029050919050565b600067ffffffffffffffff821115614cfc57614cfb615150565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d7882614ef6565b9150614d8383614ef6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614db857614db7615094565b5b828201905092915050565b6000614dce82614ef6565b9150614dd983614ef6565b925082614de957614de86150c3565b5b828204905092915050565b6000614dff82614ef6565b9150614e0a83614ef6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e4357614e42615094565b5b828202905092915050565b6000614e5982614ef6565b9150614e6483614ef6565b925082821015614e7757614e76615094565b5b828203905092915050565b6000614e8d82614ed6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614f1882614f67565b9050919050565b6000614f2a82614f67565b9050919050565b6000614f3c82614f67565b9050919050565b6000614f4e82614f67565b9050919050565b6000614f6082614f67565b9050919050565b6000614f7282614f79565b9050919050565b6000614f8482614ed6565b9050919050565b60005b83811015614fa9578082015181840152602081019050614f8e565b83811115614fb8576000848401525b50505050565b6000614fc982614ef6565b91506000821415614fdd57614fdc615094565b5b600182039050919050565b6000600282049050600182168061500057607f821691505b60208210811415615014576150136150f2565b5b50919050565b61502382615193565b810181811067ffffffffffffffff8211171561504257615041615150565b5b80604052505050565b600061505682614ef6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561508957615088615094565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420696e7665737420696e206661726d2062656361757365205f6c60008201527f70416d6f756e7420697320300000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f506572666f726d616e63652066656520746f6f20686967680000000000000000600082015250565b7f4661726d426f743a204558504952454400000000000000000000000000000000600082015250565b7f506172616d65746572205f6d696e416d6f756e74734f7574206d75737420686160008201527f7665206c656e67746820657175616c20746f2072657761726473546f6b656e73602082015250565b7f43616e6e6f74207769746864726177207a65726f2062616c616e636500000000600082015250565b7f53656e64696e672066656573206661696c656400000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642c2061626f7274696e67206465706f736960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73666572206661696c65642c2061626f7274696e672077697468647260008201527f6177616c00000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f506172616d65746572205f7061746873206d7573742068617665206c656e677460008201527f6820657175616c20746f2072657761726473546f6b656e730000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207769746864726177206d6f7265207468616e2074686520746f60008201527f74616c2062616c616e6365206f6620746865206f776e65720000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f466565206661696c65642c2061626f7274696e67207769746864726177616c00600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61580e81614e82565b811461581957600080fd5b50565b61582581614e94565b811461583057600080fd5b50565b61583c81614ea0565b811461584757600080fd5b50565b61585381614eaa565b811461585e57600080fd5b50565b61586a81614ef6565b811461587557600080fd5b5056fea2646970667358221220e0aa4b0dff59ba6e96d0c2a7dd179f23569bd1396d38515e1ebe4503883e711064736f6c63430008070033