More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 865 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exercise | 104660951 | 2 days ago | IN | 0 FTM | 0.00121536 | ||||
Exercise | 104626625 | 3 days ago | IN | 0 FTM | 0.0013256 | ||||
Exercise | 104608518 | 3 days ago | IN | 0 FTM | 0.00106836 | ||||
Exercise | 104229866 | 9 days ago | IN | 0 FTM | 0.00123026 | ||||
Exercise | 104200636 | 9 days ago | IN | 0 FTM | 0.00149683 | ||||
Exercise | 104158249 | 10 days ago | IN | 0 FTM | 0.00103245 | ||||
Exercise | 104118709 | 11 days ago | IN | 0 FTM | 0.00154413 | ||||
Exercise | 104077130 | 11 days ago | IN | 0 FTM | 0.00125228 | ||||
Exercise | 103957702 | 13 days ago | IN | 0 FTM | 0.00103902 | ||||
Exercise | 103738911 | 16 days ago | IN | 0 FTM | 0.00106533 | ||||
Exercise | 103720056 | 17 days ago | IN | 0 FTM | 0.00127293 | ||||
Exercise | 103712566 | 17 days ago | IN | 0 FTM | 0.00103245 | ||||
Exercise | 103677978 | 18 days ago | IN | 0 FTM | 0.00102942 | ||||
Exercise | 103675432 | 18 days ago | IN | 0 FTM | 0.00154413 | ||||
Exercise | 103663980 | 18 days ago | IN | 0 FTM | 0.00179795 | ||||
Exercise | 103629399 | 18 days ago | IN | 0 FTM | 0.00140152 | ||||
Exercise | 103616400 | 19 days ago | IN | 0 FTM | 0.00122318 | ||||
Exercise | 103614368 | 19 days ago | IN | 0 FTM | 0.00102942 | ||||
Exercise | 103612726 | 19 days ago | IN | 0 FTM | 0.00121118 | ||||
Exercise | 103553999 | 20 days ago | IN | 0 FTM | 0.0010653 | ||||
Exercise | 103499821 | 20 days ago | IN | 0 FTM | 0.00124123 | ||||
Exercise | 103374904 | 23 days ago | IN | 0 FTM | 0.00102937 | ||||
Exercise | 103343311 | 23 days ago | IN | 0 FTM | 0.00055021 | ||||
Exercise | 103330087 | 23 days ago | IN | 0 FTM | 0.01947906 | ||||
Exercise | 103312995 | 23 days ago | IN | 0 FTM | 0.00102942 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
68392387 | 514 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
SimpleExerciseHelper
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.8.17; import "@openzeppelin/contracts/access/Ownable2Step.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; interface IoToken is IERC20 { function exercise( uint256 _amount, uint256 _maxPaymentAmount, address _recipient ) external returns (uint256); function getDiscountedPrice( uint256 _amount ) external view returns (uint256); function discount() external view returns (uint256); function underlyingToken() external view returns (address); } interface IBalancer { function flashLoan( address recipient, address[] memory tokens, uint256[] memory amounts, bytes memory userData ) external; } interface IRouter { struct route { address from; address to; bool stable; } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline ) external returns (uint[] memory amounts); function getAmountOut( uint amountIn, address tokenIn, address tokenOut, bool stable ) external view returns (uint amount); } /** * @title Simple Exercise Helper * @notice This contract easily converts oTokens paired with WFTM * such as oFVM to WFTM using flash loans. */ contract SimpleExerciseHelper is Ownable2Step { /// @notice WFTM, payment token IERC20 internal constant wftm = IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); /// @notice Flashloan from Balancer vault IBalancer internal constant balancerVault = IBalancer(0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce); /// @notice FVM router for swaps IRouter internal constant router = IRouter(0x2E14B53E2cB669f3A974CeaF6C735e134F3Aa9BC); /// @notice Check whether we are in the middle of a flashloan (used for callback) bool public flashEntered; /// @notice Where we send our 0.25% fee address public feeAddress = 0x58761D6C6bF6c4bab96CaE125a2e5c8B1859b48a; uint256 public fee = 25; uint256 internal constant MAX_BPS = 10_000; uint256 internal constant DISCOUNT_DENOMINATOR = 100; /** * @notice Check if spot swap and exercising fall are similar enough for our liking. * @param _oToken The option token we are exercising. * @param _optionTokenAmount The amount of oToken to exercise to WFTM. * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes. * @return paymentTokenNeeded How much payment token is needed for given amount of oToken. * @return withinSlippageTolerance Whether expected vs real profit fall within our slippage tolerance. * @return realProfit Simulated profit in paymentToken after repaying flash loan. * @return expectedProfit Calculated ideal profit based on redemption discount plus allowed slippage. * @return profitSlippage Expected profit slippage with given oToken amount, 18 decimals. Zero * means extra profit (positive slippage). */ function quoteExerciseProfit( address _oToken, uint256 _optionTokenAmount, uint256 _profitSlippageAllowed ) public view returns ( uint256 paymentTokenNeeded, bool withinSlippageTolerance, uint256 realProfit, uint256 expectedProfit, uint256 profitSlippage ) { if (_optionTokenAmount == 0) { revert("Can't exercise zero"); } if (_profitSlippageAllowed > MAX_BPS) { revert("Slippage must be less than 10,000"); } // figure out how much WFTM we need for our oToken amount paymentTokenNeeded = IoToken(_oToken).getDiscountedPrice( _optionTokenAmount ); // compare our token needed to spot price uint256 spotPaymentTokenReceived = router.getAmountOut( _optionTokenAmount, IoToken(_oToken).underlyingToken(), address(wftm), false ); realProfit = spotPaymentTokenReceived - paymentTokenNeeded; // calculate our ideal profit using the discount uint256 discount = IoToken(_oToken).discount(); expectedProfit = (paymentTokenNeeded * (DISCOUNT_DENOMINATOR - discount)) / discount; // if profitSlippage returns zero, we have positive slippage (extra profit) if (expectedProfit > realProfit) { profitSlippage = 1e18 - ((realProfit * 1e18) / expectedProfit); } // allow for our expected slippage as well expectedProfit = (expectedProfit * (MAX_BPS - _profitSlippageAllowed)) / MAX_BPS; // check if real profit is greater than expected when accounting for allowed slippage if (realProfit > expectedProfit) { withinSlippageTolerance = true; } } /** * @notice Exercise our oToken for WFTM. * @param _oToken The option token we are exercising. * @param _amount The amount of oToken to exercise to WFTM. * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes. * @param _swapSlippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM. */ function exercise( address _oToken, uint256 _amount, uint256 _profitSlippageAllowed, uint256 _swapSlippageAllowed ) external { // first person does the approvals for everyone else, what a nice person! _checkAllowance(_oToken); // transfer option token to this contract _safeTransferFrom(_oToken, msg.sender, address(this), _amount); // check that slippage tolerance for profit is okay ( uint256 paymentTokenNeeded, bool withinSlippageTolerance, , , ) = quoteExerciseProfit(_oToken, _amount, _profitSlippageAllowed); if (!withinSlippageTolerance) { revert("Profit not within slippage tolerance, check TWAP"); } // get our flash loan started _borrowPaymentToken(_oToken, paymentTokenNeeded, _swapSlippageAllowed); // send remaining profit back to user _safeTransfer(address(wftm), msg.sender, wftm.balanceOf(address(this))); } /** * @notice Flash loan our WFTM from Balancer. * @param _oToken The option token we are exercising. * @param _amountNeeded The amount of WFTM needed. * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM. */ function _borrowPaymentToken( address _oToken, uint256 _amountNeeded, uint256 _slippageAllowed ) internal { // change our state flashEntered = true; // create our input args address[] memory tokens = new address[](1); tokens[0] = address(wftm); uint256[] memory amounts = new uint256[](1); amounts[0] = _amountNeeded; bytes memory userData = abi.encode( _oToken, _amountNeeded, _slippageAllowed ); // call the flash loan balancerVault.flashLoan(address(this), tokens, amounts, userData); } /** * @notice Fallback function used during flash loans. * @dev May only be called by balancer vault as part of * flash loan callback. * @param _tokens The tokens we are swapping (in our case, only WFTM). * @param _amounts The amounts of said tokens. * @param _feeAmounts The fee amounts for said tokens. * @param _userData Payment token amount passed from our flash loan. */ function receiveFlashLoan( address[] memory _tokens, uint256[] memory _amounts, uint256[] memory _feeAmounts, bytes memory _userData ) external { // only balancer vault may call this, during a flash loan if (msg.sender != address(balancerVault)) { revert("Only balancer vault can call"); } if (!flashEntered) { revert("Flashloan not in progress"); } // pull our option info from the userData ( address _oToken, uint256 paymentTokenNeeded, uint256 slippageAllowed ) = abi.decode(_userData, (address, uint256, uint256)); // exercise our option with our new WFTM, swap all underlying to WFTM uint256 optionTokenBalance = IoToken(_oToken).balanceOf(address(this)); _exerciseAndSwap( _oToken, optionTokenBalance, paymentTokenNeeded, slippageAllowed ); // check our output and take fees uint256 wftmAmount = wftm.balanceOf(address(this)); _takeFees(wftmAmount); // repay our flash loan uint256 payback = _amounts[0] + _feeAmounts[0]; _safeTransfer(address(wftm), address(balancerVault), payback); flashEntered = false; } /** * @notice Exercise our oToken, then swap underlying to WFTM. * @param _oToken The option token we are exercising. * @param _optionTokenAmount Amount of oToken to exercise. * @param _paymentTokenAmount Amount of WFTM needed to pay for exercising. * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WFTM. */ function _exerciseAndSwap( address _oToken, uint256 _optionTokenAmount, uint256 _paymentTokenAmount, uint256 _slippageAllowed ) internal { // pull our underlying from the oToken IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken()); // exercise IoToken(_oToken).exercise( _optionTokenAmount, _paymentTokenAmount, address(this) ); uint256 underlyingReceived = underlying.balanceOf(address(this)); IRouter.route[] memory tokenToWftm = new IRouter.route[](1); tokenToWftm[0] = IRouter.route( address(underlying), address(wftm), false ); // use this to minimize issues with slippage (swapping with too much size) uint256 wftmPerToken = router.getAmountOut( 1e18, address(underlying), address(wftm), false ); uint256 minAmountOut = (underlyingReceived * wftmPerToken * (MAX_BPS - _slippageAllowed)) / (1e18 * MAX_BPS); // use our router to swap from underlying to WFTM router.swapExactTokensForTokens( underlyingReceived, minAmountOut, tokenToWftm, address(this), block.timestamp ); } /** * @notice Apply fees to our after-swap total. * @dev Default is 0.25% but this may be updated later. * @param _amount Amount to apply our fee to. */ function _takeFees(uint256 _amount) internal { uint256 toSend = (_amount * fee) / MAX_BPS; _safeTransfer(address(wftm), feeAddress, toSend); } // helper to approve new oTokens to spend WFTM, etc. from this contract function _checkAllowance(address _oToken) internal { if (wftm.allowance(address(this), _oToken) == 0) { wftm.approve(_oToken, type(uint256).max); // approve router to spend underlying from this contract IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken()); underlying.approve(address(router), type(uint256).max); } } /** * @notice Sweep out tokens accidentally sent here. * @dev May only be called by owner. * @param _tokenAddress Address of token to sweep. * @param _tokenAmount Amount of tokens to sweep. */ function recoverERC20( address _tokenAddress, uint256 _tokenAmount ) external onlyOwner { _safeTransfer(_tokenAddress, owner(), _tokenAmount); } /** * @notice * Update fee for oToken -> WFTM conversion. * @param _recipient Fee recipient address. * @param _newFee New fee, out of 10,000. */ function setFee(address _recipient, uint256 _newFee) external onlyOwner { if (_newFee > DISCOUNT_DENOMINATOR) { revert("Fee max is 1%"); } fee = _newFee; feeAddress = _recipient; } /* ========== HELPER FUNCTIONS ========== */ function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; import "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"},{"internalType":"uint256","name":"_swapSlippageAllowed","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_optionTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"}],"name":"quoteExerciseProfit","outputs":[{"internalType":"uint256","name":"paymentTokenNeeded","type":"uint256"},{"internalType":"bool","name":"withinSlippageTolerance","type":"bool"},{"internalType":"uint256","name":"realProfit","type":"uint256"},{"internalType":"uint256","name":"expectedProfit","type":"uint256"},{"internalType":"uint256","name":"profitSlippage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040527358761d6c6bf6c4bab96cae125a2e5c8b1859b48a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060196003553480156200006b57600080fd5b506200008c620000806200009260201b60201c565b6200009a60201b60201c565b6200019c565b600033905090565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620000d581620000d860201b62000bfd1760201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cf180620001ac6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b94506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a007321be370d5312f44cb42ce377bc9b8a0cef1a4c837320dd72ed959b6147912c2e529f0a0c651c33c9ce83610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57321be370d5312f44cb42ce377bc9b8a0cef1a4c83337321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b60200260200101819052506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a7640000867321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b9050732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b90506113097321be370d5312f44cb42ce377bc9b8a0cef1a4c83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f577321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b5090507321be370d5312f44cb42ce377bc9b8a0cef1a4c83816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b60405160208183030381529060405290507320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea26469706673582212201006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c17764736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b94506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a007321be370d5312f44cb42ce377bc9b8a0cef1a4c837320dd72ed959b6147912c2e529f0a0c651c33c9ce83610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57321be370d5312f44cb42ce377bc9b8a0cef1a4c83337321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020017321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b60200260200101819052506000732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a7640000867321be370d5312f44cb42ce377bc9b8a0cef1a4c8360006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b9050732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc73ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b90506113097321be370d5312f44cb42ce377bc9b8a0cef1a4c83600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b60007321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f577321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3732e14b53e2cb669f3a974ceaf6c735e134f3aa9bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b5090507321be370d5312f44cb42ce377bc9b8a0cef1a4c83816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b60405160208183030381529060405290507320dd72ed959b6147912c2e529f0a0c651c33c9ce73ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea26469706673582212201006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c17764736f6c63430008110033
Deployed Bytecode Sourcemap
1404:12037:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1971:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3148:1893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;1824:101:0;;;:::i;:::-;;1734:212:1;;;:::i;:::-;;11976:176:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:23:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;847:99:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12333:228:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7850:1318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1139:178:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5449:1034:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1971:24;;;;;;;;;;;;;:::o;2046:70::-;;;;;;;;;;;;;:::o;3148:1893::-;3342:26;3382:28;3424:18;3456:22;3492;3565:1;3543:18;:23;3539:83;;3582:29;;;;;;;;;;:::i;:::-;;;;;;;;3539:83;2189:6;3635:22;:32;3631:106;;;3683:43;;;;;;;;;;:::i;:::-;;;;;;;;3631:106;3842:7;3834:35;;;3883:18;3834:77;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3813:98;;3972:32;1835:42;4007:19;;;4040:18;4080:7;4072:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1539:42;4147:5;4007:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3972:190;;4212:18;4185:24;:45;;;;:::i;:::-;4172:58;;4298:16;4325:7;4317:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4298:46;;4454:8;4429;2250:3;4406:31;;;;:::i;:::-;4384:18;:54;;;;:::i;:::-;4383:79;;;;:::i;:::-;4354:108;;4578:10;4561:14;:27;4557:120;;;4651:14;4643:4;4630:10;:17;;;;:::i;:::-;4629:36;;;;:::i;:::-;4621:4;:45;;;;:::i;:::-;4604:62;;4557:120;2189:6;4796:22;2189:6;4786:32;;;;:::i;:::-;4768:14;:51;;;;:::i;:::-;4767:75;;;;:::i;:::-;4738:104;;4964:14;4951:10;:27;4947:88;;;5020:4;4994:30;;4947:88;3529:1512;;3148:1893;;;;;;;;;:::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1734:212:1:-;1786:14;1803:12;:10;:12::i;:::-;1786:29;;1851:6;1833:24;;:14;:12;:14::i;:::-;:24;;;1825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1913:26;1932:6;1913:18;:26::i;:::-;1776:170;1734:212::o;11976:176:6:-;1094:13:0;:11;:13::i;:::-;12094:51:6::1;12108:13;12123:7;:5;:7::i;:::-;12132:12;12094:13;:51::i;:::-;11976:176:::0;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2123:23:6:-;;;;:::o;847:99:1:-;900:7;926:13;;;;;;;;;;;919:20;;847:99;:::o;12333:228:6:-;1094:13:0;:11;:13::i;:::-;2250:3:6::1;12419:7;:30;12415:84;;;12465:23;;;;;;;;;;:::i;:::-;;;;;;;;12415:84;12514:7;12508:3;:13;;;;12544:10;12531;;:23;;;;;;;;;;;;;;;;;;12333:228:::0;;:::o;7850:1318::-;1697:42;8110:36;;:10;:36;;;8106:105;;8162:38;;;;;;;;;;:::i;:::-;;;;;;;;8106:105;8225:12;;;;;;;;;;;8220:79;;8253:35;;;;;;;;;;:::i;:::-;;;;;;;;8220:79;8373:15;8402:26;8442:23;8489:9;8478:50;;;;;;;;;;;;:::i;:::-;8359:169;;;;;;8617:26;8654:7;8646:26;;;8681:4;8646:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8617:70;;8697:140;8727:7;8748:18;8780;8812:15;8697:16;:140::i;:::-;8890:18;1539:42;8911:14;;;8934:4;8911:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8890:50;;8950:21;8960:10;8950:9;:21::i;:::-;9014:15;9046:11;9058:1;9046:14;;;;;;;;:::i;:::-;;;;;;;;9032:8;9041:1;9032:11;;;;;;;;:::i;:::-;;;;;;;;:28;;;;:::i;:::-;9014:46;;9070:61;1539:42;1697;9123:7;9070:13;:61::i;:::-;9156:5;9141:12;;:20;;;;;;;;;;;;;;;;;;8030:1138;;;;;;7850:1318;;;;:::o;1139:178:1:-;1094:13:0;:11;:13::i;:::-;1244:8:1::1;1228:13;;:24;;;;;;;;;;;;;;;;;;1301:8;1267:43;;1292:7;:5;:7::i;:::-;1267:43;;;;;;;;;;;;1139:178:::0;:::o;5449:1034:6:-;5702:24;5718:7;5702:15;:24::i;:::-;5787:62;5805:7;5814:10;5834:4;5841:7;5787:17;:62::i;:::-;5934:26;5974:28;6045:61;6065:7;6074;6083:22;6045:19;:61::i;:::-;5920:186;;;;;;;6122:23;6117:113;;6161:58;;;;;;;;;;:::i;:::-;;;;;;;;6117:113;6278:70;6298:7;6307:18;6327:20;6278:19;:70::i;:::-;6405:71;1539:42;6434:10;1539:42;6446:14;;;6469:4;6446:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6405:13;:71::i;:::-;5610:873;;5449:1034;;;;:::o;2426:187:0:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;1501:153:1:-;1590:13;;1583:20;;;;;;;;;;;1613:34;1638:8;1613:24;:34::i;:::-;1501:153;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;12617:336:6:-;12729:1;12709:5;:17;;;:21;12701:30;;;;;;12742:12;12756:17;12777:5;:10;;12824:24;;;12850:2;12854:5;12801:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12777:93;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12741:129;;;;12888:7;:57;;;;;12915:1;12900:4;:11;:16;:44;;;;12931:4;12920:24;;;;;;;;;;;;:::i;:::-;12900:44;12888:57;12880:66;;;;;;12691:262;;12617:336;;;:::o;9562:1364::-;9792:17;9827:7;9819:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9792:62;;9893:7;9885:25;;;9924:18;9956:19;9997:4;9885:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10022:26;10051:10;:20;;;10080:4;10051:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10022:64;;10097:34;10154:1;10134:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10097:59;;10183:102;;;;;;;;10218:10;10183:102;;;;;;1539:42;10183:102;;;;;;10270:5;10183:102;;;;;10166:11;10178:1;10166:14;;;;;;;;:::i;:::-;;;;;;;:119;;;;10379:20;1835:42;10402:19;;;10435:4;10461:10;1539:42;10513:5;10402:126;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10379:149;;10538:20;2189:6;10655:4;:14;;;;:::i;:::-;10633:16;2189:6;10623:26;;;;:::i;:::-;10595:12;10562:18;:45;;;;:::i;:::-;:88;;;;:::i;:::-;10561:109;;;;:::i;:::-;10538:132;;1835:42;10739:31;;;10784:18;10816:12;10842:11;10875:4;10894:15;10739:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9735:1191;;;;;9562:1364;;;;:::o;11109:162::-;11164:14;2189:6;11192:3;;11182:7;:13;;;;:::i;:::-;11181:25;;;;:::i;:::-;11164:42;;11216:48;1539:42;11245:10;;;;;;;;;;;11257:6;11216:13;:48::i;:::-;11154:117;11109:162;:::o;11353:395::-;11460:1;1539:42;11418:14;;;11441:4;11448:7;11418:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;11414:328;;1539:42;11477:12;;;11490:7;11499:17;11477:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11601:17;11636:7;11628:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11601:62;;11677:10;:18;;;1835:42;11713:17;11677:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11463:279;11414:328;11353:395;:::o;12959:480::-;13127:1;13107:5;:17;;;:21;13099:30;;;;;;13140:12;13154:17;13175:5;:10;;13239:28;;;13285:4;13307:2;13327:5;13199:147;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13175:181;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13139:217;;;;13374:7;:57;;;;;13401:1;13386:4;:11;:16;:44;;;;13417:4;13406:24;;;;;;;;;;;;:::i;:::-;13386:44;13374:57;13366:66;;;;;;13089:350;;12959:480;;;;:::o;6774:649::-;6961:4;6946:12;;:19;;;;;;;;;;;;;;;;;;7009:23;7049:1;7035:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:42;;1539;7061:6;7068:1;7061:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;7097:24;7138:1;7124:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7097:43;;7163:13;7150:7;7158:1;7150:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;7187:21;7235:7;7256:13;7283:16;7211:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7187:122;;1697:42;7351:23;;;7383:4;7390:6;7398:7;7407:8;7351:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:515;;;6774:649;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:90:7:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:126::-;471:7;511:42;504:5;500:54;489:65;;434:126;;;:::o;566:96::-;603:7;632:24;650:5;632:24;:::i;:::-;621:35;;566:96;;;:::o;668:118::-;755:24;773:5;755:24;:::i;:::-;750:3;743:37;668:118;;:::o;792:222::-;885:4;923:2;912:9;908:18;900:26;;936:71;1004:1;993:9;989:17;980:6;936:71;:::i;:::-;792:222;;;;:::o;1020:75::-;1053:6;1086:2;1080:9;1070:19;;1020:75;:::o;1101:117::-;1210:1;1207;1200:12;1224:117;1333:1;1330;1323:12;1347:122;1420:24;1438:5;1420:24;:::i;:::-;1413:5;1410:35;1400:63;;1459:1;1456;1449:12;1400:63;1347:122;:::o;1475:139::-;1521:5;1559:6;1546:20;1537:29;;1575:33;1602:5;1575:33;:::i;:::-;1475:139;;;;:::o;1620:77::-;1657:7;1686:5;1675:16;;1620:77;;;:::o;1703:122::-;1776:24;1794:5;1776:24;:::i;:::-;1769:5;1766:35;1756:63;;1815:1;1812;1805:12;1756:63;1703:122;:::o;1831:139::-;1877:5;1915:6;1902:20;1893:29;;1931:33;1958:5;1931:33;:::i;:::-;1831:139;;;;:::o;1976:619::-;2053:6;2061;2069;2118:2;2106:9;2097:7;2093:23;2089:32;2086:119;;;2124:79;;:::i;:::-;2086:119;2244:1;2269:53;2314:7;2305:6;2294:9;2290:22;2269:53;:::i;:::-;2259:63;;2215:117;2371:2;2397:53;2442:7;2433:6;2422:9;2418:22;2397:53;:::i;:::-;2387:63;;2342:118;2499:2;2525:53;2570:7;2561:6;2550:9;2546:22;2525:53;:::i;:::-;2515:63;;2470:118;1976:619;;;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:652::-;2924:4;2962:3;2951:9;2947:19;2939:27;;2976:71;3044:1;3033:9;3029:17;3020:6;2976:71;:::i;:::-;3057:66;3119:2;3108:9;3104:18;3095:6;3057:66;:::i;:::-;3133:72;3201:2;3190:9;3186:18;3177:6;3133:72;:::i;:::-;3215;3283:2;3272:9;3268:18;3259:6;3215:72;:::i;:::-;3297:73;3365:3;3354:9;3350:19;3341:6;3297:73;:::i;:::-;2725:652;;;;;;;;:::o;3383:474::-;3451:6;3459;3508:2;3496:9;3487:7;3483:23;3479:32;3476:119;;;3514:79;;:::i;:::-;3476:119;3634:1;3659:53;3704:7;3695:6;3684:9;3680:22;3659:53;:::i;:::-;3649:63;;3605:117;3761:2;3787:53;3832:7;3823:6;3812:9;3808:22;3787:53;:::i;:::-;3777:63;;3732:118;3383:474;;;;;:::o;3863:222::-;3956:4;3994:2;3983:9;3979:18;3971:26;;4007:71;4075:1;4064:9;4060:17;4051:6;4007:71;:::i;:::-;3863:222;;;;:::o;4091:117::-;4200:1;4197;4190:12;4214:102;4255:6;4306:2;4302:7;4297:2;4290:5;4286:14;4282:28;4272:38;;4214:102;;;:::o;4322:180::-;4370:77;4367:1;4360:88;4467:4;4464:1;4457:15;4491:4;4488:1;4481:15;4508:281;4591:27;4613:4;4591:27;:::i;:::-;4583:6;4579:40;4721:6;4709:10;4706:22;4685:18;4673:10;4670:34;4667:62;4664:88;;;4732:18;;:::i;:::-;4664:88;4772:10;4768:2;4761:22;4551:238;4508:281;;:::o;4795:129::-;4829:6;4856:20;;:::i;:::-;4846:30;;4885:33;4913:4;4905:6;4885:33;:::i;:::-;4795:129;;;:::o;4930:311::-;5007:4;5097:18;5089:6;5086:30;5083:56;;;5119:18;;:::i;:::-;5083:56;5169:4;5161:6;5157:17;5149:25;;5229:4;5223;5219:15;5211:23;;4930:311;;;:::o;5247:117::-;5356:1;5353;5346:12;5387:710;5483:5;5508:81;5524:64;5581:6;5524:64;:::i;:::-;5508:81;:::i;:::-;5499:90;;5609:5;5638:6;5631:5;5624:21;5672:4;5665:5;5661:16;5654:23;;5725:4;5717:6;5713:17;5705:6;5701:30;5754:3;5746:6;5743:15;5740:122;;;5773:79;;:::i;:::-;5740:122;5888:6;5871:220;5905:6;5900:3;5897:15;5871:220;;;5980:3;6009:37;6042:3;6030:10;6009:37;:::i;:::-;6004:3;5997:50;6076:4;6071:3;6067:14;6060:21;;5947:144;5931:4;5926:3;5922:14;5915:21;;5871:220;;;5875:21;5489:608;;5387:710;;;;;:::o;6120:370::-;6191:5;6240:3;6233:4;6225:6;6221:17;6217:27;6207:122;;6248:79;;:::i;:::-;6207:122;6365:6;6352:20;6390:94;6480:3;6472:6;6465:4;6457:6;6453:17;6390:94;:::i;:::-;6381:103;;6197:293;6120:370;;;;:::o;6496:311::-;6573:4;6663:18;6655:6;6652:30;6649:56;;;6685:18;;:::i;:::-;6649:56;6735:4;6727:6;6723:17;6715:25;;6795:4;6789;6785:15;6777:23;;6496:311;;;:::o;6830:710::-;6926:5;6951:81;6967:64;7024:6;6967:64;:::i;:::-;6951:81;:::i;:::-;6942:90;;7052:5;7081:6;7074:5;7067:21;7115:4;7108:5;7104:16;7097:23;;7168:4;7160:6;7156:17;7148:6;7144:30;7197:3;7189:6;7186:15;7183:122;;;7216:79;;:::i;:::-;7183:122;7331:6;7314:220;7348:6;7343:3;7340:15;7314:220;;;7423:3;7452:37;7485:3;7473:10;7452:37;:::i;:::-;7447:3;7440:50;7519:4;7514:3;7510:14;7503:21;;7390:144;7374:4;7369:3;7365:14;7358:21;;7314:220;;;7318:21;6932:608;;6830:710;;;;;:::o;7563:370::-;7634:5;7683:3;7676:4;7668:6;7664:17;7660:27;7650:122;;7691:79;;:::i;:::-;7650:122;7808:6;7795:20;7833:94;7923:3;7915:6;7908:4;7900:6;7896:17;7833:94;:::i;:::-;7824:103;;7640:293;7563:370;;;;:::o;7939:117::-;8048:1;8045;8038:12;8062:307;8123:4;8213:18;8205:6;8202:30;8199:56;;;8235:18;;:::i;:::-;8199:56;8273:29;8295:6;8273:29;:::i;:::-;8265:37;;8357:4;8351;8347:15;8339:23;;8062:307;;;:::o;8375:146::-;8472:6;8467:3;8462;8449:30;8513:1;8504:6;8499:3;8495:16;8488:27;8375:146;;;:::o;8527:423::-;8604:5;8629:65;8645:48;8686:6;8645:48;:::i;:::-;8629:65;:::i;:::-;8620:74;;8717:6;8710:5;8703:21;8755:4;8748:5;8744:16;8793:3;8784:6;8779:3;8775:16;8772:25;8769:112;;;8800:79;;:::i;:::-;8769:112;8890:54;8937:6;8932:3;8927;8890:54;:::i;:::-;8610:340;8527:423;;;;;:::o;8969:338::-;9024:5;9073:3;9066:4;9058:6;9054:17;9050:27;9040:122;;9081:79;;:::i;:::-;9040:122;9198:6;9185:20;9223:78;9297:3;9289:6;9282:4;9274:6;9270:17;9223:78;:::i;:::-;9214:87;;9030:277;8969:338;;;;:::o;9313:1573::-;9483:6;9491;9499;9507;9556:3;9544:9;9535:7;9531:23;9527:33;9524:120;;;9563:79;;:::i;:::-;9524:120;9711:1;9700:9;9696:17;9683:31;9741:18;9733:6;9730:30;9727:117;;;9763:79;;:::i;:::-;9727:117;9868:78;9938:7;9929:6;9918:9;9914:22;9868:78;:::i;:::-;9858:88;;9654:302;10023:2;10012:9;10008:18;9995:32;10054:18;10046:6;10043:30;10040:117;;;10076:79;;:::i;:::-;10040:117;10181:78;10251:7;10242:6;10231:9;10227:22;10181:78;:::i;:::-;10171:88;;9966:303;10336:2;10325:9;10321:18;10308:32;10367:18;10359:6;10356:30;10353:117;;;10389:79;;:::i;:::-;10353:117;10494:78;10564:7;10555:6;10544:9;10540:22;10494:78;:::i;:::-;10484:88;;10279:303;10649:2;10638:9;10634:18;10621:32;10680:18;10672:6;10669:30;10666:117;;;10702:79;;:::i;:::-;10666:117;10807:62;10861:7;10852:6;10841:9;10837:22;10807:62;:::i;:::-;10797:72;;10592:287;9313:1573;;;;;;;:::o;10892:329::-;10951:6;11000:2;10988:9;10979:7;10975:23;10971:32;10968:119;;;11006:79;;:::i;:::-;10968:119;11126:1;11151:53;11196:7;11187:6;11176:9;11172:22;11151:53;:::i;:::-;11141:63;;11097:117;10892:329;;;;:::o;11227:765::-;11313:6;11321;11329;11337;11386:3;11374:9;11365:7;11361:23;11357:33;11354:120;;;11393:79;;:::i;:::-;11354:120;11513:1;11538:53;11583:7;11574:6;11563:9;11559:22;11538:53;:::i;:::-;11528:63;;11484:117;11640:2;11666:53;11711:7;11702:6;11691:9;11687:22;11666:53;:::i;:::-;11656:63;;11611:118;11768:2;11794:53;11839:7;11830:6;11819:9;11815:22;11794:53;:::i;:::-;11784:63;;11739:118;11896:2;11922:53;11967:7;11958:6;11947:9;11943:22;11922:53;:::i;:::-;11912:63;;11867:118;11227:765;;;;;;;:::o;11998:169::-;12082:11;12116:6;12111:3;12104:19;12156:4;12151:3;12147:14;12132:29;;11998:169;;;;:::o;12173:::-;12313:21;12309:1;12301:6;12297:14;12290:45;12173:169;:::o;12348:366::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:419::-;12886:4;12924:2;12913:9;12909:18;12901:26;;12973:9;12967:4;12963:20;12959:1;12948:9;12944:17;12937:47;13001:131;13127:4;13001:131;:::i;:::-;12993:139;;12720:419;;;:::o;13145:220::-;13285:34;13281:1;13273:6;13269:14;13262:58;13354:3;13349:2;13341:6;13337:15;13330:28;13145:220;:::o;13371:366::-;13513:3;13534:67;13598:2;13593:3;13534:67;:::i;:::-;13527:74;;13610:93;13699:3;13610:93;:::i;:::-;13728:2;13723:3;13719:12;13712:19;;13371:366;;;:::o;13743:419::-;13909:4;13947:2;13936:9;13932:18;13924:26;;13996:9;13990:4;13986:20;13982:1;13971:9;13967:17;13960:47;14024:131;14150:4;14024:131;:::i;:::-;14016:139;;13743:419;;;:::o;14168:143::-;14225:5;14256:6;14250:13;14241:22;;14272:33;14299:5;14272:33;:::i;:::-;14168:143;;;;:::o;14317:351::-;14387:6;14436:2;14424:9;14415:7;14411:23;14407:32;14404:119;;;14442:79;;:::i;:::-;14404:119;14562:1;14587:64;14643:7;14634:6;14623:9;14619:22;14587:64;:::i;:::-;14577:74;;14533:128;14317:351;;;;:::o;14674:143::-;14731:5;14762:6;14756:13;14747:22;;14778:33;14805:5;14778:33;:::i;:::-;14674:143;;;;:::o;14823:351::-;14893:6;14942:2;14930:9;14921:7;14917:23;14913:32;14910:119;;;14948:79;;:::i;:::-;14910:119;15068:1;15093:64;15149:7;15140:6;15129:9;15125:22;15093:64;:::i;:::-;15083:74;;15039:128;14823:351;;;;:::o;15180:541::-;15351:4;15389:3;15378:9;15374:19;15366:27;;15403:71;15471:1;15460:9;15456:17;15447:6;15403:71;:::i;:::-;15484:72;15552:2;15541:9;15537:18;15528:6;15484:72;:::i;:::-;15566;15634:2;15623:9;15619:18;15610:6;15566:72;:::i;:::-;15648:66;15710:2;15699:9;15695:18;15686:6;15648:66;:::i;:::-;15180:541;;;;;;;:::o;15727:180::-;15775:77;15772:1;15765:88;15872:4;15869:1;15862:15;15896:4;15893:1;15886:15;15913:194;15953:4;15973:20;15991:1;15973:20;:::i;:::-;15968:25;;16007:20;16025:1;16007:20;:::i;:::-;16002:25;;16051:1;16048;16044:9;16036:17;;16075:1;16069:4;16066:11;16063:37;;;16080:18;;:::i;:::-;16063:37;15913:194;;;;:::o;16113:410::-;16153:7;16176:20;16194:1;16176:20;:::i;:::-;16171:25;;16210:20;16228:1;16210:20;:::i;:::-;16205:25;;16265:1;16262;16258:9;16287:30;16305:11;16287:30;:::i;:::-;16276:41;;16466:1;16457:7;16453:15;16450:1;16447:22;16427:1;16420:9;16400:83;16377:139;;16496:18;;:::i;:::-;16377:139;16161:362;16113:410;;;;:::o;16529:180::-;16577:77;16574:1;16567:88;16674:4;16671:1;16664:15;16698:4;16695:1;16688:15;16715:185;16755:1;16772:20;16790:1;16772:20;:::i;:::-;16767:25;;16806:20;16824:1;16806:20;:::i;:::-;16801:25;;16845:1;16835:35;;16850:18;;:::i;:::-;16835:35;16892:1;16889;16885:9;16880:14;;16715:185;;;;:::o;16906:228::-;17046:34;17042:1;17034:6;17030:14;17023:58;17115:11;17110:2;17102:6;17098:15;17091:36;16906:228;:::o;17140:366::-;17282:3;17303:67;17367:2;17362:3;17303:67;:::i;:::-;17296:74;;17379:93;17468:3;17379:93;:::i;:::-;17497:2;17492:3;17488:12;17481:19;;17140:366;;;:::o;17512:419::-;17678:4;17716:2;17705:9;17701:18;17693:26;;17765:9;17759:4;17755:20;17751:1;17740:9;17736:17;17729:47;17793:131;17919:4;17793:131;:::i;:::-;17785:139;;17512:419;;;:::o;17937:163::-;18077:15;18073:1;18065:6;18061:14;18054:39;17937:163;:::o;18106:366::-;18248:3;18269:67;18333:2;18328:3;18269:67;:::i;:::-;18262:74;;18345:93;18434:3;18345:93;:::i;:::-;18463:2;18458:3;18454:12;18447:19;;18106:366;;;:::o;18478:419::-;18644:4;18682:2;18671:9;18667:18;18659:26;;18731:9;18725:4;18721:20;18717:1;18706:9;18702:17;18695:47;18759:131;18885:4;18759:131;:::i;:::-;18751:139;;18478:419;;;:::o;18903:178::-;19043:30;19039:1;19031:6;19027:14;19020:54;18903:178;:::o;19087:366::-;19229:3;19250:67;19314:2;19309:3;19250:67;:::i;:::-;19243:74;;19326:93;19415:3;19326:93;:::i;:::-;19444:2;19439:3;19435:12;19428:19;;19087:366;;;:::o;19459:419::-;19625:4;19663:2;19652:9;19648:18;19640:26;;19712:9;19706:4;19702:20;19698:1;19687:9;19683:17;19676:47;19740:131;19866:4;19740:131;:::i;:::-;19732:139;;19459:419;;;:::o;19884:175::-;20024:27;20020:1;20012:6;20008:14;20001:51;19884:175;:::o;20065:366::-;20207:3;20228:67;20292:2;20287:3;20228:67;:::i;:::-;20221:74;;20304:93;20393:3;20304:93;:::i;:::-;20422:2;20417:3;20413:12;20406:19;;20065:366;;;:::o;20437:419::-;20603:4;20641:2;20630:9;20626:18;20618:26;;20690:9;20684:4;20680:20;20676:1;20665:9;20661:17;20654:47;20718:131;20844:4;20718:131;:::i;:::-;20710:139;;20437:419;;;:::o;20862:104::-;20907:7;20936:24;20954:5;20936:24;:::i;:::-;20925:35;;20862:104;;;:::o;20972:138::-;21053:32;21079:5;21053:32;:::i;:::-;21046:5;21043:43;21033:71;;21100:1;21097;21090:12;21033:71;20972:138;:::o;21116:159::-;21181:5;21212:6;21206:13;21197:22;;21228:41;21263:5;21228:41;:::i;:::-;21116:159;;;;:::o;21281:679::-;21377:6;21385;21393;21442:2;21430:9;21421:7;21417:23;21413:32;21410:119;;;21448:79;;:::i;:::-;21410:119;21568:1;21593:72;21657:7;21648:6;21637:9;21633:22;21593:72;:::i;:::-;21583:82;;21539:136;21714:2;21740:64;21796:7;21787:6;21776:9;21772:22;21740:64;:::i;:::-;21730:74;;21685:129;21853:2;21879:64;21935:7;21926:6;21915:9;21911:22;21879:64;:::i;:::-;21869:74;;21824:129;21281:679;;;;;:::o;21966:180::-;22014:77;22011:1;22004:88;22111:4;22108:1;22101:15;22135:4;22132:1;22125:15;22152:191;22192:3;22211:20;22229:1;22211:20;:::i;:::-;22206:25;;22245:20;22263:1;22245:20;:::i;:::-;22240:25;;22288:1;22285;22281:9;22274:16;;22309:3;22306:1;22303:10;22300:36;;;22316:18;;:::i;:::-;22300:36;22152:191;;;;:::o;22349:235::-;22489:34;22485:1;22477:6;22473:14;22466:58;22558:18;22553:2;22545:6;22541:15;22534:43;22349:235;:::o;22590:366::-;22732:3;22753:67;22817:2;22812:3;22753:67;:::i;:::-;22746:74;;22829:93;22918:3;22829:93;:::i;:::-;22947:2;22942:3;22938:12;22931:19;;22590:366;;;:::o;22962:419::-;23128:4;23166:2;23155:9;23151:18;23143:26;;23215:9;23209:4;23205:20;23201:1;23190:9;23186:17;23179:47;23243:131;23369:4;23243:131;:::i;:::-;23235:139;;22962:419;;;:::o;23387:182::-;23527:34;23523:1;23515:6;23511:14;23504:58;23387:182;:::o;23575:366::-;23717:3;23738:67;23802:2;23797:3;23738:67;:::i;:::-;23731:74;;23814:93;23903:3;23814:93;:::i;:::-;23932:2;23927:3;23923:12;23916:19;;23575:366;;;:::o;23947:419::-;24113:4;24151:2;24140:9;24136:18;24128:26;;24200:9;24194:4;24190:20;24186:1;24175:9;24171:17;24164:47;24228:131;24354:4;24228:131;:::i;:::-;24220:139;;23947:419;;;:::o;24372:332::-;24493:4;24531:2;24520:9;24516:18;24508:26;;24544:71;24612:1;24601:9;24597:17;24588:6;24544:71;:::i;:::-;24625:72;24693:2;24682:9;24678:18;24669:6;24625:72;:::i;:::-;24372:332;;;;;:::o;24710:98::-;24761:6;24795:5;24789:12;24779:22;;24710:98;;;:::o;24814:147::-;24915:11;24952:3;24937:18;;24814:147;;;;:::o;24967:246::-;25048:1;25058:113;25072:6;25069:1;25066:13;25058:113;;;25157:1;25152:3;25148:11;25142:18;25138:1;25133:3;25129:11;25122:39;25094:2;25091:1;25087:10;25082:15;;25058:113;;;25205:1;25196:6;25191:3;25187:16;25180:27;25029:184;24967:246;;;:::o;25219:386::-;25323:3;25351:38;25383:5;25351:38;:::i;:::-;25405:88;25486:6;25481:3;25405:88;:::i;:::-;25398:95;;25502:65;25560:6;25555:3;25548:4;25541:5;25537:16;25502:65;:::i;:::-;25592:6;25587:3;25583:16;25576:23;;25327:278;25219:386;;;;:::o;25611:271::-;25741:3;25763:93;25852:3;25843:6;25763:93;:::i;:::-;25756:100;;25873:3;25866:10;;25611:271;;;;:::o;25888:116::-;25958:21;25973:5;25958:21;:::i;:::-;25951:5;25948:32;25938:60;;25994:1;25991;25984:12;25938:60;25888:116;:::o;26010:137::-;26064:5;26095:6;26089:13;26080:22;;26111:30;26135:5;26111:30;:::i;:::-;26010:137;;;;:::o;26153:345::-;26220:6;26269:2;26257:9;26248:7;26244:23;26240:32;26237:119;;;26275:79;;:::i;:::-;26237:119;26395:1;26420:61;26473:7;26464:6;26453:9;26449:22;26420:61;:::i;:::-;26410:71;;26366:125;26153:345;;;;:::o;26504:442::-;26653:4;26691:2;26680:9;26676:18;26668:26;;26704:71;26772:1;26761:9;26757:17;26748:6;26704:71;:::i;:::-;26785:72;26853:2;26842:9;26838:18;26829:6;26785:72;:::i;:::-;26867;26935:2;26924:9;26920:18;26911:6;26867:72;:::i;:::-;26504:442;;;;;;:::o;26952:103::-;27015:7;27044:5;27033:16;;26952:103;;;:::o;27061:60::-;27089:3;27110:5;27103:12;;27061:60;;;:::o;27127:194::-;27203:9;27236:79;27254:60;27263:50;27307:5;27263:50;:::i;:::-;27254:60;:::i;:::-;27236:79;:::i;:::-;27223:92;;27127:194;;;:::o;27327:183::-;27440:63;27497:5;27440:63;:::i;:::-;27435:3;27428:76;27327:183;;:::o;27516:593::-;27713:4;27751:3;27740:9;27736:19;27728:27;;27765:97;27859:1;27848:9;27844:17;27835:6;27765:97;:::i;:::-;27872:72;27940:2;27929:9;27925:18;27916:6;27872:72;:::i;:::-;27954;28022:2;28011:9;28007:18;27998:6;27954:72;:::i;:::-;28036:66;28098:2;28087:9;28083:18;28074:6;28036:66;:::i;:::-;27516:593;;;;;;;:::o;28115:136::-;28204:6;28238:5;28232:12;28222:22;;28115:136;;;:::o;28257:206::-;28378:11;28412:6;28407:3;28400:19;28452:4;28447:3;28443:14;28428:29;;28257:206;;;;:::o;28469:154::-;28558:4;28581:3;28573:11;;28611:4;28606:3;28602:14;28594:22;;28469:154;;;:::o;28629:108::-;28706:24;28724:5;28706:24;:::i;:::-;28701:3;28694:37;28629:108;;:::o;28743:99::-;28814:21;28829:5;28814:21;:::i;:::-;28809:3;28802:34;28743:99;;:::o;28900:659::-;29031:4;29026:3;29022:14;29118:4;29111:5;29107:16;29101:23;29137:63;29194:4;29189:3;29185:14;29171:12;29137:63;:::i;:::-;29046:164;29290:4;29283:5;29279:16;29273:23;29309:63;29366:4;29361:3;29357:14;29343:12;29309:63;:::i;:::-;29220:162;29466:4;29459:5;29455:16;29449:23;29485:57;29536:4;29531:3;29527:14;29513:12;29485:57;:::i;:::-;29392:160;29000:559;28900:659;;:::o;29565:267::-;29678:10;29699:90;29785:3;29777:6;29699:90;:::i;:::-;29821:4;29816:3;29812:14;29798:28;;29565:267;;;;:::o;29838:135::-;29930:4;29962;29957:3;29953:14;29945:22;;29838:135;;;:::o;30035:908::-;30198:3;30227:76;30297:5;30227:76;:::i;:::-;30319:108;30420:6;30415:3;30319:108;:::i;:::-;30312:115;;30451:78;30523:5;30451:78;:::i;:::-;30552:7;30583:1;30568:350;30593:6;30590:1;30587:13;30568:350;;;30669:6;30663:13;30696:107;30799:3;30784:13;30696:107;:::i;:::-;30689:114;;30826:82;30901:6;30826:82;:::i;:::-;30816:92;;30628:290;30615:1;30612;30608:9;30603:14;;30568:350;;;30572:14;30934:3;30927:10;;30203:740;;;30035:908;;;;:::o;30949:903::-;31248:4;31286:3;31275:9;31271:19;31263:27;;31300:71;31368:1;31357:9;31353:17;31344:6;31300:71;:::i;:::-;31381:72;31449:2;31438:9;31434:18;31425:6;31381:72;:::i;:::-;31500:9;31494:4;31490:20;31485:2;31474:9;31470:18;31463:48;31528:152;31675:4;31666:6;31528:152;:::i;:::-;31520:160;;31690:72;31758:2;31747:9;31743:18;31734:6;31690:72;:::i;:::-;31772:73;31840:3;31829:9;31825:19;31816:6;31772:73;:::i;:::-;30949:903;;;;;;;;:::o;31875:732::-;31982:5;32007:81;32023:64;32080:6;32023:64;:::i;:::-;32007:81;:::i;:::-;31998:90;;32108:5;32137:6;32130:5;32123:21;32171:4;32164:5;32160:16;32153:23;;32224:4;32216:6;32212:17;32204:6;32200:30;32253:3;32245:6;32242:15;32239:122;;;32272:79;;:::i;:::-;32239:122;32387:6;32370:231;32404:6;32399:3;32396:15;32370:231;;;32479:3;32508:48;32552:3;32540:10;32508:48;:::i;:::-;32503:3;32496:61;32586:4;32581:3;32577:14;32570:21;;32446:155;32430:4;32425:3;32421:14;32414:21;;32370:231;;;32374:21;31988:619;;31875:732;;;;;:::o;32630:385::-;32712:5;32761:3;32754:4;32746:6;32742:17;32738:27;32728:122;;32769:79;;:::i;:::-;32728:122;32879:6;32873:13;32904:105;33005:3;32997:6;32990:4;32982:6;32978:17;32904:105;:::i;:::-;32895:114;;32718:297;32630:385;;;;:::o;33021:554::-;33116:6;33165:2;33153:9;33144:7;33140:23;33136:32;33133:119;;;33171:79;;:::i;:::-;33133:119;33312:1;33301:9;33297:17;33291:24;33342:18;33334:6;33331:30;33328:117;;;33364:79;;:::i;:::-;33328:117;33469:89;33550:7;33541:6;33530:9;33526:22;33469:89;:::i;:::-;33459:99;;33262:306;33021:554;;;;:::o;33581:332::-;33702:4;33740:2;33729:9;33725:18;33717:26;;33753:71;33821:1;33810:9;33806:17;33797:6;33753:71;:::i;:::-;33834:72;33902:2;33891:9;33887:18;33878:6;33834:72;:::i;:::-;33581:332;;;;;:::o;33919:442::-;34068:4;34106:2;34095:9;34091:18;34083:26;;34119:71;34187:1;34176:9;34172:17;34163:6;34119:71;:::i;:::-;34200:72;34268:2;34257:9;34253:18;34244:6;34200:72;:::i;:::-;34282;34350:2;34339:9;34335:18;34326:6;34282:72;:::i;:::-;33919:442;;;;;;:::o;34367:::-;34516:4;34554:2;34543:9;34539:18;34531:26;;34567:71;34635:1;34624:9;34620:17;34611:6;34567:71;:::i;:::-;34648:72;34716:2;34705:9;34701:18;34692:6;34648:72;:::i;:::-;34730;34798:2;34787:9;34783:18;34774:6;34730:72;:::i;:::-;34367:442;;;;;;:::o;34815:114::-;34882:6;34916:5;34910:12;34900:22;;34815:114;;;:::o;34935:184::-;35034:11;35068:6;35063:3;35056:19;35108:4;35103:3;35099:14;35084:29;;34935:184;;;;:::o;35125:132::-;35192:4;35215:3;35207:11;;35245:4;35240:3;35236:14;35228:22;;35125:132;;;:::o;35263:179::-;35332:10;35353:46;35395:3;35387:6;35353:46;:::i;:::-;35431:4;35426:3;35422:14;35408:28;;35263:179;;;;:::o;35448:113::-;35518:4;35550;35545:3;35541:14;35533:22;;35448:113;;;:::o;35597:732::-;35716:3;35745:54;35793:5;35745:54;:::i;:::-;35815:86;35894:6;35889:3;35815:86;:::i;:::-;35808:93;;35925:56;35975:5;35925:56;:::i;:::-;36004:7;36035:1;36020:284;36045:6;36042:1;36039:13;36020:284;;;36121:6;36115:13;36148:63;36207:3;36192:13;36148:63;:::i;:::-;36141:70;;36234:60;36287:6;36234:60;:::i;:::-;36224:70;;36080:224;36067:1;36064;36060:9;36055:14;;36020:284;;;36024:14;36320:3;36313:10;;35721:608;;;35597:732;;;;:::o;36335:114::-;36402:6;36436:5;36430:12;36420:22;;36335:114;;;:::o;36455:184::-;36554:11;36588:6;36583:3;36576:19;36628:4;36623:3;36619:14;36604:29;;36455:184;;;;:::o;36645:132::-;36712:4;36735:3;36727:11;;36765:4;36760:3;36756:14;36748:22;;36645:132;;;:::o;36783:108::-;36860:24;36878:5;36860:24;:::i;:::-;36855:3;36848:37;36783:108;;:::o;36897:179::-;36966:10;36987:46;37029:3;37021:6;36987:46;:::i;:::-;37065:4;37060:3;37056:14;37042:28;;36897:179;;;;:::o;37082:113::-;37152:4;37184;37179:3;37175:14;37167:22;;37082:113;;;:::o;37231:732::-;37350:3;37379:54;37427:5;37379:54;:::i;:::-;37449:86;37528:6;37523:3;37449:86;:::i;:::-;37442:93;;37559:56;37609:5;37559:56;:::i;:::-;37638:7;37669:1;37654:284;37679:6;37676:1;37673:13;37654:284;;;37755:6;37749:13;37782:63;37841:3;37826:13;37782:63;:::i;:::-;37775:70;;37868:60;37921:6;37868:60;:::i;:::-;37858:70;;37714:224;37701:1;37698;37694:9;37689:14;;37654:284;;;37658:14;37954:3;37947:10;;37355:608;;;37231:732;;;;:::o;37969:168::-;38052:11;38086:6;38081:3;38074:19;38126:4;38121:3;38117:14;38102:29;;37969:168;;;;:::o;38143:373::-;38229:3;38257:38;38289:5;38257:38;:::i;:::-;38311:70;38374:6;38369:3;38311:70;:::i;:::-;38304:77;;38390:65;38448:6;38443:3;38436:4;38429:5;38425:16;38390:65;:::i;:::-;38480:29;38502:6;38480:29;:::i;:::-;38475:3;38471:39;38464:46;;38233:283;38143:373;;;;:::o;38522:942::-;38817:4;38855:3;38844:9;38840:19;38832:27;;38869:71;38937:1;38926:9;38922:17;38913:6;38869:71;:::i;:::-;38987:9;38981:4;38977:20;38972:2;38961:9;38957:18;38950:48;39015:108;39118:4;39109:6;39015:108;:::i;:::-;39007:116;;39170:9;39164:4;39160:20;39155:2;39144:9;39140:18;39133:48;39198:108;39301:4;39292:6;39198:108;:::i;:::-;39190:116;;39353:9;39347:4;39343:20;39338:2;39327:9;39323:18;39316:48;39381:76;39452:4;39443:6;39381:76;:::i;:::-;39373:84;;38522:942;;;;;;;:::o
Swarm Source
ipfs://1006d70f7b10fca78c44d44a94a6a3c33d3e3f8ce7a7a9a3b5971b42a715c177
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.