FTM Price: $0.5125 (-4.90%)
Gas: 1.1 GWei

Contract

0xfD3B4a158acE6CC49Fe4EA86C7A462f0C0b902aC
 

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

FTM Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exercise1046609512025-02-13 19:34:112 days ago1739475251IN
0xfD3B4a15...0C0b902aC
0 FTM0.001215362.5
Exercise1046266252025-02-13 6:00:593 days ago1739426459IN
0xfD3B4a15...0C0b902aC
0 FTM0.00132562.70932973
Exercise1046085182025-02-12 22:52:433 days ago1739400763IN
0xfD3B4a15...0C0b902aC
0 FTM0.001068362
Exercise1042298662025-02-07 0:57:299 days ago1738889849IN
0xfD3B4a15...0C0b902aC
0 FTM0.001230262.53065092
Exercise1042006362025-02-06 13:46:479 days ago1738849607IN
0xfD3B4a15...0C0b902aC
0 FTM0.001496832.93973808
Exercise1041582492025-02-05 21:45:1610 days ago1738791916IN
0xfD3B4a15...0C0b902aC
0 FTM0.001032452
Exercise1041187092025-02-05 6:03:5711 days ago1738735437IN
0xfD3B4a15...0C0b902aC
0 FTM0.001544133
Exercise1040771302025-02-04 14:16:4311 days ago1738678603IN
0xfD3B4a15...0C0b902aC
0 FTM0.001252282.55947378
Exercise1039577022025-02-02 19:42:1713 days ago1738525337IN
0xfD3B4a15...0C0b902aC
0 FTM0.001039022
Exercise1037389112025-01-30 8:45:4116 days ago1738226741IN
0xfD3B4a15...0C0b902aC
0 FTM0.001065332
Exercise1037200562025-01-30 0:55:1117 days ago1738198511IN
0xfD3B4a15...0C0b902aC
0 FTM0.001272932.5
Exercise1037125662025-01-29 21:48:1617 days ago1738187296IN
0xfD3B4a15...0C0b902aC
0 FTM0.001032452
Exercise1036779782025-01-29 7:59:0318 days ago1738137543IN
0xfD3B4a15...0C0b902aC
0 FTM0.001029422
Exercise1036754322025-01-29 6:57:4918 days ago1738133869IN
0xfD3B4a15...0C0b902aC
0 FTM0.001544133
Exercise1036639802025-01-29 1:37:3118 days ago1738114651IN
0xfD3B4a15...0C0b902aC
0 FTM0.001797954
Exercise1036293992025-01-28 12:01:0718 days ago1738065667IN
0xfD3B4a15...0C0b902aC
0 FTM0.001401522.5
Exercise1036164002025-01-28 6:35:2819 days ago1738046128IN
0xfD3B4a15...0C0b902aC
0 FTM0.001223182.5
Exercise1036143682025-01-28 5:53:0119 days ago1738043581IN
0xfD3B4a15...0C0b902aC
0 FTM0.001029422
Exercise1036127262025-01-28 5:08:4219 days ago1738040922IN
0xfD3B4a15...0C0b902aC
0 FTM0.001211182.5
Exercise1035539992025-01-27 6:17:0520 days ago1737958625IN
0xfD3B4a15...0C0b902aC
0 FTM0.00106532
Exercise1034998212025-01-26 8:58:2320 days ago1737881903IN
0xfD3B4a15...0C0b902aC
0 FTM0.001241232
Exercise1033749042025-01-24 7:44:3123 days ago1737704671IN
0xfD3B4a15...0C0b902aC
0 FTM0.001029372
Exercise1033433112025-01-23 20:01:4223 days ago1737662502IN
0xfD3B4a15...0C0b902aC
0 FTM0.000550211.09332488
Exercise1033300872025-01-23 15:50:3723 days ago1737647437IN
0xfD3B4a15...0C0b902aC
0 FTM0.0194790645.05226841
Exercise1033129952025-01-23 9:26:4123 days ago1737624401IN
0xfD3B4a15...0C0b902aC
0 FTM0.001029422
View all transactions

Latest 1 internal transaction

Parent Transaction Hash Block From To
683923872023-09-20 23:50:27514 days ago1695253827  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SimpleExerciseHelper

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 7 : SimpleExerciseHelperFVM.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity 0.8.17;

import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

interface IoToken is IERC20 {
    function exercise(
        uint256 _amount,
        uint256 _maxPaymentAmount,
        address _recipient
    ) external returns (uint256);

    function getDiscountedPrice(
        uint256 _amount
    ) external view returns (uint256);

    function discount() external view returns (uint256);

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

interface IBalancer {
    function flashLoan(
        address recipient,
        address[] memory tokens,
        uint256[] memory amounts,
        bytes memory userData
    ) external;
}

interface IRouter {
    struct route {
        address from;
        address to;
        bool stable;
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function getAmountOut(
        uint amountIn,
        address tokenIn,
        address tokenOut,
        bool stable
    ) external view returns (uint amount);
}

/**
 * @title Simple Exercise Helper
 * @notice This contract easily converts oTokens paired with WFTM
 *  such as oFVM to WFTM using flash loans.
 */

contract SimpleExerciseHelper is Ownable2Step {
    /// @notice WFTM, payment token
    IERC20 internal constant wftm =
        IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83);

    /// @notice Flashloan from Balancer vault
    IBalancer internal constant balancerVault =
        IBalancer(0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce);

    /// @notice FVM router for swaps
    IRouter internal constant router =
        IRouter(0x2E14B53E2cB669f3A974CeaF6C735e134F3Aa9BC);

    /// @notice Check whether we are in the middle of a flashloan (used for callback)
    bool public flashEntered;

    /// @notice Where we send our 0.25% fee
    address public feeAddress = 0x58761D6C6bF6c4bab96CaE125a2e5c8B1859b48a;

    uint256 public fee = 25;

    uint256 internal constant MAX_BPS = 10_000;
    uint256 internal constant DISCOUNT_DENOMINATOR = 100;

    /**
     * @notice Check if spot swap and exercising fall are similar enough for our liking.
     * @param _oToken The option token we are exercising.
     * @param _optionTokenAmount The amount of oToken to exercise to WFTM.
     * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes.
     * @return paymentTokenNeeded How much payment token is needed for given amount of oToken.
     * @return withinSlippageTolerance Whether expected vs real profit fall within our slippage tolerance.
     * @return realProfit Simulated profit in paymentToken after repaying flash loan.
     * @return expectedProfit Calculated ideal profit based on redemption discount plus allowed slippage.
     * @return profitSlippage Expected profit slippage with given oToken amount, 18 decimals. Zero
     *  means extra profit (positive slippage).
     */
    function quoteExerciseProfit(
        address _oToken,
        uint256 _optionTokenAmount,
        uint256 _profitSlippageAllowed
    )
        public
        view
        returns (
            uint256 paymentTokenNeeded,
            bool withinSlippageTolerance,
            uint256 realProfit,
            uint256 expectedProfit,
            uint256 profitSlippage
        )
    {
        if (_optionTokenAmount == 0) {
            revert("Can't exercise zero");
        }
        if (_profitSlippageAllowed > MAX_BPS) {
            revert("Slippage must be less than 10,000");
        }

        // figure out how much WFTM we need for our oToken amount
        paymentTokenNeeded = IoToken(_oToken).getDiscountedPrice(
            _optionTokenAmount
        );

        // compare our token needed to spot price
        uint256 spotPaymentTokenReceived = router.getAmountOut(
            _optionTokenAmount,
            IoToken(_oToken).underlyingToken(),
            address(wftm),
            false
        );
        realProfit = spotPaymentTokenReceived - paymentTokenNeeded;

        // calculate our ideal profit using the discount
        uint256 discount = IoToken(_oToken).discount();
        expectedProfit =
            (paymentTokenNeeded * (DISCOUNT_DENOMINATOR - discount)) /
            discount;

        // if profitSlippage returns zero, we have positive slippage (extra profit)
        if (expectedProfit > realProfit) {
            profitSlippage = 1e18 - ((realProfit * 1e18) / expectedProfit);
        }

        // allow for our expected slippage as well
        expectedProfit =
            (expectedProfit * (MAX_BPS - _profitSlippageAllowed)) /
            MAX_BPS;

        // check if real profit is greater than expected when accounting for allowed slippage
        if (realProfit > expectedProfit) {
            withinSlippageTolerance = true;
        }
    }

    /**
     * @notice Exercise our oToken for WFTM.
     * @param _oToken The option token we are exercising.
     * @param _amount The amount of oToken to exercise to WFTM.
     * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes.
     * @param _swapSlippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM.
     */
    function exercise(
        address _oToken,
        uint256 _amount,
        uint256 _profitSlippageAllowed,
        uint256 _swapSlippageAllowed
    ) external {
        // first person does the approvals for everyone else, what a nice person!
        _checkAllowance(_oToken);

        // transfer option token to this contract
        _safeTransferFrom(_oToken, msg.sender, address(this), _amount);

        // check that slippage tolerance for profit is okay
        (
            uint256 paymentTokenNeeded,
            bool withinSlippageTolerance,
            ,
            ,

        ) = quoteExerciseProfit(_oToken, _amount, _profitSlippageAllowed);

        if (!withinSlippageTolerance) {
            revert("Profit not within slippage tolerance, check TWAP");
        }

        // get our flash loan started
        _borrowPaymentToken(_oToken, paymentTokenNeeded, _swapSlippageAllowed);

        // send remaining profit back to user
        _safeTransfer(address(wftm), msg.sender, wftm.balanceOf(address(this)));
    }

    /**
     * @notice Flash loan our WFTM from Balancer.
     * @param _oToken The option token we are exercising.
     * @param _amountNeeded The amount of WFTM needed.
     * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM.
     */
    function _borrowPaymentToken(
        address _oToken,
        uint256 _amountNeeded,
        uint256 _slippageAllowed
    ) internal {
        // change our state
        flashEntered = true;

        // create our input args
        address[] memory tokens = new address[](1);
        tokens[0] = address(wftm);

        uint256[] memory amounts = new uint256[](1);
        amounts[0] = _amountNeeded;

        bytes memory userData = abi.encode(
            _oToken,
            _amountNeeded,
            _slippageAllowed
        );

        // call the flash loan
        balancerVault.flashLoan(address(this), tokens, amounts, userData);
    }

    /**
     * @notice Fallback function used during flash loans.
     * @dev May only be called by balancer vault as part of
     *  flash loan callback.
     * @param _tokens The tokens we are swapping (in our case, only WFTM).
     * @param _amounts The amounts of said tokens.
     * @param _feeAmounts The fee amounts for said tokens.
     * @param _userData Payment token amount passed from our flash loan.
     */
    function receiveFlashLoan(
        address[] memory _tokens,
        uint256[] memory _amounts,
        uint256[] memory _feeAmounts,
        bytes memory _userData
    ) external {
        // only balancer vault may call this, during a flash loan
        if (msg.sender != address(balancerVault)) {
            revert("Only balancer vault can call");
        }
        if (!flashEntered) {
            revert("Flashloan not in progress");
        }

        // pull our option info from the userData
        (
            address _oToken,
            uint256 paymentTokenNeeded,
            uint256 slippageAllowed
        ) = abi.decode(_userData, (address, uint256, uint256));

        // exercise our option with our new WFTM, swap all underlying to WFTM
        uint256 optionTokenBalance = IoToken(_oToken).balanceOf(address(this));
        _exerciseAndSwap(
            _oToken,
            optionTokenBalance,
            paymentTokenNeeded,
            slippageAllowed
        );

        // check our output and take fees
        uint256 wftmAmount = wftm.balanceOf(address(this));
        _takeFees(wftmAmount);

        // repay our flash loan
        uint256 payback = _amounts[0] + _feeAmounts[0];
        _safeTransfer(address(wftm), address(balancerVault), payback);
        flashEntered = false;
    }

    /**
     * @notice Exercise our oToken, then swap underlying to WFTM.
     * @param _oToken The option token we are exercising.
     * @param _optionTokenAmount Amount of oToken to exercise.
     * @param _paymentTokenAmount Amount of WFTM needed to pay for exercising.
     * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM.
     */
    function _exerciseAndSwap(
        address _oToken,
        uint256 _optionTokenAmount,
        uint256 _paymentTokenAmount,
        uint256 _slippageAllowed
    ) internal {
        // pull our underlying from the oToken
        IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken());

        // exercise
        IoToken(_oToken).exercise(
            _optionTokenAmount,
            _paymentTokenAmount,
            address(this)
        );
        uint256 underlyingReceived = underlying.balanceOf(address(this));

        IRouter.route[] memory tokenToWftm = new IRouter.route[](1);
        tokenToWftm[0] = IRouter.route(
            address(underlying),
            address(wftm),
            false
        );

        // use this to minimize issues with slippage (swapping with too much size)
        uint256 wftmPerToken = router.getAmountOut(
            1e18,
            address(underlying),
            address(wftm),
            false
        );
        uint256 minAmountOut = (underlyingReceived *
            wftmPerToken *
            (MAX_BPS - _slippageAllowed)) / (1e18 * MAX_BPS);

        // use our router to swap from underlying to WFTM
        router.swapExactTokensForTokens(
            underlyingReceived,
            minAmountOut,
            tokenToWftm,
            address(this),
            block.timestamp
        );
    }

    /**
     * @notice Apply fees to our after-swap total.
     * @dev Default is 0.25% but this may be updated later.
     * @param _amount Amount to apply our fee to.
     */
    function _takeFees(uint256 _amount) internal {
        uint256 toSend = (_amount * fee) / MAX_BPS;
        _safeTransfer(address(wftm), feeAddress, toSend);
    }

    // helper to approve new oTokens to spend WFTM, etc. from this contract
    function _checkAllowance(address _oToken) internal {
        if (wftm.allowance(address(this), _oToken) == 0) {
            wftm.approve(_oToken, type(uint256).max);

            // approve router to spend underlying from this contract
            IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken());
            underlying.approve(address(router), type(uint256).max);
        }
    }

    /**
     * @notice Sweep out tokens accidentally sent here.
     * @dev May only be called by owner.
     * @param _tokenAddress Address of token to sweep.
     * @param _tokenAmount Amount of tokens to sweep.
     */
    function recoverERC20(
        address _tokenAddress,
        uint256 _tokenAmount
    ) external onlyOwner {
        _safeTransfer(_tokenAddress, owner(), _tokenAmount);
    }

    /**
     * @notice
     *  Update fee for oToken -> WFTM conversion.
     * @param _recipient Fee recipient address.
     * @param _newFee New fee, out of 10,000.
     */
    function setFee(address _recipient, uint256 _newFee) external onlyOwner {
        if (_newFee > DISCOUNT_DENOMINATOR) {
            revert("Fee max is 1%");
        }
        fee = _newFee;
        feeAddress = _recipient;
    }

    /* ========== HELPER FUNCTIONS ========== */

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, value)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                IERC20.transferFrom.selector,
                from,
                to,
                value
            )
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

File 2 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

File 3 of 7 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

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

pragma solidity ^0.8.0;

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

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

File 5 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 6 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

File 7 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"},{"internalType":"uint256","name":"_swapSlippageAllowed","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_optionTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"}],"name":"quoteExerciseProfit","outputs":[{"internalType":"uint256","name":"paymentTokenNeeded","type":"uint256"},{"internalType":"bool","name":"withinSlippageTolerance","type":"bool"},{"internalType":"uint256","name":"realProfit","type":"uint256"},{"internalType":"uint256","name":"expectedProfit","type":"uint256"},{"internalType":"uint256","name":"profitSlippage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527358761d6c6bf6c4bab96cae125a2e5c8b1859b48a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060196003553480156200006b57600080fd5b506200008c620000806200009260201b60201c565b6200009a60201b60201c565b6200019c565b600033905090565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620000d581620000d860201b62000bfd1760201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cf180620001ac6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b94506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a007321be370d5312f44cb42ce377bc9b8a0cef1a4c837320dd72ed959b6147912c2e529f0a0c651c33c9ce83610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57321be370d5312f44cb42ce377bc9b8a0cef1a4c83337321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b60200260200101819052506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a7640000867321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b9050732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b90506113097321be370d5312f44cb42ce377bc9b8a0cef1a4c83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f577321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b5090507321be370d5312f44cb42ce377bc9b8a0cef1a4c83816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b60405160208183030381529060405290507320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea26469706673582212201006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c17764736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b94506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a007321be370d5312f44cb42ce377bc9b8a0cef1a4c837320dd72ed959b6147912c2e529f0a0c651c33c9ce83610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57321be370d5312f44cb42ce377bc9b8a0cef1a4c83337321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b60200260200101819052506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a7640000867321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b9050732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b90506113097321be370d5312f44cb42ce377bc9b8a0cef1a4c83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f577321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b5090507321be370d5312f44cb42ce377bc9b8a0cef1a4c83816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b60405160208183030381529060405290507320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea26469706673582212201006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c17764736f6c63430008110033

Deployed Bytecode Sourcemap

1404:12037:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1971:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3148:1893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;1824:101:0;;;:::i;:::-;;1734:212:1;;;:::i;:::-;;11976:176:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:23:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;847:99:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12333:228:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7850:1318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1139:178:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5449:1034:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1971:24;;;;;;;;;;;;;:::o;2046:70::-;;;;;;;;;;;;;:::o;3148:1893::-;3342:26;3382:28;3424:18;3456:22;3492;3565:1;3543:18;:23;3539:83;;3582:29;;;;;;;;;;:::i;:::-;;;;;;;;3539:83;2189:6;3635:22;:32;3631:106;;;3683:43;;;;;;;;;;:::i;:::-;;;;;;;;3631:106;3842:7;3834:35;;;3883:18;3834:77;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3813:98;;3972:32;1835:42;4007:19;;;4040:18;4080:7;4072:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1539:42;4147:5;4007:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3972:190;;4212:18;4185:24;:45;;;;:::i;:::-;4172:58;;4298:16;4325:7;4317:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4298:46;;4454:8;4429;2250:3;4406:31;;;;:::i;:::-;4384:18;:54;;;;:::i;:::-;4383:79;;;;:::i;:::-;4354:108;;4578:10;4561:14;:27;4557:120;;;4651:14;4643:4;4630:10;:17;;;;:::i;:::-;4629:36;;;;:::i;:::-;4621:4;:45;;;;:::i;:::-;4604:62;;4557:120;2189:6;4796:22;2189:6;4786:32;;;;:::i;:::-;4768:14;:51;;;;:::i;:::-;4767:75;;;;:::i;:::-;4738:104;;4964:14;4951:10;:27;4947:88;;;5020:4;4994:30;;4947:88;3529:1512;;3148:1893;;;;;;;;;:::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1734:212:1:-;1786:14;1803:12;:10;:12::i;:::-;1786:29;;1851:6;1833:24;;:14;:12;:14::i;:::-;:24;;;1825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1913:26;1932:6;1913:18;:26::i;:::-;1776:170;1734:212::o;11976:176:6:-;1094:13:0;:11;:13::i;:::-;12094:51:6::1;12108:13;12123:7;:5;:7::i;:::-;12132:12;12094:13;:51::i;:::-;11976:176:::0;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2123:23:6:-;;;;:::o;847:99:1:-;900:7;926:13;;;;;;;;;;;919:20;;847:99;:::o;12333:228:6:-;1094:13:0;:11;:13::i;:::-;2250:3:6::1;12419:7;:30;12415:84;;;12465:23;;;;;;;;;;:::i;:::-;;;;;;;;12415:84;12514:7;12508:3;:13;;;;12544:10;12531;;:23;;;;;;;;;;;;;;;;;;12333:228:::0;;:::o;7850:1318::-;1697:42;8110:36;;:10;:36;;;8106:105;;8162:38;;;;;;;;;;:::i;:::-;;;;;;;;8106:105;8225:12;;;;;;;;;;;8220:79;;8253:35;;;;;;;;;;:::i;:::-;;;;;;;;8220:79;8373:15;8402:26;8442:23;8489:9;8478:50;;;;;;;;;;;;:::i;:::-;8359:169;;;;;;8617:26;8654:7;8646:26;;;8681:4;8646:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8617:70;;8697:140;8727:7;8748:18;8780;8812:15;8697:16;:140::i;:::-;8890:18;1539:42;8911:14;;;8934:4;8911:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8890:50;;8950:21;8960:10;8950:9;:21::i;:::-;9014:15;9046:11;9058:1;9046:14;;;;;;;;:::i;:::-;;;;;;;;9032:8;9041:1;9032:11;;;;;;;;:::i;:::-;;;;;;;;:28;;;;:::i;:::-;9014:46;;9070:61;1539:42;1697;9123:7;9070:13;:61::i;:::-;9156:5;9141:12;;:20;;;;;;;;;;;;;;;;;;8030:1138;;;;;;7850:1318;;;;:::o;1139:178:1:-;1094:13:0;:11;:13::i;:::-;1244:8:1::1;1228:13;;:24;;;;;;;;;;;;;;;;;;1301:8;1267:43;;1292:7;:5;:7::i;:::-;1267:43;;;;;;;;;;;;1139:178:::0;:::o;5449:1034:6:-;5702:24;5718:7;5702:15;:24::i;:::-;5787:62;5805:7;5814:10;5834:4;5841:7;5787:17;:62::i;:::-;5934:26;5974:28;6045:61;6065:7;6074;6083:22;6045:19;:61::i;:::-;5920:186;;;;;;;6122:23;6117:113;;6161:58;;;;;;;;;;:::i;:::-;;;;;;;;6117:113;6278:70;6298:7;6307:18;6327:20;6278:19;:70::i;:::-;6405:71;1539:42;6434:10;1539:42;6446:14;;;6469:4;6446:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6405:13;:71::i;:::-;5610:873;;5449:1034;;;;:::o;2426:187:0:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;1501:153:1:-;1590:13;;1583:20;;;;;;;;;;;1613:34;1638:8;1613:24;:34::i;:::-;1501:153;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;12617:336:6:-;12729:1;12709:5;:17;;;:21;12701:30;;;;;;12742:12;12756:17;12777:5;:10;;12824:24;;;12850:2;12854:5;12801:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12777:93;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12741:129;;;;12888:7;:57;;;;;12915:1;12900:4;:11;:16;:44;;;;12931:4;12920:24;;;;;;;;;;;;:::i;:::-;12900:44;12888:57;12880:66;;;;;;12691:262;;12617:336;;;:::o;9562:1364::-;9792:17;9827:7;9819:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9792:62;;9893:7;9885:25;;;9924:18;9956:19;9997:4;9885:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10022:26;10051:10;:20;;;10080:4;10051:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10022:64;;10097:34;10154:1;10134:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10097:59;;10183:102;;;;;;;;10218:10;10183:102;;;;;;1539:42;10183:102;;;;;;10270:5;10183:102;;;;;10166:11;10178:1;10166:14;;;;;;;;:::i;:::-;;;;;;;:119;;;;10379:20;1835:42;10402:19;;;10435:4;10461:10;1539:42;10513:5;10402:126;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10379:149;;10538:20;2189:6;10655:4;:14;;;;:::i;:::-;10633:16;2189:6;10623:26;;;;:::i;:::-;10595:12;10562:18;:45;;;;:::i;:::-;:88;;;;:::i;:::-;10561:109;;;;:::i;:::-;10538:132;;1835:42;10739:31;;;10784:18;10816:12;10842:11;10875:4;10894:15;10739:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9735:1191;;;;;9562:1364;;;;:::o;11109:162::-;11164:14;2189:6;11192:3;;11182:7;:13;;;;:::i;:::-;11181:25;;;;:::i;:::-;11164:42;;11216:48;1539:42;11245:10;;;;;;;;;;;11257:6;11216:13;:48::i;:::-;11154:117;11109:162;:::o;11353:395::-;11460:1;1539:42;11418:14;;;11441:4;11448:7;11418:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;11414:328;;1539:42;11477:12;;;11490:7;11499:17;11477:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11601:17;11636:7;11628:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11601:62;;11677:10;:18;;;1835:42;11713:17;11677:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11463:279;11414:328;11353:395;:::o;12959:480::-;13127:1;13107:5;:17;;;:21;13099:30;;;;;;13140:12;13154:17;13175:5;:10;;13239:28;;;13285:4;13307:2;13327:5;13199:147;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13175:181;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13139:217;;;;13374:7;:57;;;;;13401:1;13386:4;:11;:16;:44;;;;13417:4;13406:24;;;;;;;;;;;;:::i;:::-;13386:44;13374:57;13366:66;;;;;;13089:350;;12959:480;;;;:::o;6774:649::-;6961:4;6946:12;;:19;;;;;;;;;;;;;;;;;;7009:23;7049:1;7035:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:42;;1539;7061:6;7068:1;7061:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;7097:24;7138:1;7124:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7097:43;;7163:13;7150:7;7158:1;7150:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;7187:21;7235:7;7256:13;7283:16;7211:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7187:122;;1697:42;7351:23;;;7383:4;7390:6;7398:7;7407:8;7351:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:515;;;6774:649;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:90:7:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:126::-;471:7;511:42;504:5;500:54;489:65;;434:126;;;:::o;566:96::-;603:7;632:24;650:5;632:24;:::i;:::-;621:35;;566:96;;;:::o;668:118::-;755:24;773:5;755:24;:::i;:::-;750:3;743:37;668:118;;:::o;792:222::-;885:4;923:2;912:9;908:18;900:26;;936:71;1004:1;993:9;989:17;980:6;936:71;:::i;:::-;792:222;;;;:::o;1020:75::-;1053:6;1086:2;1080:9;1070:19;;1020:75;:::o;1101:117::-;1210:1;1207;1200:12;1224:117;1333:1;1330;1323:12;1347:122;1420:24;1438:5;1420:24;:::i;:::-;1413:5;1410:35;1400:63;;1459:1;1456;1449:12;1400:63;1347:122;:::o;1475:139::-;1521:5;1559:6;1546:20;1537:29;;1575:33;1602:5;1575:33;:::i;:::-;1475:139;;;;:::o;1620:77::-;1657:7;1686:5;1675:16;;1620:77;;;:::o;1703:122::-;1776:24;1794:5;1776:24;:::i;:::-;1769:5;1766:35;1756:63;;1815:1;1812;1805:12;1756:63;1703:122;:::o;1831:139::-;1877:5;1915:6;1902:20;1893:29;;1931:33;1958:5;1931:33;:::i;:::-;1831:139;;;;:::o;1976:619::-;2053:6;2061;2069;2118:2;2106:9;2097:7;2093:23;2089:32;2086:119;;;2124:79;;:::i;:::-;2086:119;2244:1;2269:53;2314:7;2305:6;2294:9;2290:22;2269:53;:::i;:::-;2259:63;;2215:117;2371:2;2397:53;2442:7;2433:6;2422:9;2418:22;2397:53;:::i;:::-;2387:63;;2342:118;2499:2;2525:53;2570:7;2561:6;2550:9;2546:22;2525:53;:::i;:::-;2515:63;;2470:118;1976:619;;;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:652::-;2924:4;2962:3;2951:9;2947:19;2939:27;;2976:71;3044:1;3033:9;3029:17;3020:6;2976:71;:::i;:::-;3057:66;3119:2;3108:9;3104:18;3095:6;3057:66;:::i;:::-;3133:72;3201:2;3190:9;3186:18;3177:6;3133:72;:::i;:::-;3215;3283:2;3272:9;3268:18;3259:6;3215:72;:::i;:::-;3297:73;3365:3;3354:9;3350:19;3341:6;3297:73;:::i;:::-;2725:652;;;;;;;;:::o;3383:474::-;3451:6;3459;3508:2;3496:9;3487:7;3483:23;3479:32;3476:119;;;3514:79;;:::i;:::-;3476:119;3634:1;3659:53;3704:7;3695:6;3684:9;3680:22;3659:53;:::i;:::-;3649:63;;3605:117;3761:2;3787:53;3832:7;3823:6;3812:9;3808:22;3787:53;:::i;:::-;3777:63;;3732:118;3383:474;;;;;:::o;3863:222::-;3956:4;3994:2;3983:9;3979:18;3971:26;;4007:71;4075:1;4064:9;4060:17;4051:6;4007:71;:::i;:::-;3863:222;;;;:::o;4091:117::-;4200:1;4197;4190:12;4214:102;4255:6;4306:2;4302:7;4297:2;4290:5;4286:14;4282:28;4272:38;;4214:102;;;:::o;4322:180::-;4370:77;4367:1;4360:88;4467:4;4464:1;4457:15;4491:4;4488:1;4481:15;4508:281;4591:27;4613:4;4591:27;:::i;:::-;4583:6;4579:40;4721:6;4709:10;4706:22;4685:18;4673:10;4670:34;4667:62;4664:88;;;4732:18;;:::i;:::-;4664:88;4772:10;4768:2;4761:22;4551:238;4508:281;;:::o;4795:129::-;4829:6;4856:20;;:::i;:::-;4846:30;;4885:33;4913:4;4905:6;4885:33;:::i;:::-;4795:129;;;:::o;4930:311::-;5007:4;5097:18;5089:6;5086:30;5083:56;;;5119:18;;:::i;:::-;5083:56;5169:4;5161:6;5157:17;5149:25;;5229:4;5223;5219:15;5211:23;;4930:311;;;:::o;5247:117::-;5356:1;5353;5346:12;5387:710;5483:5;5508:81;5524:64;5581:6;5524:64;:::i;:::-;5508:81;:::i;:::-;5499:90;;5609:5;5638:6;5631:5;5624:21;5672:4;5665:5;5661:16;5654:23;;5725:4;5717:6;5713:17;5705:6;5701:30;5754:3;5746:6;5743:15;5740:122;;;5773:79;;:::i;:::-;5740:122;5888:6;5871:220;5905:6;5900:3;5897:15;5871:220;;;5980:3;6009:37;6042:3;6030:10;6009:37;:::i;:::-;6004:3;5997:50;6076:4;6071:3;6067:14;6060:21;;5947:144;5931:4;5926:3;5922:14;5915:21;;5871:220;;;5875:21;5489:608;;5387:710;;;;;:::o;6120:370::-;6191:5;6240:3;6233:4;6225:6;6221:17;6217:27;6207:122;;6248:79;;:::i;:::-;6207:122;6365:6;6352:20;6390:94;6480:3;6472:6;6465:4;6457:6;6453:17;6390:94;:::i;:::-;6381:103;;6197:293;6120:370;;;;:::o;6496:311::-;6573:4;6663:18;6655:6;6652:30;6649:56;;;6685:18;;:::i;:::-;6649:56;6735:4;6727:6;6723:17;6715:25;;6795:4;6789;6785:15;6777:23;;6496:311;;;:::o;6830:710::-;6926:5;6951:81;6967:64;7024:6;6967:64;:::i;:::-;6951:81;:::i;:::-;6942:90;;7052:5;7081:6;7074:5;7067:21;7115:4;7108:5;7104:16;7097:23;;7168:4;7160:6;7156:17;7148:6;7144:30;7197:3;7189:6;7186:15;7183:122;;;7216:79;;:::i;:::-;7183:122;7331:6;7314:220;7348:6;7343:3;7340:15;7314:220;;;7423:3;7452:37;7485:3;7473:10;7452:37;:::i;:::-;7447:3;7440:50;7519:4;7514:3;7510:14;7503:21;;7390:144;7374:4;7369:3;7365:14;7358:21;;7314:220;;;7318:21;6932:608;;6830:710;;;;;:::o;7563:370::-;7634:5;7683:3;7676:4;7668:6;7664:17;7660:27;7650:122;;7691:79;;:::i;:::-;7650:122;7808:6;7795:20;7833:94;7923:3;7915:6;7908:4;7900:6;7896:17;7833:94;:::i;:::-;7824:103;;7640:293;7563:370;;;;:::o;7939:117::-;8048:1;8045;8038:12;8062:307;8123:4;8213:18;8205:6;8202:30;8199:56;;;8235:18;;:::i;:::-;8199:56;8273:29;8295:6;8273:29;:::i;:::-;8265:37;;8357:4;8351;8347:15;8339:23;;8062:307;;;:::o;8375:146::-;8472:6;8467:3;8462;8449:30;8513:1;8504:6;8499:3;8495:16;8488:27;8375:146;;;:::o;8527:423::-;8604:5;8629:65;8645:48;8686:6;8645:48;:::i;:::-;8629:65;:::i;:::-;8620:74;;8717:6;8710:5;8703:21;8755:4;8748:5;8744:16;8793:3;8784:6;8779:3;8775:16;8772:25;8769:112;;;8800:79;;:::i;:::-;8769:112;8890:54;8937:6;8932:3;8927;8890:54;:::i;:::-;8610:340;8527:423;;;;;:::o;8969:338::-;9024:5;9073:3;9066:4;9058:6;9054:17;9050:27;9040:122;;9081:79;;:::i;:::-;9040:122;9198:6;9185:20;9223:78;9297:3;9289:6;9282:4;9274:6;9270:17;9223:78;:::i;:::-;9214:87;;9030:277;8969:338;;;;:::o;9313:1573::-;9483:6;9491;9499;9507;9556:3;9544:9;9535:7;9531:23;9527:33;9524:120;;;9563:79;;:::i;:::-;9524:120;9711:1;9700:9;9696:17;9683:31;9741:18;9733:6;9730:30;9727:117;;;9763:79;;:::i;:::-;9727:117;9868:78;9938:7;9929:6;9918:9;9914:22;9868:78;:::i;:::-;9858:88;;9654:302;10023:2;10012:9;10008:18;9995:32;10054:18;10046:6;10043:30;10040:117;;;10076:79;;:::i;:::-;10040:117;10181:78;10251:7;10242:6;10231:9;10227:22;10181:78;:::i;:::-;10171:88;;9966:303;10336:2;10325:9;10321:18;10308:32;10367:18;10359:6;10356:30;10353:117;;;10389:79;;:::i;:::-;10353:117;10494:78;10564:7;10555:6;10544:9;10540:22;10494:78;:::i;:::-;10484:88;;10279:303;10649:2;10638:9;10634:18;10621:32;10680:18;10672:6;10669:30;10666:117;;;10702:79;;:::i;:::-;10666:117;10807:62;10861:7;10852:6;10841:9;10837:22;10807:62;:::i;:::-;10797:72;;10592:287;9313:1573;;;;;;;:::o;10892:329::-;10951:6;11000:2;10988:9;10979:7;10975:23;10971:32;10968:119;;;11006:79;;:::i;:::-;10968:119;11126:1;11151:53;11196:7;11187:6;11176:9;11172:22;11151:53;:::i;:::-;11141:63;;11097:117;10892:329;;;;:::o;11227:765::-;11313:6;11321;11329;11337;11386:3;11374:9;11365:7;11361:23;11357:33;11354:120;;;11393:79;;:::i;:::-;11354:120;11513:1;11538:53;11583:7;11574:6;11563:9;11559:22;11538:53;:::i;:::-;11528:63;;11484:117;11640:2;11666:53;11711:7;11702:6;11691:9;11687:22;11666:53;:::i;:::-;11656:63;;11611:118;11768:2;11794:53;11839:7;11830:6;11819:9;11815:22;11794:53;:::i;:::-;11784:63;;11739:118;11896:2;11922:53;11967:7;11958:6;11947:9;11943:22;11922:53;:::i;:::-;11912:63;;11867:118;11227:765;;;;;;;:::o;11998:169::-;12082:11;12116:6;12111:3;12104:19;12156:4;12151:3;12147:14;12132:29;;11998:169;;;;:::o;12173:::-;12313:21;12309:1;12301:6;12297:14;12290:45;12173:169;:::o;12348:366::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:419::-;12886:4;12924:2;12913:9;12909:18;12901:26;;12973:9;12967:4;12963:20;12959:1;12948:9;12944:17;12937:47;13001:131;13127:4;13001:131;:::i;:::-;12993:139;;12720:419;;;:::o;13145:220::-;13285:34;13281:1;13273:6;13269:14;13262:58;13354:3;13349:2;13341:6;13337:15;13330:28;13145:220;:::o;13371:366::-;13513:3;13534:67;13598:2;13593:3;13534:67;:::i;:::-;13527:74;;13610:93;13699:3;13610:93;:::i;:::-;13728:2;13723:3;13719:12;13712:19;;13371:366;;;:::o;13743:419::-;13909:4;13947:2;13936:9;13932:18;13924:26;;13996:9;13990:4;13986:20;13982:1;13971:9;13967:17;13960:47;14024:131;14150:4;14024:131;:::i;:::-;14016:139;;13743:419;;;:::o;14168:143::-;14225:5;14256:6;14250:13;14241:22;;14272:33;14299:5;14272:33;:::i;:::-;14168:143;;;;:::o;14317:351::-;14387:6;14436:2;14424:9;14415:7;14411:23;14407:32;14404:119;;;14442:79;;:::i;:::-;14404:119;14562:1;14587:64;14643:7;14634:6;14623:9;14619:22;14587:64;:::i;:::-;14577:74;;14533:128;14317:351;;;;:::o;14674:143::-;14731:5;14762:6;14756:13;14747:22;;14778:33;14805:5;14778:33;:::i;:::-;14674:143;;;;:::o;14823:351::-;14893:6;14942:2;14930:9;14921:7;14917:23;14913:32;14910:119;;;14948:79;;:::i;:::-;14910:119;15068:1;15093:64;15149:7;15140:6;15129:9;15125:22;15093:64;:::i;:::-;15083:74;;15039:128;14823:351;;;;:::o;15180:541::-;15351:4;15389:3;15378:9;15374:19;15366:27;;15403:71;15471:1;15460:9;15456:17;15447:6;15403:71;:::i;:::-;15484:72;15552:2;15541:9;15537:18;15528:6;15484:72;:::i;:::-;15566;15634:2;15623:9;15619:18;15610:6;15566:72;:::i;:::-;15648:66;15710:2;15699:9;15695:18;15686:6;15648:66;:::i;:::-;15180:541;;;;;;;:::o;15727:180::-;15775:77;15772:1;15765:88;15872:4;15869:1;15862:15;15896:4;15893:1;15886:15;15913:194;15953:4;15973:20;15991:1;15973:20;:::i;:::-;15968:25;;16007:20;16025:1;16007:20;:::i;:::-;16002:25;;16051:1;16048;16044:9;16036:17;;16075:1;16069:4;16066:11;16063:37;;;16080:18;;:::i;:::-;16063:37;15913:194;;;;:::o;16113:410::-;16153:7;16176:20;16194:1;16176:20;:::i;:::-;16171:25;;16210:20;16228:1;16210:20;:::i;:::-;16205:25;;16265:1;16262;16258:9;16287:30;16305:11;16287:30;:::i;:::-;16276:41;;16466:1;16457:7;16453:15;16450:1;16447:22;16427:1;16420:9;16400:83;16377:139;;16496:18;;:::i;:::-;16377:139;16161:362;16113:410;;;;:::o;16529:180::-;16577:77;16574:1;16567:88;16674:4;16671:1;16664:15;16698:4;16695:1;16688:15;16715:185;16755:1;16772:20;16790:1;16772:20;:::i;:::-;16767:25;;16806:20;16824:1;16806:20;:::i;:::-;16801:25;;16845:1;16835:35;;16850:18;;:::i;:::-;16835:35;16892:1;16889;16885:9;16880:14;;16715:185;;;;:::o;16906:228::-;17046:34;17042:1;17034:6;17030:14;17023:58;17115:11;17110:2;17102:6;17098:15;17091:36;16906:228;:::o;17140:366::-;17282:3;17303:67;17367:2;17362:3;17303:67;:::i;:::-;17296:74;;17379:93;17468:3;17379:93;:::i;:::-;17497:2;17492:3;17488:12;17481:19;;17140:366;;;:::o;17512:419::-;17678:4;17716:2;17705:9;17701:18;17693:26;;17765:9;17759:4;17755:20;17751:1;17740:9;17736:17;17729:47;17793:131;17919:4;17793:131;:::i;:::-;17785:139;;17512:419;;;:::o;17937:163::-;18077:15;18073:1;18065:6;18061:14;18054:39;17937:163;:::o;18106:366::-;18248:3;18269:67;18333:2;18328:3;18269:67;:::i;:::-;18262:74;;18345:93;18434:3;18345:93;:::i;:::-;18463:2;18458:3;18454:12;18447:19;;18106:366;;;:::o;18478:419::-;18644:4;18682:2;18671:9;18667:18;18659:26;;18731:9;18725:4;18721:20;18717:1;18706:9;18702:17;18695:47;18759:131;18885:4;18759:131;:::i;:::-;18751:139;;18478:419;;;:::o;18903:178::-;19043:30;19039:1;19031:6;19027:14;19020:54;18903:178;:::o;19087:366::-;19229:3;19250:67;19314:2;19309:3;19250:67;:::i;:::-;19243:74;;19326:93;19415:3;19326:93;:::i;:::-;19444:2;19439:3;19435:12;19428:19;;19087:366;;;:::o;19459:419::-;19625:4;19663:2;19652:9;19648:18;19640:26;;19712:9;19706:4;19702:20;19698:1;19687:9;19683:17;19676:47;19740:131;19866:4;19740:131;:::i;:::-;19732:139;;19459:419;;;:::o;19884:175::-;20024:27;20020:1;20012:6;20008:14;20001:51;19884:175;:::o;20065:366::-;20207:3;20228:67;20292:2;20287:3;20228:67;:::i;:::-;20221:74;;20304:93;20393:3;20304:93;:::i;:::-;20422:2;20417:3;20413:12;20406:19;;20065:366;;;:::o;20437:419::-;20603:4;20641:2;20630:9;20626:18;20618:26;;20690:9;20684:4;20680:20;20676:1;20665:9;20661:17;20654:47;20718:131;20844:4;20718:131;:::i;:::-;20710:139;;20437:419;;;:::o;20862:104::-;20907:7;20936:24;20954:5;20936:24;:::i;:::-;20925:35;;20862:104;;;:::o;20972:138::-;21053:32;21079:5;21053:32;:::i;:::-;21046:5;21043:43;21033:71;;21100:1;21097;21090:12;21033:71;20972:138;:::o;21116:159::-;21181:5;21212:6;21206:13;21197:22;;21228:41;21263:5;21228:41;:::i;:::-;21116:159;;;;:::o;21281:679::-;21377:6;21385;21393;21442:2;21430:9;21421:7;21417:23;21413:32;21410:119;;;21448:79;;:::i;:::-;21410:119;21568:1;21593:72;21657:7;21648:6;21637:9;21633:22;21593:72;:::i;:::-;21583:82;;21539:136;21714:2;21740:64;21796:7;21787:6;21776:9;21772:22;21740:64;:::i;:::-;21730:74;;21685:129;21853:2;21879:64;21935:7;21926:6;21915:9;21911:22;21879:64;:::i;:::-;21869:74;;21824:129;21281:679;;;;;:::o;21966:180::-;22014:77;22011:1;22004:88;22111:4;22108:1;22101:15;22135:4;22132:1;22125:15;22152:191;22192:3;22211:20;22229:1;22211:20;:::i;:::-;22206:25;;22245:20;22263:1;22245:20;:::i;:::-;22240:25;;22288:1;22285;22281:9;22274:16;;22309:3;22306:1;22303:10;22300:36;;;22316:18;;:::i;:::-;22300:36;22152:191;;;;:::o;22349:235::-;22489:34;22485:1;22477:6;22473:14;22466:58;22558:18;22553:2;22545:6;22541:15;22534:43;22349:235;:::o;22590:366::-;22732:3;22753:67;22817:2;22812:3;22753:67;:::i;:::-;22746:74;;22829:93;22918:3;22829:93;:::i;:::-;22947:2;22942:3;22938:12;22931:19;;22590:366;;;:::o;22962:419::-;23128:4;23166:2;23155:9;23151:18;23143:26;;23215:9;23209:4;23205:20;23201:1;23190:9;23186:17;23179:47;23243:131;23369:4;23243:131;:::i;:::-;23235:139;;22962:419;;;:::o;23387:182::-;23527:34;23523:1;23515:6;23511:14;23504:58;23387:182;:::o;23575:366::-;23717:3;23738:67;23802:2;23797:3;23738:67;:::i;:::-;23731:74;;23814:93;23903:3;23814:93;:::i;:::-;23932:2;23927:3;23923:12;23916:19;;23575:366;;;:::o;23947:419::-;24113:4;24151:2;24140:9;24136:18;24128:26;;24200:9;24194:4;24190:20;24186:1;24175:9;24171:17;24164:47;24228:131;24354:4;24228:131;:::i;:::-;24220:139;;23947:419;;;:::o;24372:332::-;24493:4;24531:2;24520:9;24516:18;24508:26;;24544:71;24612:1;24601:9;24597:17;24588:6;24544:71;:::i;:::-;24625:72;24693:2;24682:9;24678:18;24669:6;24625:72;:::i;:::-;24372:332;;;;;:::o;24710:98::-;24761:6;24795:5;24789:12;24779:22;;24710:98;;;:::o;24814:147::-;24915:11;24952:3;24937:18;;24814:147;;;;:::o;24967:246::-;25048:1;25058:113;25072:6;25069:1;25066:13;25058:113;;;25157:1;25152:3;25148:11;25142:18;25138:1;25133:3;25129:11;25122:39;25094:2;25091:1;25087:10;25082:15;;25058:113;;;25205:1;25196:6;25191:3;25187:16;25180:27;25029:184;24967:246;;;:::o;25219:386::-;25323:3;25351:38;25383:5;25351:38;:::i;:::-;25405:88;25486:6;25481:3;25405:88;:::i;:::-;25398:95;;25502:65;25560:6;25555:3;25548:4;25541:5;25537:16;25502:65;:::i;:::-;25592:6;25587:3;25583:16;25576:23;;25327:278;25219:386;;;;:::o;25611:271::-;25741:3;25763:93;25852:3;25843:6;25763:93;:::i;:::-;25756:100;;25873:3;25866:10;;25611:271;;;;:::o;25888:116::-;25958:21;25973:5;25958:21;:::i;:::-;25951:5;25948:32;25938:60;;25994:1;25991;25984:12;25938:60;25888:116;:::o;26010:137::-;26064:5;26095:6;26089:13;26080:22;;26111:30;26135:5;26111:30;:::i;:::-;26010:137;;;;:::o;26153:345::-;26220:6;26269:2;26257:9;26248:7;26244:23;26240:32;26237:119;;;26275:79;;:::i;:::-;26237:119;26395:1;26420:61;26473:7;26464:6;26453:9;26449:22;26420:61;:::i;:::-;26410:71;;26366:125;26153:345;;;;:::o;26504:442::-;26653:4;26691:2;26680:9;26676:18;26668:26;;26704:71;26772:1;26761:9;26757:17;26748:6;26704:71;:::i;:::-;26785:72;26853:2;26842:9;26838:18;26829:6;26785:72;:::i;:::-;26867;26935:2;26924:9;26920:18;26911:6;26867:72;:::i;:::-;26504:442;;;;;;:::o;26952:103::-;27015:7;27044:5;27033:16;;26952:103;;;:::o;27061:60::-;27089:3;27110:5;27103:12;;27061:60;;;:::o;27127:194::-;27203:9;27236:79;27254:60;27263:50;27307:5;27263:50;:::i;:::-;27254:60;:::i;:::-;27236:79;:::i;:::-;27223:92;;27127:194;;;:::o;27327:183::-;27440:63;27497:5;27440:63;:::i;:::-;27435:3;27428:76;27327:183;;:::o;27516:593::-;27713:4;27751:3;27740:9;27736:19;27728:27;;27765:97;27859:1;27848:9;27844:17;27835:6;27765:97;:::i;:::-;27872:72;27940:2;27929:9;27925:18;27916:6;27872:72;:::i;:::-;27954;28022:2;28011:9;28007:18;27998:6;27954:72;:::i;:::-;28036:66;28098:2;28087:9;28083:18;28074:6;28036:66;:::i;:::-;27516:593;;;;;;;:::o;28115:136::-;28204:6;28238:5;28232:12;28222:22;;28115:136;;;:::o;28257:206::-;28378:11;28412:6;28407:3;28400:19;28452:4;28447:3;28443:14;28428:29;;28257:206;;;;:::o;28469:154::-;28558:4;28581:3;28573:11;;28611:4;28606:3;28602:14;28594:22;;28469:154;;;:::o;28629:108::-;28706:24;28724:5;28706:24;:::i;:::-;28701:3;28694:37;28629:108;;:::o;28743:99::-;28814:21;28829:5;28814:21;:::i;:::-;28809:3;28802:34;28743:99;;:::o;28900:659::-;29031:4;29026:3;29022:14;29118:4;29111:5;29107:16;29101:23;29137:63;29194:4;29189:3;29185:14;29171:12;29137:63;:::i;:::-;29046:164;29290:4;29283:5;29279:16;29273:23;29309:63;29366:4;29361:3;29357:14;29343:12;29309:63;:::i;:::-;29220:162;29466:4;29459:5;29455:16;29449:23;29485:57;29536:4;29531:3;29527:14;29513:12;29485:57;:::i;:::-;29392:160;29000:559;28900:659;;:::o;29565:267::-;29678:10;29699:90;29785:3;29777:6;29699:90;:::i;:::-;29821:4;29816:3;29812:14;29798:28;;29565:267;;;;:::o;29838:135::-;29930:4;29962;29957:3;29953:14;29945:22;;29838:135;;;:::o;30035:908::-;30198:3;30227:76;30297:5;30227:76;:::i;:::-;30319:108;30420:6;30415:3;30319:108;:::i;:::-;30312:115;;30451:78;30523:5;30451:78;:::i;:::-;30552:7;30583:1;30568:350;30593:6;30590:1;30587:13;30568:350;;;30669:6;30663:13;30696:107;30799:3;30784:13;30696:107;:::i;:::-;30689:114;;30826:82;30901:6;30826:82;:::i;:::-;30816:92;;30628:290;30615:1;30612;30608:9;30603:14;;30568:350;;;30572:14;30934:3;30927:10;;30203:740;;;30035:908;;;;:::o;30949:903::-;31248:4;31286:3;31275:9;31271:19;31263:27;;31300:71;31368:1;31357:9;31353:17;31344:6;31300:71;:::i;:::-;31381:72;31449:2;31438:9;31434:18;31425:6;31381:72;:::i;:::-;31500:9;31494:4;31490:20;31485:2;31474:9;31470:18;31463:48;31528:152;31675:4;31666:6;31528:152;:::i;:::-;31520:160;;31690:72;31758:2;31747:9;31743:18;31734:6;31690:72;:::i;:::-;31772:73;31840:3;31829:9;31825:19;31816:6;31772:73;:::i;:::-;30949:903;;;;;;;;:::o;31875:732::-;31982:5;32007:81;32023:64;32080:6;32023:64;:::i;:::-;32007:81;:::i;:::-;31998:90;;32108:5;32137:6;32130:5;32123:21;32171:4;32164:5;32160:16;32153:23;;32224:4;32216:6;32212:17;32204:6;32200:30;32253:3;32245:6;32242:15;32239:122;;;32272:79;;:::i;:::-;32239:122;32387:6;32370:231;32404:6;32399:3;32396:15;32370:231;;;32479:3;32508:48;32552:3;32540:10;32508:48;:::i;:::-;32503:3;32496:61;32586:4;32581:3;32577:14;32570:21;;32446:155;32430:4;32425:3;32421:14;32414:21;;32370:231;;;32374:21;31988:619;;31875:732;;;;;:::o;32630:385::-;32712:5;32761:3;32754:4;32746:6;32742:17;32738:27;32728:122;;32769:79;;:::i;:::-;32728:122;32879:6;32873:13;32904:105;33005:3;32997:6;32990:4;32982:6;32978:17;32904:105;:::i;:::-;32895:114;;32718:297;32630:385;;;;:::o;33021:554::-;33116:6;33165:2;33153:9;33144:7;33140:23;33136:32;33133:119;;;33171:79;;:::i;:::-;33133:119;33312:1;33301:9;33297:17;33291:24;33342:18;33334:6;33331:30;33328:117;;;33364:79;;:::i;:::-;33328:117;33469:89;33550:7;33541:6;33530:9;33526:22;33469:89;:::i;:::-;33459:99;;33262:306;33021:554;;;;:::o;33581:332::-;33702:4;33740:2;33729:9;33725:18;33717:26;;33753:71;33821:1;33810:9;33806:17;33797:6;33753:71;:::i;:::-;33834:72;33902:2;33891:9;33887:18;33878:6;33834:72;:::i;:::-;33581:332;;;;;:::o;33919:442::-;34068:4;34106:2;34095:9;34091:18;34083:26;;34119:71;34187:1;34176:9;34172:17;34163:6;34119:71;:::i;:::-;34200:72;34268:2;34257:9;34253:18;34244:6;34200:72;:::i;:::-;34282;34350:2;34339:9;34335:18;34326:6;34282:72;:::i;:::-;33919:442;;;;;;:::o;34367:::-;34516:4;34554:2;34543:9;34539:18;34531:26;;34567:71;34635:1;34624:9;34620:17;34611:6;34567:71;:::i;:::-;34648:72;34716:2;34705:9;34701:18;34692:6;34648:72;:::i;:::-;34730;34798:2;34787:9;34783:18;34774:6;34730:72;:::i;:::-;34367:442;;;;;;:::o;34815:114::-;34882:6;34916:5;34910:12;34900:22;;34815:114;;;:::o;34935:184::-;35034:11;35068:6;35063:3;35056:19;35108:4;35103:3;35099:14;35084:29;;34935:184;;;;:::o;35125:132::-;35192:4;35215:3;35207:11;;35245:4;35240:3;35236:14;35228:22;;35125:132;;;:::o;35263:179::-;35332:10;35353:46;35395:3;35387:6;35353:46;:::i;:::-;35431:4;35426:3;35422:14;35408:28;;35263:179;;;;:::o;35448:113::-;35518:4;35550;35545:3;35541:14;35533:22;;35448:113;;;:::o;35597:732::-;35716:3;35745:54;35793:5;35745:54;:::i;:::-;35815:86;35894:6;35889:3;35815:86;:::i;:::-;35808:93;;35925:56;35975:5;35925:56;:::i;:::-;36004:7;36035:1;36020:284;36045:6;36042:1;36039:13;36020:284;;;36121:6;36115:13;36148:63;36207:3;36192:13;36148:63;:::i;:::-;36141:70;;36234:60;36287:6;36234:60;:::i;:::-;36224:70;;36080:224;36067:1;36064;36060:9;36055:14;;36020:284;;;36024:14;36320:3;36313:10;;35721:608;;;35597:732;;;;:::o;36335:114::-;36402:6;36436:5;36430:12;36420:22;;36335:114;;;:::o;36455:184::-;36554:11;36588:6;36583:3;36576:19;36628:4;36623:3;36619:14;36604:29;;36455:184;;;;:::o;36645:132::-;36712:4;36735:3;36727:11;;36765:4;36760:3;36756:14;36748:22;;36645:132;;;:::o;36783:108::-;36860:24;36878:5;36860:24;:::i;:::-;36855:3;36848:37;36783:108;;:::o;36897:179::-;36966:10;36987:46;37029:3;37021:6;36987:46;:::i;:::-;37065:4;37060:3;37056:14;37042:28;;36897:179;;;;:::o;37082:113::-;37152:4;37184;37179:3;37175:14;37167:22;;37082:113;;;:::o;37231:732::-;37350:3;37379:54;37427:5;37379:54;:::i;:::-;37449:86;37528:6;37523:3;37449:86;:::i;:::-;37442:93;;37559:56;37609:5;37559:56;:::i;:::-;37638:7;37669:1;37654:284;37679:6;37676:1;37673:13;37654:284;;;37755:6;37749:13;37782:63;37841:3;37826:13;37782:63;:::i;:::-;37775:70;;37868:60;37921:6;37868:60;:::i;:::-;37858:70;;37714:224;37701:1;37698;37694:9;37689:14;;37654:284;;;37658:14;37954:3;37947:10;;37355:608;;;37231:732;;;;:::o;37969:168::-;38052:11;38086:6;38081:3;38074:19;38126:4;38121:3;38117:14;38102:29;;37969:168;;;;:::o;38143:373::-;38229:3;38257:38;38289:5;38257:38;:::i;:::-;38311:70;38374:6;38369:3;38311:70;:::i;:::-;38304:77;;38390:65;38448:6;38443:3;38436:4;38429:5;38425:16;38390:65;:::i;:::-;38480:29;38502:6;38480:29;:::i;:::-;38475:3;38471:39;38464:46;;38233:283;38143:373;;;;:::o;38522:942::-;38817:4;38855:3;38844:9;38840:19;38832:27;;38869:71;38937:1;38926:9;38922:17;38913:6;38869:71;:::i;:::-;38987:9;38981:4;38977:20;38972:2;38961:9;38957:18;38950:48;39015:108;39118:4;39109:6;39015:108;:::i;:::-;39007:116;;39170:9;39164:4;39160:20;39155:2;39144:9;39140:18;39133:48;39198:108;39301:4;39292:6;39198:108;:::i;:::-;39190:116;;39353:9;39347:4;39343:20;39338:2;39327:9;39323:18;39316:48;39381:76;39452:4;39443:6;39381:76;:::i;:::-;39373:84;;38522:942;;;;;;;:::o

Swarm Source

ipfs://1006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c177

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

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