GLMR Price: $0.020933 (-1.43%)

Contract

0xA876d07323e449D46FBEED2136b348baf81835Aa

Overview

GLMR Balance

Moonbeam Chain LogoMoonbeam Chain LogoMoonbeam Chain Logo0 GLMR

GLMR Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve110804972025-05-29 17:47:24241 days ago1748540844
Beefy: Strategy Beamswap Multi Rewards LP V1
OUT0 GLMR00
Panic86143112024-12-05 1:28:00417 days ago1733362080IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.2397744150
Harvest31371152023-03-14 11:14:481048 days ago1678792488IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.08065132101
Harvest31185402023-03-10 22:05:301052 days ago1678485930IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.08450408103
Harvest24199442022-12-02 1:10:361151 days ago1669943436IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.0864169100
Harvest24161802022-12-01 12:22:541151 days ago1669897374IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.09024100
Harvest23972952022-11-28 20:19:301154 days ago1669666770IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.0912496102
Transfer Ownersh...23782542022-11-26 3:57:061157 days ago1669435026IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.0028625100
Set Harvest On D...23782452022-11-26 3:55:061157 days ago1669434906IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.00309335102
Harvest23782372022-11-26 3:53:301157 days ago1669434810IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.08835432101.5
Unpause23782222022-11-26 3:50:241157 days ago1669434624IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.05975904104.7045
Panic23782042022-11-26 3:46:481157 days ago1669434408IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.02918906101.5
Harvest23781742022-11-26 3:40:361157 days ago1669434036IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.09968285109.7
Add Reward Route23780262022-11-26 3:10:301157 days ago1669432230IN
Beefy: Strategy Beamswap Multi Rewards LP V1
0 GLMR0.0150843100

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
86143112024-12-05 1:28:00417 days ago1733362080
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
52658412024-01-09 21:11:36747 days ago1704834696
0xA876d073...af81835Aa
0 GLMR
51937792023-12-30 17:02:42757 days ago1703955762
0xA876d073...af81835Aa
0 GLMR
51937792023-12-30 17:02:42757 days ago1703955762
0xA876d073...af81835Aa
0 GLMR
51937792023-12-30 17:02:42757 days ago1703955762
0xA876d073...af81835Aa
0 GLMR
51937792023-12-30 17:02:42757 days ago1703955762
0xA876d073...af81835Aa
0 GLMR
51937792023-12-30 17:02:42757 days ago1703955762
0xA876d073...af81835Aa
0 GLMR
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyBeamswapMultiRewardsLP

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-11-26
*/

// Sources flattened with hardhat v2.12.2 https://hardhat.org

// File contracts/BIFI/utils/IGasPrice.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.9.0;

interface IGasPrice {
    function maxGasPrice() external returns (uint);
}


// File @openzeppelin-4/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File contracts/BIFI/utils/GasFeeThrottler.sol



pragma solidity ^0.8.0;


contract GasFeeThrottler {

    bool public shouldGasThrottle = true;

    address public gasprice = address(0xA43509661141F254F54D9A326E8Ec851A0b95307);

    modifier gasThrottle() {
        if (shouldGasThrottle && Address.isContract(gasprice)) {
            require(tx.gasprice <= IGasPrice(gasprice).maxGasPrice(), "gas is too high!");
        }
        _;
    }
}


// File contracts/BIFI/interfaces/common/IUniswapRouterETH.sol



pragma solidity >=0.6.0 <0.9.0;

interface IUniswapRouterETH {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

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

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}


// File contracts/BIFI/interfaces/common/IUniswapV2Pair.sol



pragma solidity >=0.6.0 <0.9.0;

interface IUniswapV2Pair {
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function burn(address to) external returns (uint amount0, uint amount1);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function totalSupply() external view returns (uint256);
    function kLast() external view returns (uint256);
}


// File contracts/BIFI/interfaces/common/IWrappedNative.sol



pragma solidity >=0.6.0 <0.9.0;

interface IWrappedNative {
    function deposit() external payable;

    function withdraw(uint256 wad) external;
}


// File contracts/BIFI/interfaces/beamswap/IBeamChef.sol



pragma solidity >=0.6.0 <0.9.0;

interface IBeamChef {
    function deposit(uint256 _pid, uint256 _amount) external;

    function withdraw(uint256 _pid, uint256 _amount) external;

    function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256, uint256, uint256);

    function emergencyWithdraw(uint256 _pid) external;

    function pendingTokens(
        uint256 pid,
        address user
    ) external view returns (address[] memory, string memory, uint256[] memory, uint256[] memory);
}


// File contracts/BIFI/interfaces/common/IFeeConfig.sol



pragma solidity ^0.8.0;

interface IFeeConfig {
    struct FeeCategory {
        uint256 total;
        uint256 beefy;
        uint256 call;
        uint256 strategist;
        string label;
        bool active;
    }
    struct AllFees {
        FeeCategory performance;
        uint256 deposit;
        uint256 withdraw;
    }
    function getFees(address strategy) external view returns (FeeCategory memory);
    function stratFeeId(address strategy) external view returns (uint256);
    function setStratFeeId(uint256 feeId) external;
}


// File @openzeppelin-4/contracts/utils/[email protected]


// 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 @openzeppelin-4/contracts/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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


// File @openzeppelin-4/contracts/security/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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


// File contracts/BIFI/strategies/Common/StratFeeManager.sol



pragma solidity ^0.8.0;



contract StratFeeManager is Ownable, Pausable {

    struct CommonAddresses {
        address vault;
        address unirouter;
        address keeper;
        address strategist;
        address beefyFeeRecipient;
        address beefyFeeConfig;
    }

    // common addresses for the strategy
    address public vault;
    address public unirouter;
    address public keeper;
    address public strategist;
    address public beefyFeeRecipient;
    IFeeConfig public beefyFeeConfig;

    uint256 constant DIVISOR = 1 ether;
    uint256 constant public WITHDRAWAL_FEE_CAP = 50;
    uint256 constant public WITHDRAWAL_MAX = 10000;
    uint256 internal withdrawalFee = 10;

    event SetStratFeeId(uint256 feeId);
    event SetWithdrawalFee(uint256 withdrawalFee);
    event SetVault(address vault);
    event SetUnirouter(address unirouter);
    event SetKeeper(address keeper);
    event SetStrategist(address strategist);
    event SetBeefyFeeRecipient(address beefyFeeRecipient);
    event SetBeefyFeeConfig(address beefyFeeConfig);

    constructor(
        CommonAddresses memory _commonAddresses
    ) {
        vault = _commonAddresses.vault;
        unirouter = _commonAddresses.unirouter;
        keeper = _commonAddresses.keeper;
        strategist = _commonAddresses.strategist;
        beefyFeeRecipient = _commonAddresses.beefyFeeRecipient;
        beefyFeeConfig = IFeeConfig(_commonAddresses.beefyFeeConfig);
    }

    // checks that caller is either owner or keeper.
    modifier onlyManager() {
        require(msg.sender == owner() || msg.sender == keeper, "!manager");
        _;
    }

    // fetch fees from config contract
    function getFees() internal view returns (IFeeConfig.FeeCategory memory) {
        return beefyFeeConfig.getFees(address(this));
    }

    // fetch fees from config contract and dynamic deposit/withdraw fees
    function getAllFees() external view returns (IFeeConfig.AllFees memory) {
        return IFeeConfig.AllFees(getFees(), depositFee(), withdrawFee());
    }

    function getStratFeeId() external view returns (uint256) {
        return beefyFeeConfig.stratFeeId(address(this));
    }

    function setStratFeeId(uint256 _feeId) external onlyManager {
        beefyFeeConfig.setStratFeeId(_feeId);
        emit SetStratFeeId(_feeId);
    }

    // adjust withdrawal fee
    function setWithdrawalFee(uint256 _fee) public onlyManager {
        require(_fee <= WITHDRAWAL_FEE_CAP, "!cap");
        withdrawalFee = _fee;
        emit SetWithdrawalFee(_fee);
    }

    // set new vault (only for strategy upgrades)
    function setVault(address _vault) external onlyOwner {
        vault = _vault;
        emit SetVault(_vault);
    }

    // set new unirouter
    function setUnirouter(address _unirouter) external onlyOwner {
        unirouter = _unirouter;
        emit SetUnirouter(_unirouter);
    }

    // set new keeper to manage strat
    function setKeeper(address _keeper) external onlyManager {
        keeper = _keeper;
        emit SetKeeper(_keeper);
    }

    // set new strategist address to receive strat fees
    function setStrategist(address _strategist) external {
        require(msg.sender == strategist, "!strategist");
        strategist = _strategist;
        emit SetStrategist(_strategist);
    }

    // set new beefy fee address to receive beefy fees
    function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner {
        beefyFeeRecipient = _beefyFeeRecipient;
        emit SetBeefyFeeRecipient(_beefyFeeRecipient);
    }

    // set new fee config address to fetch fees
    function setBeefyFeeConfig(address _beefyFeeConfig) external onlyOwner {
        beefyFeeConfig = IFeeConfig(_beefyFeeConfig);
        emit SetBeefyFeeConfig(_beefyFeeConfig);
    }

    function depositFee() public virtual view returns (uint256) {
        return 0;
    }

    function withdrawFee() public virtual view returns (uint256) {
        return paused() ? 0 : withdrawalFee;
    }

    function beforeDeposit() external virtual {}
}


// File @openzeppelin-4/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.6.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 @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin-4/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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;
        }
        _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;
        _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;
        }
        _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 @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @openzeppelin-4/contracts/token/ERC20/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/BIFI/strategies/Moonbeam/StrategyBeamswapMultiRewardsLP.sol



pragma solidity ^0.8.0;
contract StrategyBeamswapMultiRewardsLP is StratFeeManager, GasFeeThrottler {
    using SafeERC20 for IERC20;

    // Tokens used
    address public native;
    address public output;
    address public want;
    address public lpToken0;
    address public lpToken1;

    // Third party contracts
    address public chef;
    uint256 public poolId;
    address public stellaRouter = address(0x70085a09D30D6f8C4ecF6eE10120d1847383BB57);

    bool public harvestOnDeposit;
    uint256 public lastHarvest;

    // Routes
    address[] public outputToNativeRoute;
    address[] public nativeToLp0Route;
    address[] public nativeToLp1Route;
    address[][] public rewardToNativeRoute;

    event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl);
    event Deposit(uint256 tvl);
    event Withdraw(uint256 tvl);
    event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);

    constructor(
        address _want,
        uint256 _poolId,
        address _chef,
        CommonAddresses memory _commonAddresses,
        address[] memory _outputToNativeRoute,
        address[] memory _nativeToLp0Route,
        address[] memory _nativeToLp1Route
    ) StratFeeManager(_commonAddresses) {
        want = _want;
        poolId = _poolId;
        chef = _chef;

        output = _outputToNativeRoute[0];
        native = _outputToNativeRoute[_outputToNativeRoute.length - 1];
        outputToNativeRoute = _outputToNativeRoute;

        // setup lp routing
        lpToken0 = IUniswapV2Pair(want).token0();
        require(_nativeToLp0Route[0] == native, "nativeToLp0Route[0] != native");
        require(_nativeToLp0Route[_nativeToLp0Route.length - 1] == lpToken0, "nativeToLp0Route[last] != lpToken0");
        nativeToLp0Route = _nativeToLp0Route;

        lpToken1 = IUniswapV2Pair(want).token1();
        require(_nativeToLp1Route[0] == native, "nativeToLp1Route[0] != native");
        require(_nativeToLp1Route[_nativeToLp1Route.length - 1] == lpToken1, "nativeToLp1Route[last] != lpToken1");
        nativeToLp1Route = _nativeToLp1Route;

        _giveAllowances();
    }

    // puts the funds to work
    function deposit() public whenNotPaused {
        uint256 wantBal = IERC20(want).balanceOf(address(this));

        if (wantBal > 0) {
            IBeamChef(chef).deposit(poolId, wantBal);
            emit Deposit(balanceOf());
        }
    }

    function withdraw(uint256 _amount) external {
        require(msg.sender == vault, "!vault");

        uint256 wantBal = IERC20(want).balanceOf(address(this));

        if (wantBal < _amount) {
            IBeamChef(chef).withdraw(poolId, _amount - wantBal);
            wantBal = IERC20(want).balanceOf(address(this));
        }

        if (wantBal > _amount) {
            wantBal = _amount;
        }

        if (tx.origin != owner() && !paused()) {
            uint256 withdrawalFeeAmount = (wantBal * withdrawalFee) / WITHDRAWAL_MAX;
            wantBal = wantBal - withdrawalFeeAmount;
        }

        IERC20(want).safeTransfer(vault, wantBal);

        emit Withdraw(balanceOf());
    }

    function beforeDeposit() external virtual override {
        if (harvestOnDeposit) {
            require(msg.sender == vault, "!vault");
            _harvest(tx.origin);
        }
    }

    function harvest() external virtual gasThrottle {
        _harvest(tx.origin);
    }

    function harvest(address callFeeRecipient) external virtual gasThrottle {
        _harvest(callFeeRecipient);
    }

    function managerHarvest() external onlyManager {
        _harvest(tx.origin);
    }

    // compounds earnings and charges performance fee
    function _harvest(address callFeeRecipient) internal whenNotPaused {
        IBeamChef(chef).deposit(poolId, 0);
        uint256 outputBal = IERC20(output).balanceOf(address(this));
        if (outputBal > 0) {
            _convertRewards();
            chargeFees(callFeeRecipient);
            addLiquidity();
            uint256 wantHarvested = balanceOfWant();
            deposit();

            lastHarvest = block.timestamp;
            emit StratHarvest(msg.sender, wantHarvested, balanceOf());
        }
    }

    // converts rewards to native
    function _convertRewards() internal {
        // unwrap any native
        uint256 nativeBal = address(this).balance;
        if (nativeBal > 0) {
            IWrappedNative(native).deposit{value: nativeBal}();
        }
        // convert any output to native
        uint256 outputBal = IERC20(output).balanceOf(address(this));
        IUniswapRouterETH(unirouter).swapExactTokensForTokens(
            outputBal,
            0,
            outputToNativeRoute,
            address(this),
            block.timestamp
        );

        // convert additional rewards
        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                uint256 toNative = IERC20(rewardToNativeRoute[i][0]).balanceOf(address(this));
                if (toNative > 0) {
                    IUniswapRouterETH(stellaRouter).swapExactTokensForTokens(
                        toNative,
                        0,
                        rewardToNativeRoute[i],
                        address(this),
                        block.timestamp
                    );
                }
            }
        }
    }

    // performance fees
    function chargeFees(address callFeeRecipient) internal {
        IFeeConfig.FeeCategory memory fees = getFees();
        uint256 nativeFeesOwed = (IERC20(native).balanceOf(address(this)) * fees.total) / DIVISOR;

        uint256 callFeeAmount = (nativeFeesOwed * fees.call) / DIVISOR;
        IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);

        uint256 beefyFeeAmount = (nativeFeesOwed * fees.beefy) / DIVISOR;
        IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount);

        uint256 strategistFeeAmount = (nativeFeesOwed * fees.strategist) / DIVISOR;
        IERC20(native).safeTransfer(strategist, strategistFeeAmount);

        emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount);
    }

    // Adds liquidity to AMM and gets more LP tokens.
    function addLiquidity() internal {
        uint256 nativeHalf = IERC20(native).balanceOf(address(this)) / 2;

        if (lpToken0 != native) {
            IUniswapRouterETH(unirouter).swapExactTokensForTokens(
                nativeHalf,
                0,
                nativeToLp0Route,
                address(this),
                block.timestamp
            );
        }

        if (lpToken1 != native) {
            IUniswapRouterETH(unirouter).swapExactTokensForTokens(
                nativeHalf,
                0,
                nativeToLp1Route,
                address(this),
                block.timestamp
            );
        }

        uint256 lp0Bal = IERC20(lpToken0).balanceOf(address(this));
        uint256 lp1Bal = IERC20(lpToken1).balanceOf(address(this));
        IUniswapRouterETH(unirouter).addLiquidity(
            lpToken0,
            lpToken1,
            lp0Bal,
            lp1Bal,
            1,
            1,
            address(this),
            block.timestamp
        );
    }

    // calculate the total underlaying 'want' held by the strat.
    function balanceOf() public view returns (uint256) {
        return balanceOfWant() + balanceOfPool();
    }

    // it calculates how much 'want' this contract holds.
    function balanceOfWant() public view returns (uint256) {
        return IERC20(want).balanceOf(address(this));
    }

    // it calculates how much 'want' the strategy has working in the farm.
    function balanceOfPool() public view returns (uint256) {
        (uint256 _amount, , , ) = IBeamChef(chef).userInfo(poolId, address(this));
        return _amount;
    }

    function rewardsAvailable() public view returns (address[] memory, uint256[] memory) {
        (address[] memory addresses, , , uint256[] memory amounts) = IBeamChef(chef).pendingTokens(
            poolId,
            address(this)
        );
        return (addresses, amounts);
    }

    function callReward() public view returns (uint256) {
        IFeeConfig.FeeCategory memory fees = getFees();
        (address[] memory rewardAdd, uint256[] memory rewardBal) = rewardsAvailable();
        uint256 nativeOut;
        try IUniswapRouterETH(stellaRouter).getAmountsOut(rewardBal[0], outputToNativeRoute) returns (
            uint256[] memory amountOut
        ) {
            nativeOut = amountOut[amountOut.length - 1];
        } catch {}

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                for (uint j = 1; j < rewardAdd.length; j++) {
                    if (rewardAdd[j] == rewardToNativeRoute[i][0]) {
                        try
                            IUniswapRouterETH(stellaRouter).getAmountsOut(rewardBal[j], rewardToNativeRoute[i])
                        returns (uint256[] memory amountOut) {
                            nativeOut = nativeOut + amountOut[amountOut.length - 1];
                        } catch {}
                    }
                }
            }
        }

        return (((nativeOut * fees.total) / DIVISOR) * fees.call) / DIVISOR;
    }

    function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager {
        harvestOnDeposit = _harvestOnDeposit;

        if (harvestOnDeposit) {
            setWithdrawalFee(0);
        } else {
            setWithdrawalFee(10);
        }
    }

    function setShouldGasThrottle(bool _shouldGasThrottle) external onlyManager {
        shouldGasThrottle = _shouldGasThrottle;
    }

    // called as part of strat migration. Sends all the available funds back to the vault.
    function retireStrat() external {
        require(msg.sender == vault, "!vault");

        IBeamChef(chef).emergencyWithdraw(poolId);

        uint256 wantBal = IERC20(want).balanceOf(address(this));
        IERC20(want).transfer(vault, wantBal);
    }

    // pauses deposits and withdraws all funds from third party systems.
    function panic() public onlyManager {
        pause();
        IBeamChef(chef).emergencyWithdraw(poolId);
    }

    function pause() public onlyManager {
        _pause();

        _removeAllowances();
    }

    function unpause() external onlyManager {
        _unpause();

        _giveAllowances();

        deposit();
    }

    function _giveAllowances() internal {
        IERC20(want).safeApprove(chef, type(uint).max);
        IERC20(output).safeApprove(unirouter, type(uint).max);

        IERC20(native).safeApprove(unirouter, 0);
        IERC20(native).safeApprove(unirouter, type(uint).max);

        IERC20(lpToken0).safeApprove(unirouter, 0);
        IERC20(lpToken0).safeApprove(unirouter, type(uint).max);

        IERC20(lpToken1).safeApprove(unirouter, 0);
        IERC20(lpToken1).safeApprove(unirouter, type(uint).max);

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                IERC20(rewardToNativeRoute[i][0]).safeApprove(stellaRouter, 0);
                IERC20(rewardToNativeRoute[i][0]).safeApprove(stellaRouter, type(uint).max);
            }
        }
    }

    function _removeAllowances() internal {
        IERC20(want).safeApprove(chef, 0);
        IERC20(output).safeApprove(unirouter, 0);

        IERC20(lpToken0).safeApprove(unirouter, 0);
        IERC20(lpToken1).safeApprove(unirouter, 0);

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                IERC20(rewardToNativeRoute[i][0]).safeApprove(stellaRouter, 0);
            }
        }
    }

    function addRewardRoute(address[] memory _rewardToNativeRoute) external onlyOwner {
        IERC20(_rewardToNativeRoute[0]).safeApprove(stellaRouter, 0);
        IERC20(_rewardToNativeRoute[0]).safeApprove(stellaRouter, type(uint).max);
        rewardToNativeRoute.push(_rewardToNativeRoute);
    }

    function removeLastRewardRoute() external onlyManager {
        address reward = rewardToNativeRoute[rewardToNativeRoute.length - 1][0];
        if (reward != lpToken0 && reward != lpToken1) {
            IERC20(reward).safeApprove(stellaRouter, 0);
        }
        rewardToNativeRoute.pop();
    }

    function outputToNative() external view returns (address[] memory) {
        return outputToNativeRoute;
    }

    function nativeToLp0() external view returns (address[] memory) {
        return nativeToLp0Route;
    }

    function nativeToLp1() external view returns (address[] memory) {
        return nativeToLp1Route;
    }

    function rewardToNative() external view returns (address[][] memory) {
        return rewardToNativeRoute;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_chef","type":"address"},{"components":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"unirouter","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"beefyFeeRecipient","type":"address"},{"internalType":"address","name":"beefyFeeConfig","type":"address"}],"internalType":"struct StratFeeManager.CommonAddresses","name":"_commonAddresses","type":"tuple"},{"internalType":"address[]","name":"_outputToNativeRoute","type":"address[]"},{"internalType":"address[]","name":"_nativeToLp0Route","type":"address[]"},{"internalType":"address[]","name":"_nativeToLp1Route","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeConfig","type":"address"}],"name":"SetBeefyFeeConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeRecipient","type":"address"}],"name":"SetBeefyFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeId","type":"uint256"}],"name":"SetStratFeeId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unirouter","type":"address"}],"name":"SetUnirouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"SetVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalFee","type":"uint256"}],"name":"SetWithdrawalFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardToNativeRoute","type":"address[]"}],"name":"addRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeConfig","outputs":[{"internalType":"contract IFeeConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasprice","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllFees","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"beefy","type":"uint256"},{"internalType":"uint256","name":"call","type":"uint256"},{"internalType":"uint256","name":"strategist","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct IFeeConfig.FeeCategory","name":"performance","type":"tuple"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"internalType":"struct IFeeConfig.AllFees","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStratFeeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToLp0","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nativeToLp0Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToLp1","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nativeToLp1Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"output","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToNative","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLastRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToNative","outputs":[{"internalType":"address[][]","name":"","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeConfig","type":"address"}],"name":"setBeefyFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldGasThrottle","type":"bool"}],"name":"setShouldGasThrottle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeId","type":"uint256"}],"name":"setStratFeeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldGasThrottle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stellaRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a6007556008805474a43509661141f254f54d9a326e8ec851a0b95307016001600160a81b0319909116179055601080546001600160a01b0319167370085a09d30d6f8c4ecf6ee10120d1847383bb571790553480156200006557600080fd5b5060405162004e1a38038062004e1a833981016040819052620000889162000d5d565b83620000943362000595565b6000805460ff60a01b191681558151600180546001600160a01b03199081166001600160a01b0393841617909155602084015160028054831691841691909117905560408401516003805483169184169190911790556060840151600480548316918416919091179055608084015160058054831691841691909117905560a090930151600680548516918316919091179055600b805484168b8316179055600f899055600e80549093169088161790915583518491906200015a576200015a62000eb6565b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001845162000199919062000ee2565b81518110620001ac57620001ac62000eb6565b602090810291909101810151600980546001600160a01b0319166001600160a01b039092169190911790558351620001eb916012919086019062000bdc565b50600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000efc565b600c80546001600160a01b0319166001600160a01b03928316179055600954835191169083906000906200029e576200029e62000eb6565b60200260200101516001600160a01b031614620003025760405162461bcd60e51b815260206004820152601d60248201527f6e6174697665546f4c7030526f7574655b305d20213d206e617469766500000060448201526064015b60405180910390fd5b600c5482516001600160a01b03909116908390620003239060019062000ee2565b8151811062000336576200033662000eb6565b60200260200101516001600160a01b031614620003a15760405162461bcd60e51b815260206004820152602260248201527f6e6174697665546f4c7030526f7574655b6c6173745d20213d206c70546f6b6560448201526106e360f41b6064820152608401620002f9565b8151620003b690601390602085019062000bdc565b50600b60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000431919062000efc565b600d80546001600160a01b0319166001600160a01b039283161790556009548251911690829060009062000469576200046962000eb6565b60200260200101516001600160a01b031614620004c95760405162461bcd60e51b815260206004820152601d60248201527f6e6174697665546f4c7031526f7574655b305d20213d206e61746976650000006044820152606401620002f9565b600d5481516001600160a01b03909116908290620004ea9060019062000ee2565b81518110620004fd57620004fd62000eb6565b60200260200101516001600160a01b031614620005685760405162461bcd60e51b815260206004820152602260248201527f6e6174697665546f4c7031526f7574655b6c6173745d20213d206c70546f6b656044820152616e3160f01b6064820152608401620002f9565b80516200057d90601490602084019062000bdc565b5062000588620005e5565b5050505050505062000ffa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600e54600b5462000612916001600160a01b0391821691166000196200081a602090811b620021f217901c565b600254600a546200063f916001600160a01b0391821691166000196200081a602090811b620021f217901c565b6002546009546200066b916001600160a01b03918216911660006200081a602090811b620021f217901c565b60025460095462000698916001600160a01b0391821691166000196200081a602090811b620021f217901c565b600254600c54620006c4916001600160a01b03918216911660006200081a602090811b620021f217901c565b600254600c54620006f1916001600160a01b0391821691166000196200081a602090811b620021f217901c565b600254600d546200071d916001600160a01b03918216911660006200081a602090811b620021f217901c565b600254600d546200074a916001600160a01b0391821691166000196200081a602090811b620021f217901c565b60155415620008185760005b601554811015620008165760105460158054620007d4926001600160a01b031691600091859081106200078d576200078d62000eb6565b90600052602060002001600081548110620007ac57620007ac62000eb6565b600091825260209182902001546001600160a01b0316929190620021f26200081a821b17901c565b6010546015805462000801926001600160a01b03169160001991859081106200078d576200078d62000eb6565b806200080d8162000f1a565b91505062000756565b505b565b801580620008985750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000896919062000f36565b155b6200090c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620002f9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620009649185916200096916565b505050565b6000620009c5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000a4760201b6200233f179092919060201c565b805190915015620009645780806020019051810190620009e6919062000f50565b620009645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002f9565b606062000a58848460008562000a62565b90505b9392505050565b60608247101562000ac55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002f9565b6001600160a01b0385163b62000b1e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002f9565b600080866001600160a01b0316858760405162000b3c919062000fa7565b60006040518083038185875af1925050503d806000811462000b7b576040519150601f19603f3d011682016040523d82523d6000602084013e62000b80565b606091505b50909250905062000b9382828662000b9e565b979650505050505050565b6060831562000baf57508162000a5b565b82511562000bc05782518084602001fd5b8160405162461bcd60e51b8152600401620002f9919062000fc5565b82805482825590600052602060002090810192821562000c34579160200282015b8281111562000c3457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000bfd565b5062000c4292915062000c46565b5090565b5b8082111562000c42576000815560010162000c47565b80516001600160a01b038116811462000c7557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b038111828210171562000cb55762000cb562000c7a565b60405290565b600082601f83011262000ccd57600080fd5b815160206001600160401b038083111562000cec5762000cec62000c7a565b8260051b604051601f19603f8301168101818110848211171562000d145762000d1462000c7a565b60405293845285810183019383810192508785111562000d3357600080fd5b83870191505b8482101562000b935762000d4d8262000c5d565b8352918301919083019062000d39565b600080600080600080600087890361018081121562000d7b57600080fd5b62000d868962000c5d565b97506020890151965062000d9d60408a0162000c5d565b955060c0605f198201121562000db257600080fd5b5062000dbd62000c90565b62000dcb60608a0162000c5d565b815262000ddb60808a0162000c5d565b602082015262000dee60a08a0162000c5d565b604082015262000e0160c08a0162000c5d565b606082015262000e1460e08a0162000c5d565b608082015262000e286101008a0162000c5d565b60a08201526101208901519094506001600160401b038082111562000e4c57600080fd5b62000e5a8b838c0162000cbb565b94506101408a015191508082111562000e7257600080fd5b62000e808b838c0162000cbb565b93506101608a015191508082111562000e9857600080fd5b5062000ea78a828b0162000cbb565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101562000ef75762000ef762000ecc565b500390565b60006020828403121562000f0f57600080fd5b62000a5b8262000c5d565b60006001820162000f2f5762000f2f62000ecc565b5060010190565b60006020828403121562000f4957600080fd5b5051919050565b60006020828403121562000f6357600080fd5b8151801515811462000a5b57600080fd5b60005b8381101562000f9157818101518382015260200162000f77565b8381111562000fa1576000848401525b50505050565b6000825162000fbb81846020870162000f74565b9190910192915050565b602081526000825180602084015262000fe681604085016020870162000f74565b601f01601f19169190910160400192915050565b613e10806200100a6000396000f3fe6080604052600436106103bc5760003560e01c8063877562b6116101f2578063d0e30db01161010d578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610a77578063fad4675e14610a97578063fb61778714610ab7578063fbfa77cf14610acc57600080fd5b8063e941fa7814610a17578063ea82eb9e14610a2c578063f1a392da14610a41578063f20eaeb814610a5757600080fd5b8063dc4987cc116100dc578063dc4987cc1461099f578063dfbdc437146109bf578063e270dbf3146109d4578063e7a7250a146109f457600080fd5b8063d0e30db014610933578063d801d94614610948578063d92f3d731461095d578063da512c341461097d57600080fd5b8063a68833e511610185578063be12a97811610154578063be12a978146108be578063c1a3d44c146108de578063c7b9d530146108f3578063cc2894801461091357600080fd5b8063a68833e51461083c578063ac1e50251461085c578063aced16611461087c578063b20feaaf1461089c57600080fd5b80638e145459116101c15780638e145459146107d857806397fd323d146107f85780639f8b5da11461080d578063a39219f91461082757600080fd5b8063877562b6146107645780638912cb8b146107845780638cfc0250146107a55780638da5cb5b146107ba57600080fd5b80634641257d116102e25780636817031b11610275578063722713f711610244578063722713f7146106fa578063748747e61461070f578063821ccef51461072f5780638456cb591461074f57600080fd5b80636817031b146106805780636ec232d3146106a057806370672d50146106c5578063715018a6146106e557600080fd5b8063573fef0a116102b1578063573fef0a1461060c5780635c975abb146106215780635ee167c01461064c57806367a527931461066c57600080fd5b80634641257d146105ac5780634700d305146105c15780634746fb55146105d657806354518b1a146105f657600080fd5b80631fc8bc5d1161035a57806337bdd2041161032957806337bdd2041461054c5780633e0dc34e146105615780633e55f932146105775780633f4ba83a1461059757600080fd5b80631fc8bc5d146104cc5780631fe4a686146104ec578063257ae0de1461050c5780632e1a7d4d1461052c57600080fd5b80631158808611610396578063115880861461042a57806311b0b42d1461045257806313e120b11461048a5780631f1fcd51146104ac57600080fd5b80630e5c011e146103c85780630e8fbb5a146103ea578063106fdbd01461040a57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103e86103e33660046134ef565b610aec565b005b3480156103f657600080fd5b506103e861040536600461351a565b610bdf565b34801561041657600080fd5b506103e86104253660046134ef565b610c59565b34801561043657600080fd5b5061043f610cb6565b6040519081526020015b60405180910390f35b34801561045e57600080fd5b50600954610472906001600160a01b031681565b6040516001600160a01b039091168152602001610449565b34801561049657600080fd5b5061049f610d3c565b604051610449919061357b565b3480156104b857600080fd5b50600b54610472906001600160a01b031681565b3480156104d857600080fd5b50600e54610472906001600160a01b031681565b3480156104f857600080fd5b50600454610472906001600160a01b031681565b34801561051857600080fd5b50600254610472906001600160a01b031681565b34801561053857600080fd5b506103e861054736600461358e565b610d9e565b34801561055857600080fd5b5061049f610fe3565b34801561056d57600080fd5b5061043f600f5481565b34801561058357600080fd5b506103e861059236600461358e565b611043565b3480156105a357600080fd5b506103e8611111565b3480156105b857600080fd5b506103e861116a565b3480156105cd57600080fd5b506103e8611255565b3480156105e257600080fd5b50600654610472906001600160a01b031681565b34801561060257600080fd5b5061043f61271081565b34801561061857600080fd5b506103e8611305565b34801561062d57600080fd5b50600054600160a01b900460ff165b6040519015158152602001610449565b34801561065857600080fd5b50600c54610472906001600160a01b031681565b34801561067857600080fd5b50600061043f565b34801561068c57600080fd5b506103e861069b3660046134ef565b611341565b3480156106ac57600080fd5b506008546104729061010090046001600160a01b031681565b3480156106d157600080fd5b506104726106e03660046135a7565b611397565b3480156106f157600080fd5b506103e86113db565b34801561070657600080fd5b5061043f6113ed565b34801561071b57600080fd5b506103e861072a3660046134ef565b61140e565b34801561073b57600080fd5b50601054610472906001600160a01b031681565b34801561075b57600080fd5b506103e861149b565b34801561077057600080fd5b50600d54610472906001600160a01b031681565b34801561079057600080fd5b5060105461063c90600160a01b900460ff1681565b3480156107b157600080fd5b5061043f6114ea565b3480156107c657600080fd5b506000546001600160a01b0316610472565b3480156107e457600080fd5b50600554610472906001600160a01b031681565b34801561080457600080fd5b5061043f611558565b34801561081957600080fd5b5060085461063c9060ff1681565b34801561083357600080fd5b506103e861182d565b34801561084857600080fd5b506103e86108573660046134ef565b611938565b34801561086857600080fd5b506103e861087736600461358e565b61198e565b34801561088857600080fd5b50600354610472906001600160a01b031681565b3480156108a857600080fd5b506108b1611a3c565b6040516104499190613621565b3480156108ca57600080fd5b506104726108d936600461358e565b611a72565b3480156108ea57600080fd5b5061043f611a9c565b3480156108ff57600080fd5b506103e861090e3660046134ef565b611acd565b34801561091f57600080fd5b506103e861092e366004613732565b611b63565b34801561093f57600080fd5b506103e8611c20565b34801561095457600080fd5b506103e8611d42565b34801561096957600080fd5b506103e86109783660046134ef565b611d81565b34801561098957600080fd5b50610992611dd7565b60405161044991906137c6565b3480156109ab57600080fd5b506104726109ba36600461358e565b611e7a565b3480156109cb57600080fd5b5061043f603281565b3480156109e057600080fd5b506104726109ef36600461358e565b611e8a565b348015610a0057600080fd5b50610a09611e9a565b604051610449929190613859565b348015610a2357600080fd5b5061043f611f30565b348015610a3857600080fd5b5061049f611f4f565b348015610a4d57600080fd5b5061043f60115481565b348015610a6357600080fd5b50600a54610472906001600160a01b031681565b348015610a8357600080fd5b506103e8610a923660046134ef565b611faf565b348015610aa357600080fd5b506103e8610ab236600461351a565b612025565b348015610ac357600080fd5b506103e8612077565b348015610ad857600080fd5b50600154610472906001600160a01b031681565b60085460ff168015610b0e575060085461010090046001600160a01b03163b15155b15610bd357600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906138b0565b3a1115610bd35760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b60448201526064015b60405180910390fd5b610bdc81612358565b50565b6000546001600160a01b0316331480610c0257506003546001600160a01b031633145b610c1e5760405162461bcd60e51b8152600401610bca906138c9565b6010805460ff60a01b1916600160a01b8315158102919091179182905560ff91041615610c4f57610bdc600061198e565b610bdc600a61198e565b610c616124b9565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b600e54600f546040516393f1a40b60e01b8152600481019190915230602482015260009182916001600160a01b03909116906393f1a40b90604401608060405180830381865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3291906138eb565b5091949350505050565b60606012805480602002602001604051908101604052809291908181526020018280548015610d9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d76575b5050505050905090565b6001546001600160a01b03163314610dc85760405162461bcd60e51b8152600401610bca90613921565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3591906138b0565b905081811015610f2657600e54600f546001600160a01b039091169063441a3e7090610e618486613957565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906138b0565b90505b81811115610f315750805b6000546001600160a01b03163214801590610f565750600054600160a01b900460ff16155b15610f8857600061271060075483610f6e919061396e565b610f78919061398d565b9050610f848183613957565b9150505b600154600b54610fa5916001600160a01b03918216911683612513565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610fce6113ed565b60405190815260200160405180910390a15050565b60606014805480602002602001604051908101604052809291908181526020018280548015610d94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d76575050505050905090565b6000546001600160a01b031633148061106657506003546001600160a01b031633145b6110825760405162461bcd60e51b8152600401610bca906138c9565b600654604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f81604051610cab91815260200190565b6000546001600160a01b031633148061113457506003546001600160a01b031633145b6111505760405162461bcd60e51b8152600401610bca906138c9565b611158612543565b611160612598565b611168611c20565b565b60085460ff16801561118c575060085461010090046001600160a01b03163b15155b1561124c57600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120a91906138b0565b3a111561124c5760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b6044820152606401610bca565b61116832612358565b6000546001600160a01b031633148061127857506003546001600160a01b031633145b6112945760405162461bcd60e51b8152600401610bca906138c9565b61129c61149b565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916112d19160040190815260200190565b600060405180830381600087803b1580156112eb57600080fd5b505af11580156112ff573d6000803e3d6000fd5b50505050565b601054600160a01b900460ff1615611168576001546001600160a01b0316331461124c5760405162461bcd60e51b8152600401610bca90613921565b6113496124b9565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610cab565b601582815481106113a757600080fd5b9060005260206000200181815481106113bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6113e36124b9565b611168600061273d565b60006113f7610cb6565b6113ff611a9c565b61140991906139af565b905090565b6000546001600160a01b031633148061143157506003546001600160a01b031633145b61144d5760405162461bcd60e51b8152600401610bca906138c9565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610cab565b6000546001600160a01b03163314806114be57506003546001600160a01b031633145b6114da5760405162461bcd60e51b8152600401610bca906138c9565b6114e261278d565b6111686127d0565b600654604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa158015611534573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140991906138b0565b600080611563612897565b9050600080611570611e9a565b915091506000601060009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f836000815181106115ad576115ad6139c7565b602002602001015160126040518363ffffffff1660e01b81526004016115d4929190613a1b565b600060405180830381865afa92505050801561161257506040513d6000823e601f3d908101601f1916820160405261160f9190810190613a9a565b60015b156116425780600182516116269190613957565b81518110611636576116366139c7565b60200260200101519150505b601554156117df5760005b6015548110156117dd5760015b84518110156117ca5760158281548110611676576116766139c7565b90600052602060002001600081548110611692576116926139c7565b60009182526020909120015485516001600160a01b03909116908690839081106116be576116be6139c7565b60200260200101516001600160a01b0316036117b85760105484516001600160a01b039091169063d06ca61f908690849081106116fd576116fd6139c7565b602002602001015160158581548110611718576117186139c7565b906000526020600020016040518363ffffffff1660e01b815260040161173f929190613a1b565b600060405180830381865afa92505050801561177d57506040513d6000823e601f3d908101601f1916820160405261177a9190810190613a9a565b60015b156117b85780600182516117919190613957565b815181106117a1576117a16139c7565b6020026020010151846117b491906139af565b9350505b806117c281613ad7565b91505061165a565b50806117d581613ad7565b91505061164d565b505b670de0b6b3a76400008460400151670de0b6b3a7640000866000015184611806919061396e565b611810919061398d565b61181a919061396e565b611824919061398d565b94505050505090565b6000546001600160a01b031633148061185057506003546001600160a01b031633145b61186c5760405162461bcd60e51b8152600401610bca906138c9565b601580546000919061188090600190613957565b81548110611890576118906139c7565b906000526020600020016000815481106118ac576118ac6139c7565b600091825260209091200154600c546001600160a01b0391821692501681148015906118e65750600d546001600160a01b03828116911614155b1561190657601054611906906001600160a01b03838116911660006121f2565b601580548061191757611917613af0565b60019003818190600052602060002001600061193391906133e8565b905550565b6119406124b9565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac8590602001610cab565b6000546001600160a01b03163314806119b157506003546001600160a01b031633145b6119cd5760405162461bcd60e51b8152600401610bca906138c9565b6032811115611a075760405162461bcd60e51b8152600401610bca906020808252600490820152630216361760e41b604082015260600190565b60078190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af90602001610cab565b611a44613406565b6040518060600160405280611a57612897565b815260200160008152602001611a6b611f30565b9052919050565b60128181548110611a8257600080fd5b6000918252602090912001546001600160a01b0316905081565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401611517565b6004546001600160a01b03163314611b155760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610bca565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec541290602001610cab565b611b6b6124b9565b6010548151611bb1916001600160a01b03169060009084908290611b9157611b916139c7565b60200260200101516001600160a01b03166121f29092919063ffffffff16565b6010548151611bd9916001600160a01b031690600019908490600090611b9157611b916139c7565b601580546001810182556000919091528151611c1c917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190613460565b5050565b611c28612942565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9591906138b0565b90508015610bdc57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611cd9918590600401918252602082015260400190565b600060405180830381600087803b158015611cf357600080fd5b505af1158015611d07573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611d346113ed565b604051908152602001610cab565b6000546001600160a01b0316331480611d6557506003546001600160a01b031633145b61124c5760405162461bcd60e51b8152600401610bca906138c9565b611d896124b9565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa90602001610cab565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611e7157600084815260209081902083018054604080518285028101850190915281815292830182828015611e5d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e3f575b505050505081526020019060010190611dfb565b50505050905090565b60148181548110611a8257600080fd5b60138181548110611a8257600080fd5b600e54600f5460405160016232bd9d60e01b031981526004810191909152306024820152606091829160009182916001600160a01b039091169063ffcd426390604401600060405180830381865afa158015611efa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f229190810190613b6a565b929792965091945050505050565b60008054600160a01b900460ff16611f49575060075490565b50600090565b60606013805480602002602001604051908101604052809291908181526020018280548015610d94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d76575050505050905090565b611fb76124b9565b6001600160a01b03811661201c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bca565b610bdc8161273d565b6000546001600160a01b031633148061204857506003546001600160a01b031633145b6120645760405162461bcd60e51b8152600401610bca906138c9565b6008805460ff1916911515919091179055565b6001546001600160a01b031633146120a15760405162461bcd60e51b8152600401610bca90613921565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916120d69160040190815260200190565b600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217791906138b0565b600b5460015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1c9190613c78565b80158061226c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226a91906138b0565b155b6122d75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610bca565b6040516001600160a01b03831660248201526044810182905261233a90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261298f565b505050565b606061234e8484600085612a61565b90505b9392505050565b612360612942565b600e54600f54604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b1580156123b157600080fd5b505af11580156123c5573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243891906138b0565b90508015611c1c57612448612b92565b61245182612e6d565b61245961301c565b6000612463611a9c565b905061246d611c20565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f924108261249c6113ed565b6040805192835260208301919091520160405180910390a2505050565b6000546001600160a01b031633146111685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bca565b6040516001600160a01b03831660248201526044810182905261233a90849063a9059cbb60e01b90606401612303565b61254b61335f565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600e54600b546125b7916001600160a01b0391821691166000196121f2565b600254600a546125d6916001600160a01b0391821691166000196121f2565b6002546009546125f4916001600160a01b03918216911660006121f2565b600254600954612613916001600160a01b0391821691166000196121f2565b600254600c54612631916001600160a01b03918216911660006121f2565b600254600c54612650916001600160a01b0391821691166000196121f2565b600254600d5461266e916001600160a01b03918216911660006121f2565b600254600d5461268d916001600160a01b0391821691166000196121f2565b601554156111685760005b601554811015610bdc5760105460158054612702926001600160a01b031691600091859081106126ca576126ca6139c7565b906000526020600020016000815481106126e6576126e66139c7565b6000918252602090912001546001600160a01b031691906121f2565b6010546015805461272b926001600160a01b03169160001991859081106126ca576126ca6139c7565b8061273581613ad7565b915050612698565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612795612942565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861257b3390565b600e54600b546127ee916001600160a01b03918216911660006121f2565b600254600a5461280c916001600160a01b03918216911660006121f2565b600254600c5461282a916001600160a01b03918216911660006121f2565b600254600d54612848916001600160a01b03918216911660006121f2565b601554156111685760005b601554811015610bdc5760105460158054612885926001600160a01b031691600091859081106126ca576126ca6139c7565b8061288f81613ad7565b915050612853565b6128d26040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b600654604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa15801561291a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114099190810190613c95565b600054600160a01b900460ff16156111685760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bca565b60006129e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661233f9092919063ffffffff16565b80519091501561233a5780806020019051810190612a029190613c78565b61233a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bca565b606082471015612ac25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bca565b6001600160a01b0385163b612b195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bca565b600080866001600160a01b03168587604051612b359190613d41565b60006040518083038185875af1925050503d8060008114612b72576040519150601f19603f3d011682016040523d82523d6000602084013e612b77565b606091505b5091509150612b878282866133af565b979650505050505050565b478015612c0357600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612be957600080fd5b505af1158015612bfd573d6000803e3d6000fd5b50505050505b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7091906138b0565b6002546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612cab90849060009060129030904290600401613d5d565b6000604051808303816000875af1158015612cca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cf29190810190613a9a565b5060155415611c1c5760005b60155481101561233a57600060158281548110612d1d57612d1d6139c7565b90600052602060002001600081548110612d3957612d396139c7565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dae91906138b0565b90508015612e5a57601054601580546001600160a01b03909216916338ed17399184916000919087908110612de557612de56139c7565b9060005260206000200130426040518663ffffffff1660e01b8152600401612e11959493929190613d5d565b6000604051808303816000875af1158015612e30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e589190810190613a9a565b505b5080612e6581613ad7565b915050612cfe565b6000612e77612897565b80516009546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef491906138b0565b612efe919061396e565b612f08919061398d565b90506000670de0b6b3a7640000836040015183612f25919061396e565b612f2f919061398d565b600954909150612f49906001600160a01b03168583612513565b6000670de0b6b3a7640000846020015184612f64919061396e565b612f6e919061398d565b600554600954919250612f8e916001600160a01b03908116911683612513565b6000670de0b6b3a7640000856060015185612fa9919061396e565b612fb3919061398d565b600454600954919250612fd3916001600160a01b03908116911683612513565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b6009546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561306a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308e91906138b0565b613098919061398d565b600954600c549192506001600160a01b03918216911614613136576002546040516338ed173960e01b81526001600160a01b03909116906338ed1739906130ed90849060009060139030904290600401613d5d565b6000604051808303816000875af115801561310c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131349190810190613a9a565b505b600954600d546001600160a01b039081169116146131d1576002546040516338ed173960e01b81526001600160a01b03909116906338ed17399061318890849060009060149030904290600401613d5d565b6000604051808303816000875af11580156131a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131cf9190810190613a9a565b505b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561321a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323e91906138b0565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561328c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b091906138b0565b600254600c54600d5460405162e8e33760e81b81526001600160a01b0392831660048201529082166024820152604481018690526064810184905260016084820181905260a48201523060c48201524260e4820152929350169063e8e3370090610104016060604051808303816000875af1158015613333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133579190613d99565b505050505050565b600054600160a01b900460ff166111685760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bca565b606083156133be575081612351565b8251156133ce5782518084602001fd5b8160405162461bcd60e51b8152600401610bca9190613dc7565b5080546000825590600052602060002090810190610bdc91906134c5565b604051806060016040528061344c6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b8280548282559060005260206000209081019282156134b5579160200282015b828111156134b557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613480565b506134c19291506134c5565b5090565b5b808211156134c157600081556001016134c6565b6001600160a01b0381168114610bdc57600080fd5b60006020828403121561350157600080fd5b8135612351816134da565b8015158114610bdc57600080fd5b60006020828403121561352c57600080fd5b81356123518161350c565b600081518084526020808501945080840160005b838110156135705781516001600160a01b03168752958201959082019060010161354b565b509495945050505050565b6020815260006123516020830184613537565b6000602082840312156135a057600080fd5b5035919050565b600080604083850312156135ba57600080fd5b50508035926020909101359150565b60005b838110156135e45781810151838201526020016135cc565b838111156112ff5750506000910152565b6000815180845261360d8160208601602086016135c9565b601f01601f19169290920160200192915050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c06101008501526136706101408501826135f5565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156136d7576136d761369e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137065761370661369e565b604052919050565b600067ffffffffffffffff8211156137285761372861369e565b5060051b60200190565b6000602080838503121561374557600080fd5b823567ffffffffffffffff81111561375c57600080fd5b8301601f8101851361376d57600080fd5b803561378061377b8261370e565b6136dd565b81815260059190911b8201830190838101908783111561379f57600080fd5b928401925b82841015612b875783356137b7816134da565b825292840192908401906137a4565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561384b57888603603f19018552825180518088529088019088880190845b818110156138355783516001600160a01b03168352928a0192918a0191600101613810565b50909750505093860193918601916001016137ee565b509398975050505050505050565b60408152600061386c6040830185613537565b82810360208481019190915284518083528582019282019060005b818110156138a357845183529383019391830191600101613887565b5090979650505050505050565b6000602082840312156138c257600080fd5b5051919050565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6000806000806080858703121561390157600080fd5b505082516020840151604085015160609095015191969095509092509050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561396957613969613941565b500390565b600081600019048311821515161561398857613988613941565b500290565b6000826139aa57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156139c2576139c2613941565b500190565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b838110156135705781546001600160a01b0316875295820195600191820191016139f6565b82815260406020820152600061234e60408301846139dd565b600082601f830112613a4557600080fd5b81516020613a5561377b8361370e565b82815260059290921b84018101918181019086841115613a7457600080fd5b8286015b84811015613a8f5780518352918301918301613a78565b509695505050505050565b600060208284031215613aac57600080fd5b815167ffffffffffffffff811115613ac357600080fd5b613acf84828501613a34565b949350505050565b600060018201613ae957613ae9613941565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600082601f830112613b1757600080fd5b815167ffffffffffffffff811115613b3157613b3161369e565b613b44601f8201601f19166020016136dd565b818152846020838601011115613b5957600080fd5b613acf8260208301602087016135c9565b60008060008060808587031215613b8057600080fd5b845167ffffffffffffffff80821115613b9857600080fd5b818701915087601f830112613bac57600080fd5b81516020613bbc61377b8361370e565b82815260059290921b8401810191818101908b841115613bdb57600080fd5b948201945b83861015613c02578551613bf3816134da565b82529482019490820190613be0565b918a0151919850909350505080821115613c1b57600080fd5b613c2788838901613b06565b94506040870151915080821115613c3d57600080fd5b613c4988838901613a34565b93506060870151915080821115613c5f57600080fd5b50613c6c87828801613a34565b91505092959194509250565b600060208284031215613c8a57600080fd5b81516123518161350c565b600060208284031215613ca757600080fd5b815167ffffffffffffffff80821115613cbf57600080fd5b9083019060c08286031215613cd357600080fd5b613cdb6136b4565b82518152602083015160208201526040830151604082015260608301516060820152608083015182811115613d0f57600080fd5b613d1b87828601613b06565b60808301525060a08301519250613d318361350c565b60a0810192909252509392505050565b60008251613d538184602087016135c9565b9190910192915050565b85815284602082015260a060408201526000613d7c60a08301866139dd565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613dae57600080fd5b8351925060208401519150604084015190509250925092565b60208152600061235160208301846135f556fea264697066735822122033e34266f9b88c0b82bd6fe91ca2d1e211162db7d918606081629915f14ba0b864736f6c634300080f003300000000000000000000000079f05b32e29139c35cd219aedb5d99cedb1915ac0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000c6ca172fc8bdb803c5e12731109744fb0200587b000000000000000000000000c302df25da018444f8b9261cf7f0f4ea0999e97b00000000000000000000000096b244391d98b62d19ae89b1a4dccf0fc56970c70000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b619000000000000000000000000fb41cbf2ce16e8f626013a2f465521d27ba9a61000000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd3b51d98478d53f4515a306be565c6eebef1d58000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb9490000000000000000000000000000000000000000000000000000000000000002000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c8063877562b6116101f2578063d0e30db01161010d578063e941fa78116100a0578063f2fde38b1161006f578063f2fde38b14610a77578063fad4675e14610a97578063fb61778714610ab7578063fbfa77cf14610acc57600080fd5b8063e941fa7814610a17578063ea82eb9e14610a2c578063f1a392da14610a41578063f20eaeb814610a5757600080fd5b8063dc4987cc116100dc578063dc4987cc1461099f578063dfbdc437146109bf578063e270dbf3146109d4578063e7a7250a146109f457600080fd5b8063d0e30db014610933578063d801d94614610948578063d92f3d731461095d578063da512c341461097d57600080fd5b8063a68833e511610185578063be12a97811610154578063be12a978146108be578063c1a3d44c146108de578063c7b9d530146108f3578063cc2894801461091357600080fd5b8063a68833e51461083c578063ac1e50251461085c578063aced16611461087c578063b20feaaf1461089c57600080fd5b80638e145459116101c15780638e145459146107d857806397fd323d146107f85780639f8b5da11461080d578063a39219f91461082757600080fd5b8063877562b6146107645780638912cb8b146107845780638cfc0250146107a55780638da5cb5b146107ba57600080fd5b80634641257d116102e25780636817031b11610275578063722713f711610244578063722713f7146106fa578063748747e61461070f578063821ccef51461072f5780638456cb591461074f57600080fd5b80636817031b146106805780636ec232d3146106a057806370672d50146106c5578063715018a6146106e557600080fd5b8063573fef0a116102b1578063573fef0a1461060c5780635c975abb146106215780635ee167c01461064c57806367a527931461066c57600080fd5b80634641257d146105ac5780634700d305146105c15780634746fb55146105d657806354518b1a146105f657600080fd5b80631fc8bc5d1161035a57806337bdd2041161032957806337bdd2041461054c5780633e0dc34e146105615780633e55f932146105775780633f4ba83a1461059757600080fd5b80631fc8bc5d146104cc5780631fe4a686146104ec578063257ae0de1461050c5780632e1a7d4d1461052c57600080fd5b80631158808611610396578063115880861461042a57806311b0b42d1461045257806313e120b11461048a5780631f1fcd51146104ac57600080fd5b80630e5c011e146103c85780630e8fbb5a146103ea578063106fdbd01461040a57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103e86103e33660046134ef565b610aec565b005b3480156103f657600080fd5b506103e861040536600461351a565b610bdf565b34801561041657600080fd5b506103e86104253660046134ef565b610c59565b34801561043657600080fd5b5061043f610cb6565b6040519081526020015b60405180910390f35b34801561045e57600080fd5b50600954610472906001600160a01b031681565b6040516001600160a01b039091168152602001610449565b34801561049657600080fd5b5061049f610d3c565b604051610449919061357b565b3480156104b857600080fd5b50600b54610472906001600160a01b031681565b3480156104d857600080fd5b50600e54610472906001600160a01b031681565b3480156104f857600080fd5b50600454610472906001600160a01b031681565b34801561051857600080fd5b50600254610472906001600160a01b031681565b34801561053857600080fd5b506103e861054736600461358e565b610d9e565b34801561055857600080fd5b5061049f610fe3565b34801561056d57600080fd5b5061043f600f5481565b34801561058357600080fd5b506103e861059236600461358e565b611043565b3480156105a357600080fd5b506103e8611111565b3480156105b857600080fd5b506103e861116a565b3480156105cd57600080fd5b506103e8611255565b3480156105e257600080fd5b50600654610472906001600160a01b031681565b34801561060257600080fd5b5061043f61271081565b34801561061857600080fd5b506103e8611305565b34801561062d57600080fd5b50600054600160a01b900460ff165b6040519015158152602001610449565b34801561065857600080fd5b50600c54610472906001600160a01b031681565b34801561067857600080fd5b50600061043f565b34801561068c57600080fd5b506103e861069b3660046134ef565b611341565b3480156106ac57600080fd5b506008546104729061010090046001600160a01b031681565b3480156106d157600080fd5b506104726106e03660046135a7565b611397565b3480156106f157600080fd5b506103e86113db565b34801561070657600080fd5b5061043f6113ed565b34801561071b57600080fd5b506103e861072a3660046134ef565b61140e565b34801561073b57600080fd5b50601054610472906001600160a01b031681565b34801561075b57600080fd5b506103e861149b565b34801561077057600080fd5b50600d54610472906001600160a01b031681565b34801561079057600080fd5b5060105461063c90600160a01b900460ff1681565b3480156107b157600080fd5b5061043f6114ea565b3480156107c657600080fd5b506000546001600160a01b0316610472565b3480156107e457600080fd5b50600554610472906001600160a01b031681565b34801561080457600080fd5b5061043f611558565b34801561081957600080fd5b5060085461063c9060ff1681565b34801561083357600080fd5b506103e861182d565b34801561084857600080fd5b506103e86108573660046134ef565b611938565b34801561086857600080fd5b506103e861087736600461358e565b61198e565b34801561088857600080fd5b50600354610472906001600160a01b031681565b3480156108a857600080fd5b506108b1611a3c565b6040516104499190613621565b3480156108ca57600080fd5b506104726108d936600461358e565b611a72565b3480156108ea57600080fd5b5061043f611a9c565b3480156108ff57600080fd5b506103e861090e3660046134ef565b611acd565b34801561091f57600080fd5b506103e861092e366004613732565b611b63565b34801561093f57600080fd5b506103e8611c20565b34801561095457600080fd5b506103e8611d42565b34801561096957600080fd5b506103e86109783660046134ef565b611d81565b34801561098957600080fd5b50610992611dd7565b60405161044991906137c6565b3480156109ab57600080fd5b506104726109ba36600461358e565b611e7a565b3480156109cb57600080fd5b5061043f603281565b3480156109e057600080fd5b506104726109ef36600461358e565b611e8a565b348015610a0057600080fd5b50610a09611e9a565b604051610449929190613859565b348015610a2357600080fd5b5061043f611f30565b348015610a3857600080fd5b5061049f611f4f565b348015610a4d57600080fd5b5061043f60115481565b348015610a6357600080fd5b50600a54610472906001600160a01b031681565b348015610a8357600080fd5b506103e8610a923660046134ef565b611faf565b348015610aa357600080fd5b506103e8610ab236600461351a565b612025565b348015610ac357600080fd5b506103e8612077565b348015610ad857600080fd5b50600154610472906001600160a01b031681565b60085460ff168015610b0e575060085461010090046001600160a01b03163b15155b15610bd357600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906138b0565b3a1115610bd35760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b60448201526064015b60405180910390fd5b610bdc81612358565b50565b6000546001600160a01b0316331480610c0257506003546001600160a01b031633145b610c1e5760405162461bcd60e51b8152600401610bca906138c9565b6010805460ff60a01b1916600160a01b8315158102919091179182905560ff91041615610c4f57610bdc600061198e565b610bdc600a61198e565b610c616124b9565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b600e54600f546040516393f1a40b60e01b8152600481019190915230602482015260009182916001600160a01b03909116906393f1a40b90604401608060405180830381865afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3291906138eb565b5091949350505050565b60606012805480602002602001604051908101604052809291908181526020018280548015610d9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d76575b5050505050905090565b6001546001600160a01b03163314610dc85760405162461bcd60e51b8152600401610bca90613921565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3591906138b0565b905081811015610f2657600e54600f546001600160a01b039091169063441a3e7090610e618486613957565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2391906138b0565b90505b81811115610f315750805b6000546001600160a01b03163214801590610f565750600054600160a01b900460ff16155b15610f8857600061271060075483610f6e919061396e565b610f78919061398d565b9050610f848183613957565b9150505b600154600b54610fa5916001600160a01b03918216911683612513565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610fce6113ed565b60405190815260200160405180910390a15050565b60606014805480602002602001604051908101604052809291908181526020018280548015610d94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d76575050505050905090565b6000546001600160a01b031633148061106657506003546001600160a01b031633145b6110825760405162461bcd60e51b8152600401610bca906138c9565b600654604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f81604051610cab91815260200190565b6000546001600160a01b031633148061113457506003546001600160a01b031633145b6111505760405162461bcd60e51b8152600401610bca906138c9565b611158612543565b611160612598565b611168611c20565b565b60085460ff16801561118c575060085461010090046001600160a01b03163b15155b1561124c57600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120a91906138b0565b3a111561124c5760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b6044820152606401610bca565b61116832612358565b6000546001600160a01b031633148061127857506003546001600160a01b031633145b6112945760405162461bcd60e51b8152600401610bca906138c9565b61129c61149b565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916112d19160040190815260200190565b600060405180830381600087803b1580156112eb57600080fd5b505af11580156112ff573d6000803e3d6000fd5b50505050565b601054600160a01b900460ff1615611168576001546001600160a01b0316331461124c5760405162461bcd60e51b8152600401610bca90613921565b6113496124b9565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610cab565b601582815481106113a757600080fd5b9060005260206000200181815481106113bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6113e36124b9565b611168600061273d565b60006113f7610cb6565b6113ff611a9c565b61140991906139af565b905090565b6000546001600160a01b031633148061143157506003546001600160a01b031633145b61144d5760405162461bcd60e51b8152600401610bca906138c9565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610cab565b6000546001600160a01b03163314806114be57506003546001600160a01b031633145b6114da5760405162461bcd60e51b8152600401610bca906138c9565b6114e261278d565b6111686127d0565b600654604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa158015611534573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140991906138b0565b600080611563612897565b9050600080611570611e9a565b915091506000601060009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f836000815181106115ad576115ad6139c7565b602002602001015160126040518363ffffffff1660e01b81526004016115d4929190613a1b565b600060405180830381865afa92505050801561161257506040513d6000823e601f3d908101601f1916820160405261160f9190810190613a9a565b60015b156116425780600182516116269190613957565b81518110611636576116366139c7565b60200260200101519150505b601554156117df5760005b6015548110156117dd5760015b84518110156117ca5760158281548110611676576116766139c7565b90600052602060002001600081548110611692576116926139c7565b60009182526020909120015485516001600160a01b03909116908690839081106116be576116be6139c7565b60200260200101516001600160a01b0316036117b85760105484516001600160a01b039091169063d06ca61f908690849081106116fd576116fd6139c7565b602002602001015160158581548110611718576117186139c7565b906000526020600020016040518363ffffffff1660e01b815260040161173f929190613a1b565b600060405180830381865afa92505050801561177d57506040513d6000823e601f3d908101601f1916820160405261177a9190810190613a9a565b60015b156117b85780600182516117919190613957565b815181106117a1576117a16139c7565b6020026020010151846117b491906139af565b9350505b806117c281613ad7565b91505061165a565b50806117d581613ad7565b91505061164d565b505b670de0b6b3a76400008460400151670de0b6b3a7640000866000015184611806919061396e565b611810919061398d565b61181a919061396e565b611824919061398d565b94505050505090565b6000546001600160a01b031633148061185057506003546001600160a01b031633145b61186c5760405162461bcd60e51b8152600401610bca906138c9565b601580546000919061188090600190613957565b81548110611890576118906139c7565b906000526020600020016000815481106118ac576118ac6139c7565b600091825260209091200154600c546001600160a01b0391821692501681148015906118e65750600d546001600160a01b03828116911614155b1561190657601054611906906001600160a01b03838116911660006121f2565b601580548061191757611917613af0565b60019003818190600052602060002001600061193391906133e8565b905550565b6119406124b9565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac8590602001610cab565b6000546001600160a01b03163314806119b157506003546001600160a01b031633145b6119cd5760405162461bcd60e51b8152600401610bca906138c9565b6032811115611a075760405162461bcd60e51b8152600401610bca906020808252600490820152630216361760e41b604082015260600190565b60078190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af90602001610cab565b611a44613406565b6040518060600160405280611a57612897565b815260200160008152602001611a6b611f30565b9052919050565b60128181548110611a8257600080fd5b6000918252602090912001546001600160a01b0316905081565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401611517565b6004546001600160a01b03163314611b155760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610bca565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec541290602001610cab565b611b6b6124b9565b6010548151611bb1916001600160a01b03169060009084908290611b9157611b916139c7565b60200260200101516001600160a01b03166121f29092919063ffffffff16565b6010548151611bd9916001600160a01b031690600019908490600090611b9157611b916139c7565b601580546001810182556000919091528151611c1c917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501906020840190613460565b5050565b611c28612942565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9591906138b0565b90508015610bdc57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611cd9918590600401918252602082015260400190565b600060405180830381600087803b158015611cf357600080fd5b505af1158015611d07573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611d346113ed565b604051908152602001610cab565b6000546001600160a01b0316331480611d6557506003546001600160a01b031633145b61124c5760405162461bcd60e51b8152600401610bca906138c9565b611d896124b9565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa90602001610cab565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611e7157600084815260209081902083018054604080518285028101850190915281815292830182828015611e5d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e3f575b505050505081526020019060010190611dfb565b50505050905090565b60148181548110611a8257600080fd5b60138181548110611a8257600080fd5b600e54600f5460405160016232bd9d60e01b031981526004810191909152306024820152606091829160009182916001600160a01b039091169063ffcd426390604401600060405180830381865afa158015611efa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f229190810190613b6a565b929792965091945050505050565b60008054600160a01b900460ff16611f49575060075490565b50600090565b60606013805480602002602001604051908101604052809291908181526020018280548015610d94576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d76575050505050905090565b611fb76124b9565b6001600160a01b03811661201c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bca565b610bdc8161273d565b6000546001600160a01b031633148061204857506003546001600160a01b031633145b6120645760405162461bcd60e51b8152600401610bca906138c9565b6008805460ff1916911515919091179055565b6001546001600160a01b031633146120a15760405162461bcd60e51b8152600401610bca90613921565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916120d69160040190815260200190565b600060405180830381600087803b1580156120f057600080fd5b505af1158015612104573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217791906138b0565b600b5460015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1c9190613c78565b80158061226c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226a91906138b0565b155b6122d75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610bca565b6040516001600160a01b03831660248201526044810182905261233a90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261298f565b505050565b606061234e8484600085612a61565b90505b9392505050565b612360612942565b600e54600f54604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b1580156123b157600080fd5b505af11580156123c5573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243891906138b0565b90508015611c1c57612448612b92565b61245182612e6d565b61245961301c565b6000612463611a9c565b905061246d611c20565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f924108261249c6113ed565b6040805192835260208301919091520160405180910390a2505050565b6000546001600160a01b031633146111685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bca565b6040516001600160a01b03831660248201526044810182905261233a90849063a9059cbb60e01b90606401612303565b61254b61335f565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600e54600b546125b7916001600160a01b0391821691166000196121f2565b600254600a546125d6916001600160a01b0391821691166000196121f2565b6002546009546125f4916001600160a01b03918216911660006121f2565b600254600954612613916001600160a01b0391821691166000196121f2565b600254600c54612631916001600160a01b03918216911660006121f2565b600254600c54612650916001600160a01b0391821691166000196121f2565b600254600d5461266e916001600160a01b03918216911660006121f2565b600254600d5461268d916001600160a01b0391821691166000196121f2565b601554156111685760005b601554811015610bdc5760105460158054612702926001600160a01b031691600091859081106126ca576126ca6139c7565b906000526020600020016000815481106126e6576126e66139c7565b6000918252602090912001546001600160a01b031691906121f2565b6010546015805461272b926001600160a01b03169160001991859081106126ca576126ca6139c7565b8061273581613ad7565b915050612698565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612795612942565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861257b3390565b600e54600b546127ee916001600160a01b03918216911660006121f2565b600254600a5461280c916001600160a01b03918216911660006121f2565b600254600c5461282a916001600160a01b03918216911660006121f2565b600254600d54612848916001600160a01b03918216911660006121f2565b601554156111685760005b601554811015610bdc5760105460158054612885926001600160a01b031691600091859081106126ca576126ca6139c7565b8061288f81613ad7565b915050612853565b6128d26040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b600654604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa15801561291a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114099190810190613c95565b600054600160a01b900460ff16156111685760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bca565b60006129e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661233f9092919063ffffffff16565b80519091501561233a5780806020019051810190612a029190613c78565b61233a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bca565b606082471015612ac25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bca565b6001600160a01b0385163b612b195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bca565b600080866001600160a01b03168587604051612b359190613d41565b60006040518083038185875af1925050503d8060008114612b72576040519150601f19603f3d011682016040523d82523d6000602084013e612b77565b606091505b5091509150612b878282866133af565b979650505050505050565b478015612c0357600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612be957600080fd5b505af1158015612bfd573d6000803e3d6000fd5b50505050505b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7091906138b0565b6002546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612cab90849060009060129030904290600401613d5d565b6000604051808303816000875af1158015612cca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cf29190810190613a9a565b5060155415611c1c5760005b60155481101561233a57600060158281548110612d1d57612d1d6139c7565b90600052602060002001600081548110612d3957612d396139c7565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dae91906138b0565b90508015612e5a57601054601580546001600160a01b03909216916338ed17399184916000919087908110612de557612de56139c7565b9060005260206000200130426040518663ffffffff1660e01b8152600401612e11959493929190613d5d565b6000604051808303816000875af1158015612e30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e589190810190613a9a565b505b5080612e6581613ad7565b915050612cfe565b6000612e77612897565b80516009546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef491906138b0565b612efe919061396e565b612f08919061398d565b90506000670de0b6b3a7640000836040015183612f25919061396e565b612f2f919061398d565b600954909150612f49906001600160a01b03168583612513565b6000670de0b6b3a7640000846020015184612f64919061396e565b612f6e919061398d565b600554600954919250612f8e916001600160a01b03908116911683612513565b6000670de0b6b3a7640000856060015185612fa9919061396e565b612fb3919061398d565b600454600954919250612fd3916001600160a01b03908116911683612513565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b6009546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561306a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308e91906138b0565b613098919061398d565b600954600c549192506001600160a01b03918216911614613136576002546040516338ed173960e01b81526001600160a01b03909116906338ed1739906130ed90849060009060139030904290600401613d5d565b6000604051808303816000875af115801561310c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131349190810190613a9a565b505b600954600d546001600160a01b039081169116146131d1576002546040516338ed173960e01b81526001600160a01b03909116906338ed17399061318890849060009060149030904290600401613d5d565b6000604051808303816000875af11580156131a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131cf9190810190613a9a565b505b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561321a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323e91906138b0565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561328c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b091906138b0565b600254600c54600d5460405162e8e33760e81b81526001600160a01b0392831660048201529082166024820152604481018690526064810184905260016084820181905260a48201523060c48201524260e4820152929350169063e8e3370090610104016060604051808303816000875af1158015613333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133579190613d99565b505050505050565b600054600160a01b900460ff166111685760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bca565b606083156133be575081612351565b8251156133ce5782518084602001fd5b8160405162461bcd60e51b8152600401610bca9190613dc7565b5080546000825590600052602060002090810190610bdc91906134c5565b604051806060016040528061344c6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b815260200160008152602001600081525090565b8280548282559060005260206000209081019282156134b5579160200282015b828111156134b557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613480565b506134c19291506134c5565b5090565b5b808211156134c157600081556001016134c6565b6001600160a01b0381168114610bdc57600080fd5b60006020828403121561350157600080fd5b8135612351816134da565b8015158114610bdc57600080fd5b60006020828403121561352c57600080fd5b81356123518161350c565b600081518084526020808501945080840160005b838110156135705781516001600160a01b03168752958201959082019060010161354b565b509495945050505050565b6020815260006123516020830184613537565b6000602082840312156135a057600080fd5b5035919050565b600080604083850312156135ba57600080fd5b50508035926020909101359150565b60005b838110156135e45781810151838201526020016135cc565b838111156112ff5750506000910152565b6000815180845261360d8160208601602086016135c9565b601f01601f19169290920160200192915050565b60208152600082516060602084015280516080840152602081015160a0840152604081015160c0840152606081015160e0840152608081015160c06101008501526136706101408501826135f5565b905060a082015115156101208501526020850151604085015260408501516060850152809250505092915050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156136d7576136d761369e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156137065761370661369e565b604052919050565b600067ffffffffffffffff8211156137285761372861369e565b5060051b60200190565b6000602080838503121561374557600080fd5b823567ffffffffffffffff81111561375c57600080fd5b8301601f8101851361376d57600080fd5b803561378061377b8261370e565b6136dd565b81815260059190911b8201830190838101908783111561379f57600080fd5b928401925b82841015612b875783356137b7816134da565b825292840192908401906137a4565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561384b57888603603f19018552825180518088529088019088880190845b818110156138355783516001600160a01b03168352928a0192918a0191600101613810565b50909750505093860193918601916001016137ee565b509398975050505050505050565b60408152600061386c6040830185613537565b82810360208481019190915284518083528582019282019060005b818110156138a357845183529383019391830191600101613887565b5090979650505050505050565b6000602082840312156138c257600080fd5b5051919050565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b6000806000806080858703121561390157600080fd5b505082516020840151604085015160609095015191969095509092509050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561396957613969613941565b500390565b600081600019048311821515161561398857613988613941565b500290565b6000826139aa57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156139c2576139c2613941565b500190565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b838110156135705781546001600160a01b0316875295820195600191820191016139f6565b82815260406020820152600061234e60408301846139dd565b600082601f830112613a4557600080fd5b81516020613a5561377b8361370e565b82815260059290921b84018101918181019086841115613a7457600080fd5b8286015b84811015613a8f5780518352918301918301613a78565b509695505050505050565b600060208284031215613aac57600080fd5b815167ffffffffffffffff811115613ac357600080fd5b613acf84828501613a34565b949350505050565b600060018201613ae957613ae9613941565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600082601f830112613b1757600080fd5b815167ffffffffffffffff811115613b3157613b3161369e565b613b44601f8201601f19166020016136dd565b818152846020838601011115613b5957600080fd5b613acf8260208301602087016135c9565b60008060008060808587031215613b8057600080fd5b845167ffffffffffffffff80821115613b9857600080fd5b818701915087601f830112613bac57600080fd5b81516020613bbc61377b8361370e565b82815260059290921b8401810191818101908b841115613bdb57600080fd5b948201945b83861015613c02578551613bf3816134da565b82529482019490820190613be0565b918a0151919850909350505080821115613c1b57600080fd5b613c2788838901613b06565b94506040870151915080821115613c3d57600080fd5b613c4988838901613a34565b93506060870151915080821115613c5f57600080fd5b50613c6c87828801613a34565b91505092959194509250565b600060208284031215613c8a57600080fd5b81516123518161350c565b600060208284031215613ca757600080fd5b815167ffffffffffffffff80821115613cbf57600080fd5b9083019060c08286031215613cd357600080fd5b613cdb6136b4565b82518152602083015160208201526040830151604082015260608301516060820152608083015182811115613d0f57600080fd5b613d1b87828601613b06565b60808301525060a08301519250613d318361350c565b60a0810192909252509392505050565b60008251613d538184602087016135c9565b9190910192915050565b85815284602082015260a060408201526000613d7c60a08301866139dd565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613dae57600080fd5b8351925060208401519150604084015190509250925092565b60208152600061235160208301846135f556fea264697066735822122033e34266f9b88c0b82bd6fe91ca2d1e211162db7d918606081629915f14ba0b864736f6c634300080f0033

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

00000000000000000000000079f05b32e29139c35cd219aedb5d99cedb1915ac0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000c6ca172fc8bdb803c5e12731109744fb0200587b000000000000000000000000c302df25da018444f8b9261cf7f0f4ea0999e97b00000000000000000000000096b244391d98b62d19ae89b1a4dccf0fc56970c70000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b619000000000000000000000000fb41cbf2ce16e8f626013a2f465521d27ba9a61000000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000cd3b51d98478d53f4515a306be565c6eebef1d58000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb9490000000000000000000000000000000000000000000000000000000000000002000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080

-----Decoded View---------------
Arg [0] : _want (address): 0x79f05B32e29139C35Cd219aEDB5D99cedb1915aC
Arg [1] : _poolId (uint256): 23
Arg [2] : _chef (address): 0xC6ca172FC8BDB803c5e12731109744fb0200587b
Arg [3] : _commonAddresses (tuple):
Arg [1] : vault (address): 0xc302DF25DA018444f8B9261CF7f0f4eA0999e97B
Arg [2] : unirouter (address): 0x96b244391D98B62D19aE89b1A4dCcf0fc56970C7
Arg [3] : keeper (address): 0x4fED5491693007f0CD49f4614FFC38Ab6A04B619
Arg [4] : strategist (address): 0xfB41Cbf2ce16E8f626013a2F465521d27BA9a610
Arg [5] : beefyFeeRecipient (address): 0x00AeC34489A7ADE91A0507B6b9dBb0a50938B7c0
Arg [6] : beefyFeeConfig (address): 0xeEaFF5116C09ECc20Ab72b53860A7ceAd97F0Ab4

Arg [4] : _outputToNativeRoute (address[]): 0xcd3B51D98478D53F4515A306bE565c6EebeF1D58,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [5] : _nativeToLp0Route (address[]): 0xAcc15dC74880C9944775448304B263D191c6077F,0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080,0x191cf2602Ca2e534c5Ccae7BCBF4C46a704bb949
Arg [6] : _nativeToLp1Route (address[]): 0xAcc15dC74880C9944775448304B263D191c6077F,0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000079f05b32e29139c35cd219aedb5d99cedb1915ac
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [2] : 000000000000000000000000c6ca172fc8bdb803c5e12731109744fb0200587b
Arg [3] : 000000000000000000000000c302df25da018444f8b9261cf7f0f4ea0999e97b
Arg [4] : 00000000000000000000000096b244391d98b62d19ae89b1a4dccf0fc56970c7
Arg [5] : 0000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b619
Arg [6] : 000000000000000000000000fb41cbf2ce16e8f626013a2f465521d27ba9a610
Arg [7] : 00000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0
Arg [8] : 000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 000000000000000000000000cd3b51d98478d53f4515a306be565c6eebef1d58
Arg [14] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [16] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [17] : 000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080
Arg [18] : 000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb949
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [20] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [21] : 000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080


Deployed Bytecode Sourcemap

47416:13215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50912:117;;;;;;;;;;-1:-1:-1;50912:117:0;;;;;:::i;:::-;;:::i;:::-;;56980:262;;;;;;;;;;-1:-1:-1;56980:262:0;;;;;:::i;:::-;;:::i;23384:184::-;;;;;;;;;;-1:-1:-1;23384:184:0;;;;;:::i;:::-;;:::i;55300:172::-;;;;;;;;;;;;;:::i;:::-;;;917:25:1;;;905:2;890:18;55300:172:0;;;;;;;;47554:21;;;;;;;;;;-1:-1:-1;47554:21:0;;;;-1:-1:-1;;;;;47554:21:0;;;;;;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;47554:21:0;953:203:1;60129:112:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47610:19::-;;;;;;;;;;-1:-1:-1;47610:19:0;;;;-1:-1:-1;;;;;47610:19:0;;;47728;;;;;;;;;;-1:-1:-1;47728:19:0;;;;-1:-1:-1;;;;;47728:19:0;;;20088:25;;;;;;;;;;-1:-1:-1;20088:25:0;;;;-1:-1:-1;;;;;20088:25:0;;;20029:24;;;;;;;;;;-1:-1:-1;20029:24:0;;;;-1:-1:-1;;;;;20029:24:0;;;49892:720;;;;;;;;;;-1:-1:-1;49892:720:0;;;;;:::i;:::-;;:::i;60363:106::-;;;;;;;;;;;;;:::i;47754:21::-;;;;;;;;;;;;;;;;21905:152;;;;;;;;;;-1:-1:-1;21905:152:0;;;;;:::i;:::-;;:::i;58049:121::-;;;;;;;;;;;;;:::i;50818:86::-;;;;;;;;;;;;;:::i;57824:114::-;;;;;;;;;;;;;:::i;20159:32::-;;;;;;;;;;-1:-1:-1;20159:32:0;;;;-1:-1:-1;;;;;20159:32:0;;;20295:46;;;;;;;;;;;;20336:5;20295:46;;50620:190;;;;;;;;;;;;;:::i;18608:86::-;;;;;;;;;;-1:-1:-1;18655:4:0;18679:7;-1:-1:-1;;;18679:7:0;;;;18608:86;;;2469:14:1;;2462:22;2444:41;;2432:2;2417:18;18608:86:0;2304:187:1;47636:23:0;;;;;;;;;;-1:-1:-1;47636:23:0;;;;-1:-1:-1;;;;;47636:23:0;;;23576:87;;;;;;;;;;-1:-1:-1;23627:7:0;23576:87;;22344:118;;;;;;;;;;-1:-1:-1;22344:118:0;;;;;:::i;:::-;;:::i;8991:77::-;;;;;;;;;;-1:-1:-1;8991:77:0;;;;;;;-1:-1:-1;;;;;8991:77:0;;;48080:38;;;;;;;;;;-1:-1:-1;48080:38:0;;;;;:::i;:::-;;:::i;16110:103::-;;;;;;;;;;;;;:::i;54921:110::-;;;;;;;;;;;;;:::i;22685:126::-;;;;;;;;;;-1:-1:-1;22685:126:0;;;;;:::i;:::-;;:::i;47782:81::-;;;;;;;;;;-1:-1:-1;47782:81:0;;;;-1:-1:-1;;;;;47782:81:0;;;57946:95;;;;;;;;;;;;;:::i;47666:23::-;;;;;;;;;;-1:-1:-1;47666:23:0;;;;-1:-1:-1;;;;;47666:23:0;;;47872:28;;;;;;;;;;-1:-1:-1;47872:28:0;;;;-1:-1:-1;;;47872:28:0;;;;;;21774:123;;;;;;;;;;;;;:::i;15462:87::-;;;;;;;;;;-1:-1:-1;15508:7:0;15535:6;-1:-1:-1;;;;;15535:6:0;15462:87;;20120:32;;;;;;;;;;-1:-1:-1;20120:32:0;;;;-1:-1:-1;;;;;20120:32:0;;;55780:1192;;;;;;;;;;;;;:::i;8946:36::-;;;;;;;;;;-1:-1:-1;8946:36:0;;;;;;;;59815:306;;;;;;;;;;;;;:::i;23137:190::-;;;;;;;;;;-1:-1:-1;23137:190:0;;;;;:::i;:::-;;:::i;22095:::-;;;;;;;;;;-1:-1:-1;22095:190:0;;;;;:::i;:::-;;:::i;20060:21::-;;;;;;;;;;-1:-1:-1;20060:21:0;;;;-1:-1:-1;;;;;20060:21:0;;;21610:156;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47957:36::-;;;;;;;;;;-1:-1:-1;47957:36:0;;;;;:::i;:::-;;:::i;55098:118::-;;;;;;;;;;;;;:::i;22876:197::-;;;;;;;;;;-1:-1:-1;22876:197:0;;;;;:::i;:::-;;:::i;59505:302::-;;;;;;;;;;-1:-1:-1;59505:302:0;;;;;:::i;:::-;;:::i;49634:250::-;;;;;;;;;;;;;:::i;51037:85::-;;;;;;;;;;;;;:::i;22496:142::-;;;;;;;;;;-1:-1:-1;22496:142:0;;;;;:::i;:::-;;:::i;60477:114::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48040:33::-;;;;;;;;;;-1:-1:-1;48040:33:0;;;;;:::i;:::-;;:::i;20241:47::-;;;;;;;;;;;;20286:2;20241:47;;48000:33;;;;;;;;;;-1:-1:-1;48000:33:0;;;;;:::i;:::-;;:::i;55480:292::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;23671:115::-;;;;;;;;;;;;;:::i;60249:106::-;;;;;;;;;;;;;:::i;47907:26::-;;;;;;;;;;;;;;;;47582:21;;;;;;;;;;-1:-1:-1;47582:21:0;;;;-1:-1:-1;;;;;47582:21:0;;;16368:201;;;;;;;;;;-1:-1:-1;16368:201:0;;;;;:::i;:::-;;:::i;57250:133::-;;;;;;;;;;-1:-1:-1;57250:133:0;;;;;:::i;:::-;;:::i;57483:259::-;;;;;;;;;;;;;:::i;20002:20::-;;;;;;;;;;-1:-1:-1;20002:20:0;;;;-1:-1:-1;;;;;20002:20:0;;;50912:117;9115:17;;;;:49;;;;-1:-1:-1;9155:8:0;;;;;-1:-1:-1;;;;;9155:8:0;1800:19;:23;;9136:28;9111:159;;;9214:8;;;;;;;;;-1:-1:-1;;;;;9214:8:0;-1:-1:-1;;;;;9204:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9189:11;:48;;9181:77;;;;-1:-1:-1;;;9181:77:0;;8570:2:1;9181:77:0;;;8552:21:1;8609:2;8589:18;;;8582:30;-1:-1:-1;;;8628:18:1;;;8621:46;8684:18;;9181:77:0;;;;;;;;;50995:26:::1;51004:16;50995:8;:26::i;:::-;50912:117:::0;:::o;56980:262::-;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;57065:16:::1;:36:::0;;-1:-1:-1;;;;57065:36:0::1;-1:-1:-1::0;;;57065:36:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;57118:16:::0;::::1;;57114:121;;;57151:19;57168:1;57151:16;:19::i;57114:121::-;57203:20;57220:2;57203:16;:20::i;23384:184::-:0;15348:13;:11;:13::i;:::-;23466:14:::1;:44:::0;;-1:-1:-1;;;;;;23466:44:0::1;-1:-1:-1::0;;;;;23466:44:0;::::1;::::0;;::::1;::::0;;;23526:34:::1;::::0;1099:51:1;;;23526:34:0::1;::::0;1087:2:1;1072:18;23526:34:0::1;;;;;;;;23384:184:::0;:::o;55300:172::-;55402:4;;55417:6;;55392:47;;-1:-1:-1;;;55392:47:0;;;;;9223:25:1;;;;55433:4:0;9264:18:1;;;9257:60;55346:7:0;;;;-1:-1:-1;;;;;55402:4:0;;;;55392:24;;9196:18:1;;55392:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55366:73:0;;55300:172;-1:-1:-1;;;;55300:172:0:o;60129:112::-;60178:16;60214:19;60207:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60207:26:0;;;;;;;;;;;;;;;;;;;;;;;60129:112;:::o;49892:720::-;49969:5;;-1:-1:-1;;;;;49969:5:0;49955:10;:19;49947:38;;;;-1:-1:-1;;;49947:38:0;;;;;;;:::i;:::-;50023:4;;50016:37;;-1:-1:-1;;;50016:37:0;;50047:4;50016:37;;;1099:51:1;49998:15:0;;-1:-1:-1;;;;;50023:4:0;;50016:22;;1072:18:1;;50016:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49998:55;;50080:7;50070;:17;50066:163;;;50114:4;;50129:6;;-1:-1:-1;;;;;50114:4:0;;;;50104:24;;50137:17;50147:7;50137;:17;:::i;:::-;50104:51;;-1:-1:-1;;;;;;50104:51:0;;;;;;;;;;10471:25:1;;;;10512:18;;;10505:34;10444:18;;50104:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50187:4:0;;50180:37;;-1:-1:-1;;;50180:37:0;;50211:4;50180:37;;;1099:51:1;-1:-1:-1;;;;;50187:4:0;;;;-1:-1:-1;50180:22:0;;-1:-1:-1;1072:18:1;;50180:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50170:47;;50066:163;50255:7;50245;:17;50241:67;;;-1:-1:-1;50289:7:0;50241:67;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;50324:9;:20;;;;:33;;-1:-1:-1;18655:4:0;18679:7;-1:-1:-1;;;18679:7:0;;;;50348:9;50324:33;50320:192;;;50374:27;20336:5;50415:13;;50405:7;:23;;;;:::i;:::-;50404:42;;;;:::i;:::-;50374:72;-1:-1:-1;50471:29:0;50374:72;50471:7;:29;:::i;:::-;50461:39;;50359:153;50320:192;50550:5;;50531:4;;50524:41;;-1:-1:-1;;;;;50531:4:0;;;;50550:5;50557:7;50524:25;:41::i;:::-;50583:21;50592:11;:9;:11::i;:::-;50583:21;;917:25:1;;;905:2;890:18;50583:21:0;;;;;;;49936:676;49892:720;:::o;60363:106::-;60409:16;60445;60438:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60438:23:0;;;;;;;;;;;;;;;;;;;;;;60363:106;:::o;21905:152::-;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;21976:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;21976:36:0;;::::1;::::0;::::1;917:25:1::0;;;-1:-1:-1;;;;;21976:14:0;;::::1;::::0;:28:::1;::::0;890:18:1;;21976:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22028:21;22042:6;22028:21;;;;917:25:1::0;;905:2;890:18;;771:177;58049:121:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;58100:10:::1;:8;:10::i;:::-;58123:17;:15;:17::i;:::-;58153:9;:7;:9::i;:::-;58049:121::o:0;50818:86::-;9115:17;;;;:49;;;;-1:-1:-1;9155:8:0;;;;;-1:-1:-1;;;;;9155:8:0;1800:19;:23;;9136:28;9111:159;;;9214:8;;;;;;;;;-1:-1:-1;;;;;9214:8:0;-1:-1:-1;;;;;9204:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9189:11;:48;;9181:77;;;;-1:-1:-1;;;9181:77:0;;8570:2:1;9181:77:0;;;8552:21:1;8609:2;8589:18;;;8582:30;-1:-1:-1;;;8628:18:1;;;8621:46;8684:18;;9181:77:0;8368:340:1;9181:77:0;50877:19:::1;50886:9;50877:8;:19::i;57824:114::-:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;57871:7:::1;:5;:7::i;:::-;57899:4;::::0;57923:6:::1;::::0;57889:41:::1;::::0;-1:-1:-1;;;57889:41:0;;-1:-1:-1;;;;;57899:4:0;;::::1;::::0;57889:33:::1;::::0;:41:::1;::::0;::::1;;917:25:1::0;;;905:2;890:18;;771:177;57889:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57824:114::o:0;50620:190::-;50686:16;;-1:-1:-1;;;50686:16:0;;;;50682:121;;;50741:5;;-1:-1:-1;;;;;50741:5:0;50727:10;:19;50719:38;;;;-1:-1:-1;;;50719:38:0;;;;;;;:::i;22344:118::-;15348:13;:11;:13::i;:::-;22408:5:::1;:14:::0;;-1:-1:-1;;;;;;22408:14:0::1;-1:-1:-1::0;;;;;22408:14:0;::::1;::::0;;::::1;::::0;;;22438:16:::1;::::0;1099:51:1;;;22438:16:0::1;::::0;1087:2:1;1072:18;22438:16:0::1;953:203:1::0;48080:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48080:38:0;;-1:-1:-1;48080:38:0;;-1:-1:-1;48080:38:0:o;16110:103::-;15348:13;:11;:13::i;:::-;16175:30:::1;16202:1;16175:18;:30::i;54921:110::-:0;54963:7;55008:15;:13;:15::i;:::-;54990;:13;:15::i;:::-;:33;;;;:::i;:::-;54983:40;;54921:110;:::o;22685:126::-;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;22753:6:::1;:16:::0;;-1:-1:-1;;;;;;22753:16:0::1;-1:-1:-1::0;;;;;22753:16:0;::::1;::::0;;::::1;::::0;;;22785:18:::1;::::0;1099:51:1;;;22785:18:0::1;::::0;1087:2:1;1072:18;22785::0::1;953:203:1::0;57946:95:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;57993:8:::1;:6;:8::i;:::-;58014:19;:17;:19::i;21774:123::-:0;21849:14;;:40;;-1:-1:-1;;;21849:40:0;;21883:4;21849:40;;;1099:51:1;21822:7:0;;-1:-1:-1;;;;;21849:14:0;;:25;;1072:18:1;;21849:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55780:1192::-;55823:7;55843:34;55880:9;:7;:9::i;:::-;55843:46;;55901:26;55929;55959:18;:16;:18::i;:::-;55900:77;;;;55988:17;56038:12;;;;;;;;;-1:-1:-1;;;;;56038:12:0;-1:-1:-1;;;;;56020:45:0;;56066:9;56076:1;56066:12;;;;;;;;:::i;:::-;;;;;;;56080:19;56020:80;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56020:80:0;;;;;;;;;;;;:::i;:::-;;;56016:225;;;56189:9;56218:1;56199:9;:16;:20;;;;:::i;:::-;56189:31;;;;;;;;:::i;:::-;;;;;;;56177:43;;56101:131;56016:225;56257:19;:26;:31;56253:632;;56310:6;56305:569;56322:19;:26;56318:30;;56305:569;;;56388:1;56374:485;56395:9;:16;56391:1;:20;56374:485;;;56461:19;56481:1;56461:22;;;;;;;;:::i;:::-;;;;;;;;56484:1;56461:25;;;;;;;;:::i;:::-;;;;;;;;;;;56445:12;;-1:-1:-1;;;;;56461:25:0;;;;56445:9;;56455:1;;56445:12;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;56445:41:0;;56441:399;;56566:12;;56594;;-1:-1:-1;;;;;56566:12:0;;;;56548:45;;56594:9;;56604:1;;56594:12;;;;;;:::i;:::-;;;;;;;56608:19;56628:1;56608:22;;;;;;;;:::i;:::-;;;;;;;;56548:83;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56548:83:0;;;;;;;;;;;;:::i;:::-;;;56515:302;;;56749:9;56778:1;56759:9;:16;:20;;;;:::i;:::-;56749:31;;;;;;;;:::i;:::-;;;;;;;56737:9;:43;;;;:::i;:::-;56725:55;;56657:151;56515:302;56413:3;;;;:::i;:::-;;;;56374:485;;;-1:-1:-1;56350:3:0;;;;:::i;:::-;;;;56305:569;;;;56253:632;20227:7;56944:4;:9;;;20227:7;56919:4;:10;;;56907:9;:22;;;;:::i;:::-;56906:34;;;;:::i;:::-;56905:48;;;;:::i;:::-;56904:60;;;;:::i;:::-;56897:67;;;;;;55780:1192;:::o;59815:306::-;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;59897:19:::1;59917:26:::0;;59880:14:::1;::::0;59897:19;59917:30:::1;::::0;59946:1:::1;::::0;59917:30:::1;:::i;:::-;59897:51;;;;;;;;:::i;:::-;;;;;;;;59949:1;59897:54;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;59976:8:::1;::::0;-1:-1:-1;;;;;59897:54:0;;::::1;::::0;-1:-1:-1;59976:8:0::1;59966:18:::0;::::1;::::0;::::1;::::0;:40:::1;;-1:-1:-1::0;59998:8:0::1;::::0;-1:-1:-1;;;;;59988:18:0;;::::1;59998:8:::0;::::1;59988:18;;59966:40;59962:116;;;60050:12;::::0;60023:43:::1;::::0;-1:-1:-1;;;;;60023:26:0;;::::1;::::0;60050:12:::1;;60023:26;:43::i;:::-;60088:19;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;59869:252;59815:306::o:0;23137:190::-;15348:13;:11;:13::i;:::-;23225:17:::1;:38:::0;;-1:-1:-1;;;;;;23225:38:0::1;-1:-1:-1::0;;;;;23225:38:0;::::1;::::0;;::::1;::::0;;;23279:40:::1;::::0;1099:51:1;;;23279:40:0::1;::::0;1087:2:1;1072:18;23279:40:0::1;953:203:1::0;22095:190:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;20286:2:::1;22173:4;:26;;22165:43;;;;-1:-1:-1::0;;;22165:43:0::1;;;;;;13558:2:1::0;13540:21;;;13597:1;13577:18;;;13570:29;-1:-1:-1;;;13630:2:1;13615:18;;13608:34;13674:2;13659:18;;13356:327;22165:43:0::1;22219:13;:20:::0;;;22255:22:::1;::::0;917:25:1;;;22255:22:0::1;::::0;905:2:1;890:18;22255:22:0::1;771:177:1::0;21610:156:0;21655:25;;:::i;:::-;21700:58;;;;;;;;21719:9;:7;:9::i;:::-;21700:58;;;;23627:7;21700:58;;;;21744:13;:11;:13::i;:::-;21700:58;;21693:65;21610:156;-1:-1:-1;21610:156:0:o;47957:36::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47957:36:0;;-1:-1:-1;47957:36:0;:::o;55098:118::-;55178:4;;55171:37;;-1:-1:-1;;;55171:37:0;;55202:4;55171:37;;;1099:51:1;55144:7:0;;-1:-1:-1;;;;;55178:4:0;;55171:22;;1072:18:1;;55171:37:0;953:203:1;22876:197:0;22962:10;;-1:-1:-1;;;;;22962:10:0;22948;:24;22940:48;;;;-1:-1:-1;;;22940:48:0;;13890:2:1;22940:48:0;;;13872:21:1;13929:2;13909:18;;;13902:30;-1:-1:-1;;;13948:18:1;;;13941:41;13999:18;;22940:48:0;13688:335:1;22940:48:0;22999:10;:24;;-1:-1:-1;;;;;;22999:24:0;-1:-1:-1;;;;;22999:24:0;;;;;;;;23039:26;;1099:51:1;;;23039:26:0;;1087:2:1;1072:18;23039:26:0;953:203:1;59505:302:0;15348:13;:11;:13::i;:::-;59642:12:::1;::::0;59605:23;;59598:60:::1;::::0;-1:-1:-1;;;;;59642:12:0::1;::::0;::::1;::::0;59605:20;;59642:12;;59605:23:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;59598:43:0::1;;;:60;;;;;:::i;:::-;59713:12;::::0;59676:23;;59669:73:::1;::::0;-1:-1:-1;;;;;59713:12:0::1;::::0;-1:-1:-1;;59727:14:0;59676:20;;59713:12:::1;::::0;59676:23:::1;;;;:::i;59669:73::-;59753:19;:46:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;59753:46:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;59505:302:::0;:::o;49634:250::-;18213:19;:17;:19::i;:::-;49710:4:::1;::::0;49703:37:::1;::::0;-1:-1:-1;;;49703:37:0;;49734:4:::1;49703:37;::::0;::::1;1099:51:1::0;49685:15:0::1;::::0;-1:-1:-1;;;;;49710:4:0::1;::::0;49703:22:::1;::::0;1072:18:1;;49703:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49685:55:::0;-1:-1:-1;49757:11:0;;49753:124:::1;;49795:4;::::0;49809:6:::1;::::0;49785:40:::1;::::0;-1:-1:-1;;;49785:40:0;;-1:-1:-1;;;;;49795:4:0;;::::1;::::0;49785:23:::1;::::0;:40:::1;::::0;49817:7;;49785:40:::1;;10471:25:1::0;;;10527:2;10512:18;;10505:34;10459:2;10444:18;;10297:248;49785:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49845:20;49853:11;:9;:11::i;:::-;49845:20;::::0;917:25:1;;;905:2;890:18;49845:20:0::1;771:177:1::0;51037:85:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;22496:142::-;15348:13;:11;:13::i;:::-;22568:9:::1;:22:::0;;-1:-1:-1;;;;;;22568:22:0::1;-1:-1:-1::0;;;;;22568:22:0;::::1;::::0;;::::1;::::0;;;22606:24:::1;::::0;1099:51:1;;;22606:24:0::1;::::0;1087:2:1;1072:18;22606:24:0::1;953:203:1::0;60477:114:0;60526:18;60564:19;60557:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60557:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60477:114;:::o;48040:33::-;;;;;;;;;;;;48000;;;;;;;;;;;;55480:292;55647:4;;55681:6;;55637:89;;-1:-1:-1;;;;;;55637:89:0;;;;;9223:25:1;;;;55710:4:0;9264:18:1;;;9257:60;55529:16:0;;;;55577:26;;;;-1:-1:-1;;;;;55647:4:0;;;;55637:29;;9196:18:1;;55637:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55637:89:0;;;;;;;;;;;;:::i;:::-;55576:150;;;;-1:-1:-1;55480:292:0;;-1:-1:-1;;;;;55480:292:0:o;23671:115::-;23723:7;18679;;-1:-1:-1;;;18679:7:0;;;;23750:28;;-1:-1:-1;23765:13:0;;;54921:110::o;23750:28::-;-1:-1:-1;23761:1:0;;23671:115::o;60249:106::-;60295:16;60331;60324:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60324:23:0;;;;;;;;;;;;;;;;;;;;;;60249:106;:::o;16368:201::-;15348:13;:11;:13::i;:::-;-1:-1:-1;;;;;16457:22:0;::::1;16449:73;;;::::0;-1:-1:-1;;;16449:73:0;;16381:2:1;16449:73:0::1;::::0;::::1;16363:21:1::0;16420:2;16400:18;;;16393:30;16459:34;16439:18;;;16432:62;-1:-1:-1;;;16510:18:1;;;16503:36;16556:19;;16449:73:0::1;16179:402:1::0;16449:73:0::1;16533:28;16552:8;16533:18;:28::i;57250:133::-:0;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;21266:10;:21;;:45;;-1:-1:-1;21305:6:0;;-1:-1:-1;;;;;21305:6:0;21291:10;:20;21266:45;21258:66;;;;-1:-1:-1;;;21258:66:0;;;;;;;:::i;:::-;57337:17:::1;:38:::0;;-1:-1:-1;;57337:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57250:133::o;57483:259::-;57548:5;;-1:-1:-1;;;;;57548:5:0;57534:10;:19;57526:38;;;;-1:-1:-1;;;57526:38:0;;;;;;;:::i;:::-;57587:4;;57611:6;;57577:41;;-1:-1:-1;;;57577:41:0;;-1:-1:-1;;;;;57587:4:0;;;;57577:33;;:41;;;;917:25:1;;;905:2;890:18;;771:177;57577:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57656:4:0;;57649:37;;-1:-1:-1;;;57649:37:0;;57680:4;57649:37;;;1099:51:1;57631:15:0;;-1:-1:-1;;;;;;57656:4:0;;;;-1:-1:-1;57649:22:0;;1072:18:1;;57649:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57704:4;;;57719:5;57697:37;;-1:-1:-1;;;57697:37:0;;-1:-1:-1;;;;;57719:5:0;;;57697:37;;;16760:51:1;16827:18;;;16820:34;;;57631:55:0;;-1:-1:-1;57704:4:0;;57697:21;;16733:18:1;;57697:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44250:616::-;44614:10;;;44613:62;;-1:-1:-1;44630:39:0;;-1:-1:-1;;;44630:39:0;;44654:4;44630:39;;;17327:34:1;-1:-1:-1;;;;;17397:15:1;;;17377:18;;;17370:43;44630:15:0;;;;;17262:18:1;;44630:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;44613:62;44591:166;;;;-1:-1:-1;;;44591:166:0;;17626:2:1;44591:166:0;;;17608:21:1;17665:2;17645:18;;;17638:30;17704:34;17684:18;;;17677:62;-1:-1:-1;;;17755:18:1;;;17748:52;17817:19;;44591:166:0;17424:418:1;44591:166:0;44795:62;;-1:-1:-1;;;;;16778:32:1;;44795:62:0;;;16760:51:1;16827:18;;;16820:34;;;44768:90:0;;44788:5;;-1:-1:-1;;;44818:22:0;16733:18:1;;44795:62:0;;;;-1:-1:-1;;44795:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;44795:62:0;-1:-1:-1;;;;;;44795:62:0;;;;;;;;;;44768:19;:90::i;:::-;44250:616;;;:::o;4250:229::-;4387:12;4419:52;4441:6;4449:4;4455:1;4458:12;4419:21;:52::i;:::-;4412:59;;4250:229;;;;;;:::o;51185:531::-;18213:19;:17;:19::i;:::-;51273:4:::1;::::0;51287:6:::1;::::0;51263:34:::1;::::0;-1:-1:-1;;;51263:34:0;;::::1;::::0;::::1;10471:25:1::0;;;;51273:4:0::1;10512:18:1::0;;;10505:34;-1:-1:-1;;;;;51273:4:0;;::::1;::::0;51263:23:::1;::::0;10444:18:1;;51263:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51335:6:0::1;::::0;51328:39:::1;::::0;-1:-1:-1;;;51328:39:0;;51361:4:::1;51328:39;::::0;::::1;1099:51:1::0;51308:17:0::1;::::0;-1:-1:-1;;;;;;51335:6:0;;::::1;::::0;-1:-1:-1;51328:24:0::1;::::0;1072:18:1;;51328:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51308:59:::0;-1:-1:-1;51382:13:0;;51378:331:::1;;51412:17;:15;:17::i;:::-;51444:28;51455:16;51444:10;:28::i;:::-;51487:14;:12;:14::i;:::-;51516:21;51540:15;:13;:15::i;:::-;51516:39;;51570:9;:7;:9::i;:::-;51610:15;51596:11;:29:::0;51658:10:::1;51645:52;51670:13:::0;51685:11:::1;:9;:11::i;:::-;51645:52;::::0;;10471:25:1;;;10527:2;10512:18;;10505:34;;;;10444:18;51645:52:0::1;;;;;;;51397:312;51252:464;51185:531:::0;:::o;15627:132::-;15508:7;15535:6;-1:-1:-1;;;;;15535:6:0;14085:10;15691:23;15683:68;;;;-1:-1:-1;;;15683:68:0;;18310:2:1;15683:68:0;;;18292:21:1;;;18329:18;;;18322:30;18388:34;18368:18;;;18361:62;18440:18;;15683:68:0;18108:356:1;43514:211:0;43658:58;;-1:-1:-1;;;;;16778:32:1;;43658:58:0;;;16760:51:1;16827:18;;;16820:34;;;43631:86:0;;43651:5;;-1:-1:-1;;;43681:23:0;16733:18:1;;43658:58:0;16586:274:1;19463:120:0;18472:16;:14;:16::i;:::-;19532:5:::1;19522:15:::0;;-1:-1:-1;;;;19522:15:0::1;::::0;;19553:22:::1;14085:10:::0;19562:12:::1;19553:22;::::0;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;19553:22:0::1;;;;;;;19463:120::o:0;58178:840::-;58250:4;;58232;;58225:46;;-1:-1:-1;;;;;58232:4:0;;;;58250;-1:-1:-1;;58225:24:0;:46::i;:::-;58309:9;;58289:6;;58282:53;;-1:-1:-1;;;;;58289:6:0;;;;58309:9;-1:-1:-1;;58282:26:0;:53::i;:::-;58375:9;;58355:6;;58348:40;;-1:-1:-1;;;;;58355:6:0;;;;58375:9;;58348:26;:40::i;:::-;58426:9;;58406:6;;58399:53;;-1:-1:-1;;;;;58406:6:0;;;;58426:9;-1:-1:-1;;58399:26:0;:53::i;:::-;58494:9;;58472:8;;58465:42;;-1:-1:-1;;;;;58472:8:0;;;;58494:9;;58465:28;:42::i;:::-;58547:9;;58525:8;;58518:55;;-1:-1:-1;;;;;58525:8:0;;;;58547:9;-1:-1:-1;;58518:28:0;:55::i;:::-;58615:9;;58593:8;;58586:42;;-1:-1:-1;;;;;58593:8:0;;;;58615:9;;58586:28;:42::i;:::-;58668:9;;58646:8;;58639:55;;-1:-1:-1;;;;;58646:8:0;;;;58668:9;-1:-1:-1;;58639:28:0;:55::i;:::-;58711:19;:26;:31;58707:304;;58764:6;58759:241;58776:19;:26;58772:30;;58759:241;;;58874:12;;58835:19;:22;;58828:62;;-1:-1:-1;;;;;58874:12:0;;;;58855:1;;58835:22;;;;;;:::i;:::-;;;;;;;;58858:1;58835:25;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;58835:25:0;;58828:62;:45;:62::i;:::-;58955:12;;58916:19;:22;;58909:75;;-1:-1:-1;;;;;58955:12:0;;-1:-1:-1;;58969:14:0;58936:1;;58916:22;;;;;;:::i;58909:75::-;58804:3;;;;:::i;:::-;;;;58759:241;;16729:191;16803:16;16822:6;;-1:-1:-1;;;;;16839:17:0;;;-1:-1:-1;;;;;;16839:17:0;;;;;;16872:40;;16822:6;;;;;;;16872:40;;16803:16;16872:40;16792:128;16729:191;:::o;19204:118::-;18213:19;:17;:19::i;:::-;19264:7:::1;:14:::0;;-1:-1:-1;;;;19264:14:0::1;-1:-1:-1::0;;;19264:14:0::1;::::0;;19294:20:::1;19301:12;14085:10:::0;;14005:98;59026:471;59100:4;;59082;;59075:33;;-1:-1:-1;;;;;59082:4:0;;;;59100;;59075:24;:33::i;:::-;59146:9;;59126:6;;59119:40;;-1:-1:-1;;;;;59126:6:0;;;;59146:9;;59119:26;:40::i;:::-;59201:9;;59179:8;;59172:42;;-1:-1:-1;;;;;59179:8:0;;;;59201:9;;59172:28;:42::i;:::-;59254:9;;59232:8;;59225:42;;-1:-1:-1;;;;;59232:8:0;;;;59254:9;;59225:28;:42::i;:::-;59284:19;:26;:31;59280:210;;59337:6;59332:147;59349:19;:26;59345:30;;59332:147;;;59447:12;;59408:19;:22;;59401:62;;-1:-1:-1;;;;;59447:12:0;;;;59428:1;;59408:22;;;;;;:::i;59401:62::-;59377:3;;;;:::i;:::-;;;;59332:147;;21392:136;21434:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21434:29:0;21483:14;;:37;;-1:-1:-1;;;21483:37:0;;21514:4;21483:37;;;1099:51:1;-1:-1:-1;;;;;21483:14:0;;;;:22;;1072:18:1;;21483:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21483:37:0;;;;;;;;;;;;:::i;18767:108::-;18655:4;18679:7;-1:-1:-1;;;18679:7:0;;;;18837:9;18829:38;;;;-1:-1:-1;;;18829:38:0;;19625:2:1;18829:38:0;;;19607:21:1;19664:2;19644:18;;;19637:30;-1:-1:-1;;;19683:18:1;;;19676:46;19739:18;;18829:38:0;19423:340:1;46581:716:0;47005:23;47031:69;47059:4;47031:69;;;;;;;;;;;;;;;;;47039:5;-1:-1:-1;;;;;47031:27:0;;;:69;;;;;:::i;:::-;47115:17;;47005:95;;-1:-1:-1;47115:21:0;47111:179;;47212:10;47201:30;;;;;;;;;;;;:::i;:::-;47193:85;;;;-1:-1:-1;;;47193:85:0;;19970:2:1;47193:85:0;;;19952:21:1;20009:2;19989:18;;;19982:30;20048:34;20028:18;;;20021:62;-1:-1:-1;;;20099:18:1;;;20092:40;20149:19;;47193:85:0;19768:406:1;5370:510:0;5540:12;5598:5;5573:21;:30;;5565:81;;;;-1:-1:-1;;;5565:81:0;;20381:2:1;5565:81:0;;;20363:21:1;20420:2;20400:18;;;20393:30;20459:34;20439:18;;;20432:62;-1:-1:-1;;;20510:18:1;;;20503:36;20556:19;;5565:81:0;20179:402:1;5565:81:0;-1:-1:-1;;;;;1800:19:0;;;5657:60;;;;-1:-1:-1;;;5657:60:0;;20788:2:1;5657:60:0;;;20770:21:1;20827:2;20807:18;;;20800:30;20866:31;20846:18;;;20839:59;20915:18;;5657:60:0;20586:353:1;5657:60:0;5731:12;5745:23;5772:6;-1:-1:-1;;;;;5772:11:0;5791:5;5798:4;5772:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5730:73;;;;5821:51;5838:7;5847:10;5859:12;5821:16;:51::i;:::-;5814:58;5370:510;-1:-1:-1;;;;;;;5370:510:0:o;51759:1178::-;51856:21;51892:13;;51888:96;;51937:6;;;;;;;;;-1:-1:-1;;;;;51937:6:0;-1:-1:-1;;;;;51922:30:0;;51960:9;51922:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51888:96;52062:6;;52055:39;;-1:-1:-1;;;52055:39:0;;52088:4;52055:39;;;1099:51:1;52035:17:0;;-1:-1:-1;;;;;52062:6:0;;52055:24;;1072:18:1;;52055:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52123:9;;52105:196;;-1:-1:-1;;;52105:196:0;;52035:59;;-1:-1:-1;;;;;;52123:9:0;;52105:53;;:196;;52035:59;;52123:9;;52213:19;;52255:4;;52275:15;;52105:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52105:196:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52357:19:0;:26;:31;52353:577;;52410:6;52405:514;52422:19;:26;52418:30;;52405:514;;;52474:16;52500:19;52520:1;52500:22;;;;;;;;:::i;:::-;;;;;;;;52523:1;52500:25;;;;;;;;:::i;:::-;;;;;;;;;;;52493:58;;-1:-1:-1;;;52493:58:0;;52545:4;52493:58;;;1099:51:1;-1:-1:-1;;;;;52500:25:0;;;;52493:43;;1072:18:1;;52493:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52474:77;-1:-1:-1;52574:12:0;;52570:334;;52629:12;;52757:19;:22;;-1:-1:-1;;;;;52629:12:0;;;;52611:56;;52694:8;;52629:12;;52757:19;52777:1;;52757:22;;;;;;:::i;:::-;;;;;;;;52814:4;52846:15;52611:273;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52611:273:0;;;;;;;;;;;;:::i;:::-;;52570:334;-1:-1:-1;52450:3:0;;;;:::i;:::-;;;;52405:514;;52970:755;53036:34;53073:9;:7;:9::i;:::-;53161:10;;53126:6;;53119:39;;-1:-1:-1;;;53119:39:0;;53152:4;53119:39;;;1099:51:1;53161:10:0;;-1:-1:-1;53093:22:0;;20227:7;;53161:10;-1:-1:-1;;;;;53126:6:0;;53119:24;;1072:18:1;;53119:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;53118:64;;;;:::i;:::-;53093:89;;53195:21;20227:7;53237:4;:9;;;53220:14;:26;;;;:::i;:::-;53219:38;;;;:::i;:::-;53275:6;;53195:62;;-1:-1:-1;53268:60:0;;-1:-1:-1;;;;;53275:6:0;53296:16;53195:62;53268:27;:60::i;:::-;53341:22;20227:7;53384:4;:10;;;53367:14;:27;;;;:::i;:::-;53366:39;;;;:::i;:::-;53444:17;;53423:6;;53341:64;;-1:-1:-1;53416:62:0;;-1:-1:-1;;;;;53423:6:0;;;;53444:17;53341:64;53416:27;:62::i;:::-;53491:27;20227:7;53539:4;:15;;;53522:14;:32;;;;:::i;:::-;53521:44;;;;:::i;:::-;53604:10;;53583:6;;53491:74;;-1:-1:-1;53576:60:0;;-1:-1:-1;;;;;53583:6:0;;;;53604:10;53491:74;53576:27;:60::i;:::-;53654:63;;;22017:25:1;;;22073:2;22058:18;;22051:34;;;22101:18;;;22094:34;;;53654:63:0;;22005:2:1;21990:18;53654:63:0;;;;;;;53025:700;;;;;52970:755;:::o;53788:1059::-;53860:6;;53853:39;;-1:-1:-1;;;53853:39:0;;53886:4;53853:39;;;1099:51:1;53832:18:0;;53895:1;;-1:-1:-1;;;;;53860:6:0;;;;53853:24;;1072:18:1;;53853:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;53925:6;;53913:8;;53832:64;;-1:-1:-1;;;;;;53913:8:0;;;53925:6;;53913:18;53909:269;;53966:9;;53948:218;;-1:-1:-1;;;53948:218:0;;-1:-1:-1;;;;;53966:9:0;;;;53948:53;;:218;;54020:10;;53966:9;;54069:16;;54112:4;;54136:15;;53948:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53948:218:0;;;;;;;;;;;;:::i;:::-;;53909:269;54206:6;;54194:8;;-1:-1:-1;;;;;54194:8:0;;;54206:6;;54194:18;54190:269;;54247:9;;54229:218;;-1:-1:-1;;;54229:218:0;;-1:-1:-1;;;;;54247:9:0;;;;54229:53;;:218;;54301:10;;54247:9;;54350:16;;54393:4;;54417:15;;54229:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54229:218:0;;;;;;;;;;;;:::i;:::-;;54190:269;54495:8;;54488:41;;-1:-1:-1;;;54488:41:0;;54523:4;54488:41;;;1099:51:1;54471:14:0;;-1:-1:-1;;;;;54495:8:0;;54488:26;;1072:18:1;;54488:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54564:8;;54557:41;;-1:-1:-1;;;54557:41:0;;54592:4;54557:41;;;1099:51:1;54471:58:0;;-1:-1:-1;54540:14:0;;-1:-1:-1;;;;;54564:8:0;;;;54557:26;;1072:18:1;;54557:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54627:9;;54665:8;;54688;;54609:230;;-1:-1:-1;;;54609:230:0;;-1:-1:-1;;;;;54665:8:0;;;54609:230;;;22536:34:1;54688:8:0;;;22586:18:1;;;22579:43;22638:18;;;22631:34;;;22681:18;;;22674:34;;;54627:9:0;22724:19:1;;;22717:35;;;22768:19;;;22761:35;54793:4:0;22812:19:1;;;22805:44;54813:15:0;22865:19:1;;;22858:35;54540:58:0;;-1:-1:-1;54627:9:0;;54609:41;;22470:19:1;;54609:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;53821:1026;;;53788:1059::o;18952:108::-;18655:4;18679:7;-1:-1:-1;;;18679:7:0;;;;19011:41;;;;-1:-1:-1;;;19011:41:0;;23417:2:1;19011:41:0;;;23399:21:1;23456:2;23436:18;;;23429:30;-1:-1:-1;;;23475:18:1;;;23468:50;23535:18;;19011:41:0;23215:344:1;8056:762:0;8206:12;8235:7;8231:580;;;-1:-1:-1;8266:10:0;8259:17;;8231:580;8380:17;;:21;8376:424;;8628:10;8622:17;8689:15;8676:10;8672:2;8668:19;8661:44;8376:424;8771:12;8764:20;;-1:-1:-1;;;8764:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:118::-;488:5;481:13;474:21;467:5;464:32;454:60;;510:1;507;500:12;525:241;581:6;634:2;622:9;613:7;609:23;605:32;602:52;;;650:1;647;640:12;602:52;689:9;676:23;708:28;730:5;708:28;:::i;1161:461::-;1214:3;1252:5;1246:12;1279:6;1274:3;1267:19;1305:4;1334:2;1329:3;1325:12;1318:19;;1371:2;1364:5;1360:14;1392:1;1402:195;1416:6;1413:1;1410:13;1402:195;;;1481:13;;-1:-1:-1;;;;;1477:39:1;1465:52;;1537:12;;;;1572:15;;;;1513:1;1431:9;1402:195;;;-1:-1:-1;1613:3:1;;1161:461;-1:-1:-1;;;;;1161:461:1:o;1627:261::-;1806:2;1795:9;1788:21;1769:4;1826:56;1878:2;1867:9;1863:18;1855:6;1826:56;:::i;1893:180::-;1952:6;2005:2;1993:9;1984:7;1980:23;1976:32;1973:52;;;2021:1;2018;2011:12;1973:52;-1:-1:-1;2044:23:1;;1893:180;-1:-1:-1;1893:180:1:o;2496:248::-;2564:6;2572;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;-1:-1:-1;;2664:23:1;;;2734:2;2719:18;;;2706:32;;-1:-1:-1;2496:248:1:o;2749:258::-;2821:1;2831:113;2845:6;2842:1;2839:13;2831:113;;;2921:11;;;2915:18;2902:11;;;2895:39;2867:2;2860:10;2831:113;;;2962:6;2959:1;2956:13;2953:48;;;-1:-1:-1;;2997:1:1;2979:16;;2972:27;2749:258::o;3012:::-;3054:3;3092:5;3086:12;3119:6;3114:3;3107:19;3135:63;3191:6;3184:4;3179:3;3175:14;3168:4;3161:5;3157:16;3135:63;:::i;:::-;3252:2;3231:15;-1:-1:-1;;3227:29:1;3218:39;;;;3259:4;3214:50;;3012:258;-1:-1:-1;;3012:258:1:o;3275:938::-;3452:2;3441:9;3434:21;3415:4;3490:6;3484:13;3533:4;3528:2;3517:9;3513:18;3506:32;3581:12;3575:19;3569:3;3558:9;3554:19;3547:48;3656:2;3642:12;3638:21;3632:28;3626:3;3615:9;3611:19;3604:57;3723:4;3709:12;3705:23;3699:30;3692:4;3681:9;3677:20;3670:60;3791:4;3777:12;3773:23;3767:30;3761:3;3750:9;3746:19;3739:59;3853:3;3839:12;3835:22;3829:29;3895:4;3889:3;3878:9;3874:19;3867:33;3923:54;3972:3;3961:9;3957:19;3941:14;3923:54;:::i;:::-;3909:68;;4052:3;4038:12;4034:22;4028:29;4021:37;4014:45;4008:3;3997:9;3993:19;3986:74;4116:2;4108:6;4104:15;4098:22;4091:4;4080:9;4076:20;4069:52;4177:4;4169:6;4165:17;4159:24;4152:4;4141:9;4137:20;4130:54;4201:6;4193:14;;;;3275:938;;;;:::o;4218:127::-;4279:10;4274:3;4270:20;4267:1;4260:31;4310:4;4307:1;4300:15;4334:4;4331:1;4324:15;4350:253;4422:2;4416:9;4464:4;4452:17;;4499:18;4484:34;;4520:22;;;4481:62;4478:88;;;4546:18;;:::i;:::-;4582:2;4575:22;4350:253;:::o;4608:275::-;4679:2;4673:9;4744:2;4725:13;;-1:-1:-1;;4721:27:1;4709:40;;4779:18;4764:34;;4800:22;;;4761:62;4758:88;;;4826:18;;:::i;:::-;4862:2;4855:22;4608:275;;-1:-1:-1;4608:275:1:o;4888:183::-;4948:4;4981:18;4973:6;4970:30;4967:56;;;5003:18;;:::i;:::-;-1:-1:-1;5048:1:1;5044:14;5060:4;5040:25;;4888:183::o;5076:966::-;5160:6;5191:2;5234;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;5290:9;5277:23;5323:18;5315:6;5312:30;5309:50;;;5355:1;5352;5345:12;5309:50;5378:22;;5431:4;5423:13;;5419:27;-1:-1:-1;5409:55:1;;5460:1;5457;5450:12;5409:55;5496:2;5483:16;5519:60;5535:43;5575:2;5535:43;:::i;:::-;5519:60;:::i;:::-;5613:15;;;5695:1;5691:10;;;;5683:19;;5679:28;;;5644:12;;;;5719:19;;;5716:39;;;5751:1;5748;5741:12;5716:39;5775:11;;;;5795:217;5811:6;5806:3;5803:15;5795:217;;;5891:3;5878:17;5908:31;5933:5;5908:31;:::i;:::-;5952:18;;5828:12;;;;5990;;;;5795:217;;6047:1318;6239:4;6268:2;6308;6297:9;6293:18;6338:2;6327:9;6320:21;6361:6;6396;6390:13;6427:6;6419;6412:22;6465:2;6454:9;6450:18;6443:25;;6527:2;6517:6;6514:1;6510:14;6499:9;6495:30;6491:39;6477:53;;6565:2;6557:6;6553:15;6586:1;6607;6617:719;6633:6;6628:3;6625:15;6617:719;;;6702:22;;;-1:-1:-1;;6698:36:1;6686:49;;6758:13;;6832:9;;6854:24;;;6944:11;;;;6900:15;;;;6979:1;6993:235;7009:8;7004:3;7001:17;6993:235;;;7090:15;;-1:-1:-1;;;;;7086:41:1;7072:56;;7197:17;;;;7154:14;;;;7124:1;7028:11;6993:235;;;-1:-1:-1;7251:5:1;;-1:-1:-1;;;7314:12:1;;;;7279:15;;;;6659:1;6650:11;6617:719;;;-1:-1:-1;7353:6:1;;6047:1318;-1:-1:-1;;;;;;;;6047:1318:1:o;7370:804::-;7627:2;7616:9;7609:21;7590:4;7653:56;7705:2;7694:9;7690:18;7682:6;7653:56;:::i;:::-;7766:22;;;7728:2;7746:18;;;7739:50;;;;7838:13;;7860:22;;;7936:15;;;;7898;;;7969:1;7979:169;7993:6;7990:1;7987:13;7979:169;;;8054:13;;8042:26;;8123:15;;;;8088:12;;;;8015:1;8008:9;7979:169;;;-1:-1:-1;8165:3:1;;7370:804;-1:-1:-1;;;;;;;7370:804:1:o;8179:184::-;8249:6;8302:2;8290:9;8281:7;8277:23;8273:32;8270:52;;;8318:1;8315;8308:12;8270:52;-1:-1:-1;8341:16:1;;8179:184;-1:-1:-1;8179:184:1:o;8713:331::-;8915:2;8897:21;;;8954:1;8934:18;;;8927:29;-1:-1:-1;;;8987:2:1;8972:18;;8965:38;9035:2;9020:18;;8713:331::o;9328:368::-;9425:6;9433;9441;9449;9502:3;9490:9;9481:7;9477:23;9473:33;9470:53;;;9519:1;9516;9509:12;9470:53;-1:-1:-1;;9542:16:1;;9598:2;9583:18;;9577:25;9642:2;9627:18;;9621:25;9686:2;9671:18;;;9665:25;9542:16;;9577:25;;-1:-1:-1;9665:25:1;;-1:-1:-1;9328:368:1;-1:-1:-1;9328:368:1:o;9701:329::-;9903:2;9885:21;;;9942:1;9922:18;;;9915:29;-1:-1:-1;;;9975:2:1;9960:18;;9953:36;10021:2;10006:18;;9701:329::o;10035:127::-;10096:10;10091:3;10087:20;10084:1;10077:31;10127:4;10124:1;10117:15;10151:4;10148:1;10141:15;10167:125;10207:4;10235:1;10232;10229:8;10226:34;;;10240:18;;:::i;:::-;-1:-1:-1;10277:9:1;;10167:125::o;10550:168::-;10590:7;10656:1;10652;10648:6;10644:14;10641:1;10638:21;10633:1;10626:9;10619:17;10615:45;10612:71;;;10663:18;;:::i;:::-;-1:-1:-1;10703:9:1;;10550:168::o;10723:217::-;10763:1;10789;10779:132;;10833:10;10828:3;10824:20;10821:1;10814:31;10868:4;10865:1;10858:15;10896:4;10893:1;10886:15;10779:132;-1:-1:-1;10925:9:1;;10723:217::o;10945:128::-;10985:3;11016:1;11012:6;11009:1;11006:13;11003:39;;;11022:18;;:::i;:::-;-1:-1:-1;11058:9:1;;10945:128::o;11078:127::-;11139:10;11134:3;11130:20;11127:1;11120:31;11170:4;11167:1;11160:15;11194:4;11191:1;11184:15;11210:495;11271:3;11309:5;11303:12;11336:6;11331:3;11324:19;11362:4;11391:2;11386:3;11382:12;11375:19;;11413:5;11410:1;11403:16;11455:2;11452:1;11442:16;11476:1;11486:194;11500:6;11497:1;11494:13;11486:194;;;11565:13;;-1:-1:-1;;;;;11561:39:1;11549:52;;11621:12;;;;11597:1;11656:14;;;;11515:9;11486:194;;11710:337;11914:6;11903:9;11896:25;11957:2;11952;11941:9;11937:18;11930:30;11877:4;11977:64;12037:2;12026:9;12022:18;12014:6;11977:64;:::i;12052:659::-;12117:5;12170:3;12163:4;12155:6;12151:17;12147:27;12137:55;;12188:1;12185;12178:12;12137:55;12217:6;12211:13;12243:4;12267:60;12283:43;12323:2;12283:43;:::i;12267:60::-;12361:15;;;12447:1;12443:10;;;;12431:23;;12427:32;;;12392:12;;;;12471:15;;;12468:35;;;12499:1;12496;12489:12;12468:35;12535:2;12527:6;12523:15;12547:135;12563:6;12558:3;12555:15;12547:135;;;12629:10;;12617:23;;12660:12;;;;12580;;12547:135;;;-1:-1:-1;12700:5:1;12052:659;-1:-1:-1;;;;;;12052:659:1:o;12716:363::-;12811:6;12864:2;12852:9;12843:7;12839:23;12835:32;12832:52;;;12880:1;12877;12870:12;12832:52;12913:9;12907:16;12946:18;12938:6;12935:30;12932:50;;;12978:1;12975;12968:12;12932:50;13001:72;13065:7;13056:6;13045:9;13041:22;13001:72;:::i;:::-;12991:82;12716:363;-1:-1:-1;;;;12716:363:1:o;13084:135::-;13123:3;13144:17;;;13141:43;;13164:18;;:::i;:::-;-1:-1:-1;13211:1:1;13200:13;;13084:135::o;13224:127::-;13285:10;13280:3;13276:20;13273:1;13266:31;13316:4;13313:1;13306:15;13340:4;13337:1;13330:15;14028:497;14082:5;14135:3;14128:4;14120:6;14116:17;14112:27;14102:55;;14153:1;14150;14143:12;14102:55;14182:6;14176:13;14208:18;14204:2;14201:26;14198:52;;;14230:18;;:::i;:::-;14274:55;14317:2;14298:13;;-1:-1:-1;;14294:27:1;14323:4;14290:38;14274:55;:::i;:::-;14354:2;14345:7;14338:19;14400:3;14393:4;14388:2;14380:6;14376:15;14372:26;14369:35;14366:55;;;14417:1;14414;14407:12;14366:55;14430:64;14491:2;14484:4;14475:7;14471:18;14464:4;14456:6;14452:17;14430:64;:::i;14530:1644::-;14712:6;14720;14728;14736;14789:3;14777:9;14768:7;14764:23;14760:33;14757:53;;;14806:1;14803;14796:12;14757:53;14839:9;14833:16;14868:18;14909:2;14901:6;14898:14;14895:34;;;14925:1;14922;14915:12;14895:34;14963:6;14952:9;14948:22;14938:32;;15008:7;15001:4;14997:2;14993:13;14989:27;14979:55;;15030:1;15027;15020:12;14979:55;15059:2;15053:9;15081:4;15105:60;15121:43;15161:2;15121:43;:::i;15105:60::-;15199:15;;;15281:1;15277:10;;;;15269:19;;15265:28;;;15230:12;;;;15305:19;;;15302:39;;;15337:1;15334;15327:12;15302:39;15361:11;;;;15381:210;15397:6;15392:3;15389:15;15381:210;;;15470:3;15464:10;15487:31;15512:5;15487:31;:::i;:::-;15531:18;;15414:12;;;;15569;;;;15381:210;;;15646:18;;;15640:25;15610:5;;-1:-1:-1;15640:25:1;;-1:-1:-1;;;15677:16:1;;;15674:36;;;15706:1;15703;15696:12;15674:36;15729:63;15784:7;15773:8;15762:9;15758:24;15729:63;:::i;:::-;15719:73;;15838:2;15827:9;15823:18;15817:25;15801:41;;15867:2;15857:8;15854:16;15851:36;;;15883:1;15880;15873:12;15851:36;15906:74;15972:7;15961:8;15950:9;15946:24;15906:74;:::i;:::-;15896:84;;16026:2;16015:9;16011:18;16005:25;15989:41;;16055:2;16045:8;16042:16;16039:36;;;16071:1;16068;16061:12;16039:36;;16094:74;16160:7;16149:8;16138:9;16134:24;16094:74;:::i;:::-;16084:84;;;14530:1644;;;;;;;:::o;16865:245::-;16932:6;16985:2;16973:9;16964:7;16960:23;16956:32;16953:52;;;17001:1;16998;16991:12;16953:52;17033:9;17027:16;17052:28;17074:5;17052:28;:::i;18469:949::-;18567:6;18620:2;18608:9;18599:7;18595:23;18591:32;18588:52;;;18636:1;18633;18626:12;18588:52;18669:9;18663:16;18698:18;18739:2;18731:6;18728:14;18725:34;;;18755:1;18752;18745:12;18725:34;18778:22;;;;18834:4;18816:16;;;18812:27;18809:47;;;18852:1;18849;18842:12;18809:47;18878:22;;:::i;:::-;18929:2;18923:9;18916:5;18909:24;18979:2;18975;18971:11;18965:18;18960:2;18953:5;18949:14;18942:42;19030:2;19026;19022:11;19016:18;19011:2;19004:5;19000:14;18993:42;19081:2;19077;19073:11;19067:18;19062:2;19055:5;19051:14;19044:42;19125:3;19121:2;19117:12;19111:19;19155:2;19145:8;19142:16;19139:36;;;19171:1;19168;19161:12;19139:36;19208:56;19256:7;19245:8;19241:2;19237:17;19208:56;:::i;:::-;19202:3;19195:5;19191:15;19184:81;;19303:3;19299:2;19295:12;19289:19;19274:34;;19317:30;19339:7;19317:30;:::i;:::-;19374:3;19363:15;;19356:32;;;;-1:-1:-1;19367:5:1;18469:949;-1:-1:-1;;;18469:949:1:o;20944:274::-;21073:3;21111:6;21105:13;21127:53;21173:6;21168:3;21161:4;21153:6;21149:17;21127:53;:::i;:::-;21196:16;;;;;20944:274;-1:-1:-1;;20944:274:1:o;21223:587::-;21519:6;21508:9;21501:25;21562:6;21557:2;21546:9;21542:18;21535:34;21605:3;21600:2;21589:9;21585:18;21578:31;21482:4;21626:65;21686:3;21675:9;21671:19;21663:6;21626:65;:::i;:::-;-1:-1:-1;;;;;21727:32:1;;;;21722:2;21707:18;;21700:60;-1:-1:-1;21791:3:1;21776:19;21769:35;21618:73;21223:587;-1:-1:-1;;;21223:587:1:o;22904:306::-;22992:6;23000;23008;23061:2;23049:9;23040:7;23036:23;23032:32;23029:52;;;23077:1;23074;23067:12;23029:52;23106:9;23100:16;23090:26;;23156:2;23145:9;23141:18;23135:25;23125:35;;23200:2;23189:9;23185:18;23179:25;23169:35;;22904:306;;;;;:::o;23564:220::-;23713:2;23702:9;23695:21;23676:4;23733:45;23774:2;23763:9;23759:18;23751:6;23733:45;:::i

Swarm Source

ipfs://33e34266f9b88c0b82bd6fe91ca2d1e211162db7d918606081629915f14ba0b8

Block Transaction Gas Used Reward
view all blocks collator

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

OVERVIEW

Strategy for beamswap-wstdot-xcdot

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.