Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 118 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest | 11119885 | 1874 days ago | IN | 0 ETH | 0.00868695 | ||||
| Re Balance | 11119877 | 1874 days ago | IN | 0 ETH | 0.00448275 | ||||
| Re Balance | 11116673 | 1874 days ago | IN | 0 ETH | 0.00338529 | ||||
| Harvest | 11111126 | 1875 days ago | IN | 0 ETH | 0.01038726 | ||||
| Re Balance | 11110195 | 1875 days ago | IN | 0 ETH | 0.0067498 | ||||
| Harvest | 11097020 | 1877 days ago | IN | 0 ETH | 0.01614754 | ||||
| Harvest | 11086284 | 1879 days ago | IN | 0 ETH | 0.0051062 | ||||
| Re Balance | 11079064 | 1880 days ago | IN | 0 ETH | 0.00072063 | ||||
| Re Balance | 11078121 | 1880 days ago | IN | 0 ETH | 0.00063141 | ||||
| Re Balance | 11076315 | 1880 days ago | IN | 0 ETH | 0.00058337 | ||||
| Harvest | 11075992 | 1880 days ago | IN | 0 ETH | 0.00121444 | ||||
| Harvest | 11075992 | 1880 days ago | IN | 0 ETH | 0.00109299 | ||||
| Harvest | 11075992 | 1880 days ago | IN | 0 ETH | 0.00495156 | ||||
| Re Balance | 11075693 | 1881 days ago | IN | 0 ETH | 0.00064548 | ||||
| Re Balance | 11075395 | 1881 days ago | IN | 0 ETH | 0.00376144 | ||||
| Re Balance | 11074669 | 1881 days ago | IN | 0 ETH | 0.00065543 | ||||
| Re Balance | 11074669 | 1881 days ago | IN | 0 ETH | 0.00065543 | ||||
| Re Balance | 11073836 | 1881 days ago | IN | 0 ETH | 0.00099516 | ||||
| Harvest | 11073720 | 1881 days ago | IN | 0 ETH | 0.0053902 | ||||
| Harvest | 11072103 | 1881 days ago | IN | 0 ETH | 0.00788412 | ||||
| Re Balance | 11071245 | 1881 days ago | IN | 0 ETH | 0.00181874 | ||||
| Re Balance | 11069813 | 1881 days ago | IN | 0 ETH | 0.00067945 | ||||
| Re Balance | 11067159 | 1882 days ago | IN | 0 ETH | 0.00546452 | ||||
| Re Balance | 11067155 | 1882 days ago | IN | 0 ETH | 0.00657239 | ||||
| Re Balance | 11066764 | 1882 days ago | IN | 0 ETH | 0.01069065 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SashimiInvestment
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-09-28
*/
// Copyright (c) 2020 SashimiProject. All rights reserved.
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity ^0.6.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 GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.6.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
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 () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: contracts/interfaces/ISashimiVault.sol
pragma solidity 0.6.12;
interface ISashimiVault {
function token() view external returns (address) ;
function profit() view external returns (address);
function lend() view external returns (address);
function controller() view external returns (address);
function deposit(uint256) external;
function depositAll() external;
function withdraw(uint256) external;
function withdrawAll() external returns (uint256 amount);
function harvest() external returns (uint256); // returns profit amount
function earned() view external returns(uint256);
function transfer(address tokenAddress, address receipt, uint256 amount) external;
function transferETH(address receipt, uint256 amount) external;
function executeTransaction(address target, uint value, string memory signature, bytes memory data) payable external;
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.6.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/vaults/SashimiVault.sol
pragma solidity 0.6.12;
abstract contract SashimiVault is ISashimiVault, Ownable {
using SafeERC20 for IERC20;
using SafeMath for uint256;
modifier onlyController{
require(msg.sender == controller, "Not controller.");
_;
}
address override public controller;
address override public token;
address override public profit;
address override public lend;
event TokenTransferred(address, address, uint256);
event ETHTransferred(address, uint256);
event Executed(address, uint, string, bytes);
function transfer(address _token, address _receipt, uint256 _amount) override onlyController public {
IERC20(token).transfer(_receipt, _amount);
emit TokenTransferred(address(_token), _receipt, _amount);
}
function transferETH(address _receipt, uint256 _amount) override onlyController public {
payable(_receipt).transfer(_amount);
emit ETHTransferred(_receipt, _amount);
}
function executeTransaction(address target, uint value, string memory signature, bytes memory data) override public payable onlyController{
bytes memory callData;
if (bytes(signature).length == 0) {
callData = data;
} else {
callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
}
(bool success, ) = target.call{value:value}(callData);
require(success, "Execution failed.");
emit Executed(target, value, signature, data);
}
function emergenceChangeLend(address _lend) public onlyController{
lend = _lend;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of 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 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* 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 returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), 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};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is 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:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, 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
*
* - `to` 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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(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);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(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 Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @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 to 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 { }
}
// File: contracts/interfaces/ISashimiInvestment.sol
pragma solidity 0.6.12;
interface ISashimiInvestment {
function withdraw(address token, uint256 amount) external;
function withdrawWithReBalance(address token, uint256 amount) external;
}
// File: contracts/interfaces/IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function take(
address token,
uint amount
) external;
function getTokenInPair(address pair, address token) external view returns (uint balance);
}
// File: contracts/SashimiInvestment.sol
pragma solidity 0.6.12;
contract SashimiInvestment is ISashimiInvestment, Ownable {
using SafeERC20 for IERC20;
using SafeMath for uint256;
event AdminAdded(address admin);
event AdminRemoved(address admin);
event ProviderAdded(address indexed token, address provider, uint256 providerId);
event ProviderSwitched(address indexed token, address provider, uint256 providerId);
event ReservesRatiosChanged(address indexed token, uint256 reservesRatio);
event ProviderDisabled(uint256 providerId);
event ProviderEnabled(uint256 providerId);
event ReBalancedReserves(address);
event Harvested(address, address, uint256, uint256);
address public router; // swap router
address public routerForSashimi; // router for sashimi
address public sashimi; // sashimi token
address public wETH; // weth address
mapping(address => bool) public isAdmin; // multi admins can chose providers
address public beneficiary1; // 75% sashimi goes to
address public beneficiary2; // 25% sashimi goes to
bool public frozen;
struct Provider {
address vault;
address token;
bool enable;
uint256 accProfit;
}
mapping(address => uint256) public deposits; // token => deposit amount
mapping(address => uint256) public reservesRatios; // token => ratio
mapping(address => uint256) public chosenProviders; // token => providerId
uint256 public constant MAXIMAL_RATIO = 10000;
uint256 public constant MINIMAL_RATIO = 1;
uint256 public constant TOTAL_RATIO_SHARES = 10000;
Provider[] public providers;
modifier onlyRouter(){
require(
msg.sender == router,
"Not router."
);
_;
}
modifier onlyAdmin(){
require(
isAdmin[msg.sender],
"Not admin."
);
_;
}
modifier validRatio(uint256 _reservesRatio){
require(_reservesRatio >= MINIMAL_RATIO, "Invalid ratio.");
require(_reservesRatio <= MAXIMAL_RATIO, "Invalid ratio.");
_;
}
modifier notFrozen() {
require(
!frozen, "FROZEN."
);
_;
}
constructor (address _router, address _routerForSashimi, address _sashimi, address _wETH, address _beneficiary1) public {
router = _router;
routerForSashimi = _routerForSashimi;
sashimi = _sashimi;
wETH = _wETH;
require(sashimi != wETH, "Invalid token input.");
frozen = true;
beneficiary1 = _beneficiary1;
beneficiary2 = address(0xdead);
// owner is also admin
isAdmin[msg.sender] = true;
// offset occupy
providers.push(Provider({
vault : address(0),
token : address(0),
enable : false,
accProfit: 0
}));
}
function reBalance(address _token) notFrozen public {
uint256 providerId = chosenProviders[_token];
require(providerId > 0, "Provider not chosen.");
Provider memory provider = providers[providerId];
uint256 reservesRatio = reservesRatios[_token];
require(reservesRatio > 0, "ReservesRatios not exists.");
uint256 beforeReserves = IERC20(_token).balanceOf(router);
uint256 beforeDepositAmount = deposits[_token];
uint256 afterReserves = (beforeReserves.add(beforeDepositAmount)).div(TOTAL_RATIO_SHARES).mul(reservesRatio);
if (beforeReserves < afterReserves)
{
// more reserves needed
uint256 amount = afterReserves.sub(beforeReserves);
// withdraw
ISashimiVault(provider.vault).withdraw(amount);
// reserve to router
IERC20(_token).safeTransfer(router, amount);
deposits[_token] = beforeDepositAmount.sub(amount);
}
else if (beforeReserves > afterReserves)
{
// more deposit needed
uint256 amount = beforeReserves.sub(afterReserves);
IUniswapV2Router02(router).take(_token, amount);
// be careful transfer deflationary tokens
// approve and deposit
ISashimiVault(provider.vault).deposit(amount);
deposits[_token] = beforeDepositAmount.add(amount);
}
emit ReBalancedReserves(_token);
}
function harvest(address _token) notFrozen public returns (uint256 amount){
uint256 chosen = chosenProviders[_token];
require(chosen > 0, "Provider not chosen.");
Provider storage provider = providers[chosen];
amount = 0;
uint256 profitAmount = ISashimiVault(provider.vault).harvest();
if (profitAmount > 0)
{
address profit = ISashimiVault(provider.vault).profit();
provider.accProfit += profitAmount;
address[] memory path;
if (profit == wETH)
{
path = new address[](2);
path[0] = wETH;
path[1] = sashimi;
}
else {
path = new address[](3);
path[0] = profit;
path[1] = wETH;
path[2] = sashimi;
}
if (IERC20(profit).allowance(address(this), routerForSashimi) == 0)
IERC20(profit).safeApprove(routerForSashimi, type(uint256).max);
// swap for sashimi, 3s is enough for deadline
uint[] memory amounts = IUniswapV2Router01(routerForSashimi).swapExactTokensForTokens(profitAmount, 0, path, address(this), block.timestamp + 3);
amount = amounts[path.length - 1];
if (beneficiary1 != address(0))
IERC20(sashimi).safeTransfer(beneficiary1, amount.mul(75).div(100));
if (beneficiary2 != address(0))
IERC20(sashimi).safeTransfer(beneficiary2, amount.mul(25).div(100));
emit Harvested(_token, profit, profitAmount, amount);
}
}
function withdraw(address _token, uint256 _amount) override onlyRouter notFrozen public {
uint256 depositAmount = deposits[_token];
require(depositAmount > _amount, "Deposit not enough.");
uint256 providerId = chosenProviders[_token];
//should be fine
require(providerId > 0, "Provider not chosen.");
Provider storage provider = providers[providerId];
ISashimiVault(provider.vault).withdraw(_amount);
IERC20(_token).safeTransfer(router, _amount);
deposits[_token] = depositAmount.sub(_amount);
}
function withdrawWithReBalance(address _token, uint256 _amount) override onlyRouter notFrozen public{
// reBalance
reBalance(_token);
uint256 depositAmount = deposits[_token];
uint256 withdrawAmount = depositAmount > _amount ? _amount : depositAmount;
withdraw(_token, withdrawAmount);
}
function disableProvider(uint256 _providerId) onlyOwner public {
require(_providerId < providers.length, "Provider not exists.");
Provider storage pro = providers[_providerId];
require(pro.enable, "Provider already disabled.");
pro.enable = false;
emit ProviderDisabled(_providerId);
}
function enableProvider(uint256 _providerId) onlyOwner public {
require(_providerId < providers.length, "Provider not exists.");
Provider storage pro = providers[_providerId];
require(!pro.enable, "Provider already enabled.");
pro.enable = true;
emit ProviderEnabled(_providerId);
}
function addProvider(address _token, address _vault) onlyOwner public returns (uint256) {
providers.push(Provider({
vault : _vault,
token : _token,
enable : true,
accProfit: 0
}));
require(ISashimiVault(_vault).controller() == address (this), "Controller not matched.");
require(ISashimiVault(_vault).token() == _token, "Controller not matched.");
uint256 providerId = providers.length.sub(1);
emit ProviderAdded(_token, _vault, providerId);
return providerId;
}
function chooseProvider(address _token, uint256 _providerId) onlyAdmin public {
require(_providerId < providers.length, "Provider not added.");
Provider storage provider = providers[_providerId];
require(provider.token == _token, "Token not matched.");
require(provider.enable, "Provider disabled.");
uint256 chosen = chosenProviders[_token];
require(chosen != _providerId, "Provider already chosen.");
// be careful max is enough
if (IERC20(ISashimiVault(provider.vault).profit()).allowance(address(this), routerForSashimi) == 0)
IERC20(ISashimiVault(provider.vault).profit()).safeApprove(routerForSashimi, type(uint256).max);
if (IERC20(provider.token).allowance(address(this), provider.vault) == 0)
IERC20(provider.token).safeApprove(provider.vault, type(uint256).max);
if (chosen != 0) {
// old provider exists and need harvest
harvest(_token);
Provider storage oldProvider = providers[chosen];
// deposit on new
uint256 withdrawAmount = ISashimiVault(oldProvider.vault).withdrawAll();
uint256 depositAmount = deposits[_token];
require(withdrawAmount >= depositAmount, "Insufficient withdraw amount.");
ISashimiVault(provider.vault).deposit(depositAmount);
}
chosenProviders[_token] = _providerId;
emit ProviderSwitched(_token, provider.vault, _providerId);
}
function changeReservesRatio(address _token, uint256 _reservesRatio) onlyOwner validRatio(_reservesRatio) public {
reservesRatios[_token] = _reservesRatio;
emit ReservesRatiosChanged(_token, _reservesRatio);
}
function addAdmin(address _admin) onlyOwner public {
isAdmin[_admin] = true;
emit AdminAdded(_admin);
}
function removeAdmin(address _admin) onlyOwner public {
isAdmin[_admin] = false;
emit AdminRemoved(_admin);
}
function changeBeneficiary1(address _beneficiary1) onlyOwner public {
beneficiary1 = _beneficiary1;
}
function changeRouter(address _router) onlyOwner public {
router = _router;
}
function changeSashimiRouter(address _sashimiRouter) onlyOwner public {
routerForSashimi = _sashimiRouter;
}
function changeBeneficiary2(address _beneficiary2) onlyOwner public {
beneficiary2 = _beneficiary2;
}
function start() onlyOwner public {
frozen = false;
}
function emergencePause() onlyAdmin public {
frozen = true;
}
// for token cannot withdraw with harvest
function emergenceWithdraw(address _token, uint256 providerId, uint256 _amount, address _to) onlyOwner public{
Provider memory provider = providers[providerId];
ISashimiVault(provider.vault).transfer(_token, _to, _amount);
}
// for token cannot withdraw with harvest
function emergenceWithdrawETH(uint256 providerId, uint256 _amount, address _to) onlyOwner public{
Provider memory provider = providers[providerId];
ISashimiVault(provider.vault).transferETH(_to, _amount);
}
function emergenceTriggerProvider(uint256 providerId, address target, uint value, string memory signature, bytes memory data) onlyOwner public{
Provider memory provider = providers[providerId];
ISashimiVault(provider.vault).executeTransaction(target, value, signature, data);
}
function emergenceTrigger(address target, string memory signature, bytes memory data) onlyOwner public{
bytes memory callData;
if (bytes(signature).length == 0) {
callData = data;
} else {
callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
}
(bool success, ) = target.call(callData);
require(success, "EmergenceTrigger execution failed.");
}
function emergenceChangeProviderLend(uint256 providerId, address _lend) onlyOwner public{
Provider memory provider = providers[providerId];
SashimiVault(provider.vault).emergenceChangeLend(_lend);
}
function earned(address _token) view public returns(address profit, uint256 amount){
uint256 providerId = chosenProviders[_token];
Provider memory provider = providers[providerId];
profit = ISashimiVault(provider.vault).profit();
amount = ISashimiVault(provider.vault).earned();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_routerForSashimi","type":"address"},{"internalType":"address","name":"_sashimi","type":"address"},{"internalType":"address","name":"_wETH","type":"address"},{"internalType":"address","name":"_beneficiary1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"providerId","type":"uint256"}],"name":"ProviderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"providerId","type":"uint256"}],"name":"ProviderDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"providerId","type":"uint256"}],"name":"ProviderEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"providerId","type":"uint256"}],"name":"ProviderSwitched","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"ReBalancedReserves","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"ReservesRatiosChanged","type":"event"},{"inputs":[],"name":"MAXIMAL_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMAL_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_RATIO_SHARES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"name":"addProvider","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beneficiary1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary1","type":"address"}],"name":"changeBeneficiary1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary2","type":"address"}],"name":"changeBeneficiary2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_reservesRatio","type":"uint256"}],"name":"changeReservesRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"changeRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sashimiRouter","type":"address"}],"name":"changeSashimiRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_providerId","type":"uint256"}],"name":"chooseProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chosenProviders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_providerId","type":"uint256"}],"name":"disableProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"earned","outputs":[{"internalType":"address","name":"profit","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"address","name":"_lend","type":"address"}],"name":"emergenceChangeProviderLend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emergenceTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emergenceTriggerProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"emergenceWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"providerId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"emergenceWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_providerId","type":"uint256"}],"name":"enableProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"providers","outputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"uint256","name":"accProfit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"reBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reservesRatios","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerForSashimi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sashimi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawWithReBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162003d9338038062003d93833981810160405260a08110156200003757600080fd5b5080516020820151604083015160608401516080909401519293919290919060006200006262000280565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b038088166001600160a01b03199283161790925560028054878416908316179055600380548684169083161790819055600480548685169316929092179182905582169116141562000150576040805162461bcd60e51b815260206004820152601460248201527f496e76616c696420746f6b656e20696e7075742e000000000000000000000000604482015290519081900360640190fd5b60078054600680546001600160a01b039485166001600160a01b03199182161790915560ff60a01b19918216600160a01b908117821661dead17909355336000908152600560209081526040808320805460ff19166001908117909155815160808101835284815292830184815291830184815260608401858152600b80549384018155909552925160039091027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db981018054928a169287169290921790915590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba82018054935115159097029716919093161790921693909317909155517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155506200028492505050565b3390565b613aff80620002946000396000f3fe608060405234801561001057600080fd5b50600436106102525760003560e01c80636e54c66411610146578063be9a6555116100c3578063f2fde38b11610087578063f2fde38b14610903578063f3f2f0bc14610929578063f3fef3a314610931578063f4b04e0f1461095d578063f887ea4014610989578063fc7e286d1461099157610252565b8063be9a655514610762578063ccc6461b1461076a578063e403d411146108af578063ec488789146108d5578063f2428621146108fb57610252565b80638da5cb5b1161010a5780638da5cb5b146106bd5780639755f5be146106c55780639b138599146106f35780639d1cf4221461071f578063ad0b8b9d1461074557610252565b80636e54c6641461061a5780637048027514610637578063715018a61461065d5780637adea6bf1461066557806386889a5b1461069757610252565b8063340ac20f116101d457806343e1e2761161019857806343e1e2761461045c5780634f52ccfa1461059557806350f3fc811461059d578063679307ed146105ec5780636acfc074146105f457610252565b8063340ac20f146103c857806339535304146103ee5780633992f7251461041a5780633f1f3e59146104545780634140c93f1461036c57610252565b80631785f53c1161021b5780631785f53c146103465780631a058bca1461036c57806324b81cdf1461037457806324d7806c1461037c5780632d829c8f146103a257610252565b80628cc26214610257578063054f7d9c146102a05780630e5c011e146102bc5780630e83fed5146102f45780631268754f14610318575b600080fd5b61027d6004803603602081101561026d57600080fd5b50356001600160a01b03166109b7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102a8610b18565b604080519115158252519081900360200190f35b6102e2600480360360208110156102d257600080fd5b50356001600160a01b0316610b28565b60408051918252519081900360200190f35b6102fc61116d565b604080516001600160a01b039092168252519081900360200190f35b6103446004803603604081101561032e57600080fd5b506001600160a01b03813516906020013561117c565b005b6103446004803603602081101561035c57600080fd5b50356001600160a01b0316611256565b6102e2611306565b6102e261130c565b6102a86004803603602081101561039257600080fd5b50356001600160a01b0316611311565b610344600480360360208110156103b857600080fd5b50356001600160a01b0316611326565b610344600480360360208110156103de57600080fd5b50356001600160a01b0316611760565b6103446004803603604081101561040457600080fd5b506001600160a01b0381351690602001356117da565b6103446004803603608081101561043057600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611db7565b610344611ee6565b6103446004803603606081101561047257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561049c57600080fd5b8201836020820111156104ae57600080fd5b803590602001918460018302840111600160201b831117156104cf57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561052157600080fd5b82018360208201111561053357600080fd5b803590602001918460018302840111600160201b8311171561055457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f4c945050505050565b6102fc612124565b6105ba600480360360208110156105b357600080fd5b5035612133565b604080516001600160a01b03958616815293909416602084015290151582840152606082015290519081900360800190f35b6102fc61217c565b6102e26004803603602081101561060a57600080fd5b50356001600160a01b031661218b565b6103446004803603602081101561063057600080fd5b503561219d565b6103446004803603602081101561064d57600080fd5b50356001600160a01b0316612311565b6103446123c4565b6103446004803603606081101561067b57600080fd5b50803590602081013590604001356001600160a01b0316612466565b610344600480360360208110156106ad57600080fd5b50356001600160a01b031661258c565b6102fc612606565b6102e2600480360360408110156106db57600080fd5b506001600160a01b0381358116916020013516612615565b6103446004803603604081101561070957600080fd5b506001600160a01b038135169060200135612947565b6103446004803603602081101561073557600080fd5b50356001600160a01b0316612a84565b6103446004803603602081101561075b57600080fd5b5035612afe565b610344612c6b565b610344600480360360a081101561078057600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561083b57600080fd5b82018360208201111561084d57600080fd5b803590602001918460018302840111600160201b8311171561086e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612cd2945050505050565b6102e2600480360360208110156108c557600080fd5b50356001600160a01b0316612ed4565b610344600480360360208110156108eb57600080fd5b50356001600160a01b0316612ee6565b6102fc612f60565b6103446004803603602081101561091957600080fd5b50356001600160a01b0316612f6f565b6102fc613067565b6103446004803603604081101561094757600080fd5b506001600160a01b038135169060200135613076565b6103446004803603604081101561097357600080fd5b50803590602001356001600160a01b0316613297565b6102fc6133b5565b6102e2600480360360208110156109a757600080fd5b50356001600160a01b03166133c4565b6001600160a01b0381166000908152600a602052604081205481906109da6139b9565b600b82815481106109e757fe5b60009182526020918290206040805160808101825260039390930290910180546001600160a01b03908116808552600183015491821685870152600160a01b90910460ff16151584840152600290910154606084015281516366d16cc360e01b81529151929450926366d16cc392600480840193829003018186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d6020811015610a9957600080fd5b5051815160408051636b78c93160e11b815290519296506001600160a01b039091169163d6f1926291600480820192602092909190829003018186803b158015610ae257600080fd5b505afa158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b50519395939450505050565b600754600160a01b900460ff1681565b600754600090600160a01b900460ff1615610b74576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205480610bd6576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6000600b8281548110610be557fe5b906000526020600020906003020190506000925060008160000160009054906101000a90046001600160a01b03166001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c4d57600080fd5b505af1158015610c61573d6000803e3d6000fd5b505050506040513d6020811015610c7757600080fd5b505190508015611165578154604080516366d16cc360e01b815290516000926001600160a01b0316916366d16cc3916004808301926020929190829003018186803b158015610cc557600080fd5b505afa158015610cd9573d6000803e3d6000fd5b505050506040513d6020811015610cef57600080fd5b5051600284018054840190556004549091506060906001600160a01b0380841691161415610da1576040805160028082526060820183529091602083019080368337505060045482519293506001600160a01b031691839150600090610d5157fe5b6001600160a01b039283166020918202929092010152600354825191169082906001908110610d7c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610e47565b6040805160038082526080820190925290602082016060803683370190505090508181600081518110610dd057fe5b6001600160a01b039283166020918202929092010152600454825191169082906001908110610dfb57fe5b6001600160a01b039283166020918202929092010152600354825191169082906002908110610e2657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60025460408051636eb1769f60e11b81523060048201526001600160a01b03928316602482015290519184169163dd62ed3e91604480820192602092909190829003018186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d6020811015610ec457600080fd5b5051610ee657600254610ee6906001600160a01b0384811691166000196133d6565b6060600260009054906101000a90046001600160a01b03166001600160a01b03166338ed17398560008530426003016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610f85578181015183820152602001610f6d565b505050509050019650505050505050600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610feb57600080fd5b8101908080516040519392919084600160201b82111561100a57600080fd5b90830190602082018581111561101f57600080fd5b82518660208202830111600160201b8211171561103b57600080fd5b82525081516020918201928201910280838360005b83811015611068578181015183820152602001611050565b5050505090500160405250505090508060018351038151811061108757fe5b60209081029190910101516006549097506001600160a01b0316156110df576006546110df906001600160a01b03166110cc60646110c68b604b6134ee565b9061354e565b6003546001600160a01b03169190613590565b6007546001600160a01b03161561111057600754611110906001600160a01b03166110cc60646110c68b60196134ee565b604080516001600160a01b03808b168252851660208201528082018690526060810189905290517fc5ca8fc2af130d27971637eec9f6085b5535bf62d406885bbb132e17b1c9964c9181900360800190a15050505b505050919050565b6002546001600160a01b031681565b6001546001600160a01b031633146111c9576040805162461bcd60e51b815260206004820152600b60248201526a2737ba103937baba32b91760a91b604482015290519081900360640190fd5b600754600160a01b900460ff1615611212576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b61121b82611326565b6001600160a01b038216600090815260086020526040812054908282116112425781611244565b825b90506112508482613076565b50505050565b61125e6135e2565b6000546001600160a01b039081169116146112ae576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b61271081565b600181565b60056020526000908152604090205460ff1681565b600754600160a01b900460ff161561136f576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040902054806113d1576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6113d96139b9565b600b82815481106113e657fe5b6000918252602080832060408051608081018252600390940290910180546001600160a01b03908116855260018201548082168686015260ff600160a01b909104161515858401526002909101546060850152871684526009909152909120549091508061149b576040805162461bcd60e51b815260206004820152601a60248201527f5265736572766573526174696f73206e6f74206578697374732e000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b81526001600160a01b03928316600482015290516000928716916370a08231916024808301926020929190829003018186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d602081101561151357600080fd5b50516001600160a01b03861660009081526008602052604081205491925061154b846115456127106110c687876135e6565b906134ee565b9050808310156116085760006115618285613640565b905085600001516001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115ad57600080fd5b505af11580156115c1573d6000803e3d6000fd5b50506001546115df92506001600160a01b038b811692501683613590565b6115e98382613640565b6001600160a01b0389166000908152600860205260409020555061171b565b8083111561171b57600061161c8483613640565b60015460408051630a43004160e31b81526001600160a01b038c8116600483015260248201859052915193945091169163521802089160448082019260009290919082900301818387803b15801561167357600080fd5b505af1158015611687573d6000803e3d6000fd5b5050505085600001516001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050505061170081846135e690919063ffffffff16565b6001600160a01b038916600090815260086020526040902055505b604080516001600160a01b038916815290517f2d996eec1a258adebd9c1f9a9ffde58c855c550e10ed816d16c6d924d06df3159181900360200190a150505050505050565b6117686135e2565b6000546001600160a01b039081169116146117b8576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604090205460ff1661182b576040805162461bcd60e51b815260206004820152600a6024820152692737ba1030b236b4b71760b11b604482015290519081900360640190fd5b600b548110611877576040805162461bcd60e51b8152602060048201526013602482015272283937bb34b232b9103737ba1030b23232b21760691b604482015290519081900360640190fd5b6000600b828154811061188657fe5b6000918252602090912060039091020160018101549091506001600160a01b038481169116146118f2576040805162461bcd60e51b81526020600482015260126024820152712a37b5b2b7103737ba1036b0ba31b432b21760711b604482015290519081900360640190fd5b6001810154600160a01b900460ff16611947576040805162461bcd60e51b8152602060048201526012602482015271283937bb34b232b9103234b9b0b13632b21760711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a6020526040902054828114156119b5576040805162461bcd60e51b815260206004820152601860248201527f50726f766964657220616c72656164792063686f73656e2e0000000000000000604482015290519081900360640190fd5b8154604080516366d16cc360e01b815290516001600160a01b03909216916366d16cc391600480820192602092909190829003018186803b1580156119f957600080fd5b505afa158015611a0d573d6000803e3d6000fd5b505050506040513d6020811015611a2357600080fd5b505160025460408051636eb1769f60e11b81523060048201526001600160a01b0392831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b158015611a7857600080fd5b505afa158015611a8c573d6000803e3d6000fd5b505050506040513d6020811015611aa257600080fd5b5051611b36576002548254604080516366d16cc360e01b81529051611b36936001600160a01b0390811693600019939116916366d16cc391600480820192602092909190829003018186803b158015611afa57600080fd5b505afa158015611b0e573d6000803e3d6000fd5b505050506040513d6020811015611b2457600080fd5b50516001600160a01b031691906133d6565b6001820154825460408051636eb1769f60e11b81523060048201526001600160a01b0392831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b158015611b8d57600080fd5b505afa158015611ba1573d6000803e3d6000fd5b505050506040513d6020811015611bb757600080fd5b5051611bdd5781546001830154611bdd916001600160a01b0391821691166000196133d6565b8015611d5557611bec84610b28565b506000600b8281548110611bfc57fe5b60009182526020808320600390920290910180546040805163429c145b60e11b815290519295506001600160a01b039091169263853828b69260048084019382900301818787803b158015611c5057600080fd5b505af1158015611c64573d6000803e3d6000fd5b505050506040513d6020811015611c7a57600080fd5b50516001600160a01b03871660009081526008602052604090205490915080821015611ced576040805162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776974686472617720616d6f756e742e000000604482015290519081900360640190fd5b84546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b158015611d3957600080fd5b505af1158015611d4d573d6000803e3d6000fd5b505050505050505b6001600160a01b038085166000818152600a602090815260409182902087905585548251941684528301869052805191927fac81d0962e006dff42fdf4b06763b55b883e007b85c34d6ee6200c8311f00a1c929081900390910190a250505050565b611dbf6135e2565b6000546001600160a01b03908116911614611e0f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b611e176139b9565b600b8481548110611e2457fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff16151585840152600290910154606085015281516317d5759960e31b81528a821660048201529087166024820152604481018890529051929450909263beabacc89260648084019382900301818387803b158015611ec757600080fd5b505af1158015611edb573d6000803e3d6000fd5b505050505050505050565b3360009081526005602052604090205460ff16611f37576040805162461bcd60e51b815260206004820152600a6024820152692737ba1030b236b4b71760b11b604482015290519081900360640190fd5b6007805460ff60a01b1916600160a01b179055565b611f546135e2565b6000546001600160a01b03908116911614611fa4576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6060825160001415611fb757508061203a565b82805190602001208260405160200180836001600160e01b031916815260040182805190602001908083835b602083106120025780518252601f199092019160209182019101611fe3565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000846001600160a01b0316826040518082805190602001908083835b602083106120765780518252601f199092019160209182019101612057565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146120d8576040519150601f19603f3d011682016040523d82523d6000602084013e6120dd565b606091505b505090508061211d5760405162461bcd60e51b8152600401808060200182810382526022815260200180613a286022913960400191505060405180910390fd5b5050505050565b6006546001600160a01b031681565b600b818154811061214057fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935090821691600160a01b900460ff169084565b6003546001600160a01b031681565b600a6020526000908152604090205481565b6121a56135e2565b6000546001600160a01b039081169116146121f5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600b548110612242576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1032bc34b9ba399760611b604482015290519081900360640190fd5b6000600b828154811061225157fe5b906000526020600020906003020190508060010160149054906101000a900460ff16156122c5576040805162461bcd60e51b815260206004820152601960248201527f50726f766964657220616c726561647920656e61626c65642e00000000000000604482015290519081900360640190fd5b60018101805460ff60a01b1916600160a01b1790556040805183815290517f4037576c567bca2905d4a9000a516b7e286204d25e21adcc379d86e31456f8829181900360200190a15050565b6123196135e2565b6000546001600160a01b03908116911614612369576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6123cc6135e2565b6000546001600160a01b0390811691161461241c576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61246e6135e2565b6000546001600160a01b039081169116146124be576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6124c66139b9565b600b84815481106124d357fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff1615158584015260029091015460608501528151637b1a490960e01b815290871660048201526024810188905290519294509092637b1a49099260448084019382900301818387803b15801561256e57600080fd5b505af1158015612582573d6000803e3d6000fd5b5050505050505050565b6125946135e2565b6000546001600160a01b039081169116146125e4576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b600061261f6135e2565b6000546001600160a01b0390811691161461266f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b604080516080810182526001600160a01b0380851680835286821660208085019182526001858701818152600060608801818152600b80549485018155909152965160039092027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9810180549388166001600160a01b031994851617905593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8501805492511515600160a01b0260ff60a01b19929098169290931691909117169490941790935592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90930192909255825163f77c479160e01b81529251309363f77c4791926004808301939192829003018186803b15801561279457600080fd5b505afa1580156127a8573d6000803e3d6000fd5b505050506040513d60208110156127be57600080fd5b50516001600160a01b031614612815576040805162461bcd60e51b815260206004820152601760248201527621b7b73a3937b63632b9103737ba1036b0ba31b432b21760491b604482015290519081900360640190fd5b826001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d602081101561288257600080fd5b50516001600160a01b0316146128d9576040805162461bcd60e51b815260206004820152601760248201527621b7b73a3937b63632b9103737ba1036b0ba31b432b21760491b604482015290519081900360640190fd5b600b546000906128ea906001613640565b9050836001600160a01b03167fb58c1155ce603c11717c452373e5d304917add1c5612ed5a562e2a57b4392ae5848360405180836001600160a01b031681526020018281526020019250505060405180910390a290505b92915050565b61294f6135e2565b6000546001600160a01b0390811691161461299f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b8060018110156129e7576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103930ba34b79760911b604482015290519081900360640190fd5b612710811115612a2f576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103930ba34b79760911b604482015290519081900360640190fd5b6001600160a01b038316600081815260096020908152604091829020859055815185815291517f922e909b4dc383e7613763ba1887c7fb3254f36aa386915f61a28df6c25400ae9281900390910190a2505050565b612a8c6135e2565b6000546001600160a01b03908116911614612adc576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b612b066135e2565b6000546001600160a01b03908116911614612b56576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600b548110612ba3576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1032bc34b9ba399760611b604482015290519081900360640190fd5b6000600b8281548110612bb257fe5b906000526020600020906003020190508060010160149054906101000a900460ff16612c25576040805162461bcd60e51b815260206004820152601a60248201527f50726f766964657220616c72656164792064697361626c65642e000000000000604482015290519081900360640190fd5b60018101805460ff60a01b191690556040805183815290517f3d2932f53dea1d2ac13eb5e2486d828aa633d604fcf164056fe8b1adc71a13c89181900360200190a15050565b612c736135e2565b6000546001600160a01b03908116911614612cc3576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6007805460ff60a01b19169055565b612cda6135e2565b6000546001600160a01b03908116911614612d2a576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b612d326139b9565b600b8681548110612d3f57fe5b600091825260208083206040805160808082018352600390950290920180546001600160a01b0390811680855260018301548083168688015260ff600160a01b9091041615158585015260029092015460608501529151632224fa2560e01b8152918b1660048301908152602483018b9052604483019586528951608484015289519397509095632224fa25958c958c958c958c9594606482019360a49092019291880191908190849084905b83811015612e04578181015183820152602001612dec565b50505050905090810190601f168015612e315780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612e64578181015183820152602001612e4c565b50505050905090810190601f168015612e915780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015612eb457600080fd5b505af1158015612ec8573d6000803e3d6000fd5b50505050505050505050565b60096020526000908152604090205481565b612eee6135e2565b6000546001600160a01b03908116911614612f3e576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b612f776135e2565b6000546001600160a01b03908116911614612fc7576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b03811661300c5760405162461bcd60e51b81526004018080602001828103825260268152602001806139e16026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6001546001600160a01b031633146130c3576040805162461bcd60e51b815260206004820152600b60248201526a2737ba103937baba32b91760a91b604482015290519081900360640190fd5b600754600160a01b900460ff161561310c576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b03821660009081526008602052604090205481811161316f576040805162461bcd60e51b81526020600482015260136024820152722232b837b9b4ba103737ba1032b737bab3b41760691b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a6020526040902054806131d1576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6000600b82815481106131e057fe5b600091825260208220600390910201805460408051632e1a7d4d60e01b81526004810189905290519294506001600160a01b0390911692632e1a7d4d9260248084019382900301818387803b15801561323857600080fd5b505af115801561324c573d6000803e3d6000fd5b505060015461326a92506001600160a01b0388811692501686613590565b6132748385613640565b6001600160a01b0390951660009081526008602052604090209490945550505050565b61329f6135e2565b6000546001600160a01b039081169116146132ef576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6132f76139b9565b600b838154811061330457fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff161515858401526002909101546060850152815163307c5a4160e21b815290871660048201529051929450909263c1f169049260248084019382900301818387803b15801561339857600080fd5b505af11580156133ac573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031681565b60086020526000908152604090205481565b80158061345c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561342e57600080fd5b505afa158015613442573d6000803e3d6000fd5b505050506040513d602081101561345857600080fd5b5051155b6134975760405162461bcd60e51b8152600401808060200182810382526036815260200180613a946036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526134e9908490613682565b505050565b6000826134fd57506000612941565b8282028284828161350a57fe5b04146135475760405162461bcd60e51b8152600401808060200182810382526021815260200180613a076021913960400191505060405180910390fd5b9392505050565b600061354783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613733565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526134e9908490613682565b3390565b600082820183811015613547576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061354783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137d5565b60606136d7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661382f9092919063ffffffff16565b8051909150156134e9578080602001905160208110156136f657600080fd5b50516134e95760405162461bcd60e51b815260040180806020018281038252602a815260200180613a6a602a913960400191505060405180910390fd5b600081836137bf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561378457818101518382015260200161376c565b50505050905090810190601f1680156137b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137cb57fe5b0495945050505050565b600081848411156138275760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561378457818101518382015260200161376c565b505050900390565b606061383e8484600085613846565b949350505050565b6060613851856139b3565b6138a2576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106138e15780518252601f1990920191602091820191016138c2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613943576040519150601f19603f3d011682016040523d82523d6000602084013e613948565b606091505b5091509150811561395c57915061383e9050565b80511561396c5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561378457818101518382015260200161376c565b3b151590565b6040805160808101825260008082526020820181905291810182905260608101919091529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77456d657267656e63655472696767657220657865637574696f6e206661696c65642e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220d766f2f6ea0c6a613d410c8500ebf6863e585a48438cd87875972aa3bc19a38464736f6c634300060c0033000000000000000000000000e4fe6a45f354e845f954cddee6084603cedb94100000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c28e27870558cf22add83540d2126da2e4b464c2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006ed306dba10e6c6b20bba693892fac21f3b91977
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102525760003560e01c80636e54c66411610146578063be9a6555116100c3578063f2fde38b11610087578063f2fde38b14610903578063f3f2f0bc14610929578063f3fef3a314610931578063f4b04e0f1461095d578063f887ea4014610989578063fc7e286d1461099157610252565b8063be9a655514610762578063ccc6461b1461076a578063e403d411146108af578063ec488789146108d5578063f2428621146108fb57610252565b80638da5cb5b1161010a5780638da5cb5b146106bd5780639755f5be146106c55780639b138599146106f35780639d1cf4221461071f578063ad0b8b9d1461074557610252565b80636e54c6641461061a5780637048027514610637578063715018a61461065d5780637adea6bf1461066557806386889a5b1461069757610252565b8063340ac20f116101d457806343e1e2761161019857806343e1e2761461045c5780634f52ccfa1461059557806350f3fc811461059d578063679307ed146105ec5780636acfc074146105f457610252565b8063340ac20f146103c857806339535304146103ee5780633992f7251461041a5780633f1f3e59146104545780634140c93f1461036c57610252565b80631785f53c1161021b5780631785f53c146103465780631a058bca1461036c57806324b81cdf1461037457806324d7806c1461037c5780632d829c8f146103a257610252565b80628cc26214610257578063054f7d9c146102a05780630e5c011e146102bc5780630e83fed5146102f45780631268754f14610318575b600080fd5b61027d6004803603602081101561026d57600080fd5b50356001600160a01b03166109b7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102a8610b18565b604080519115158252519081900360200190f35b6102e2600480360360208110156102d257600080fd5b50356001600160a01b0316610b28565b60408051918252519081900360200190f35b6102fc61116d565b604080516001600160a01b039092168252519081900360200190f35b6103446004803603604081101561032e57600080fd5b506001600160a01b03813516906020013561117c565b005b6103446004803603602081101561035c57600080fd5b50356001600160a01b0316611256565b6102e2611306565b6102e261130c565b6102a86004803603602081101561039257600080fd5b50356001600160a01b0316611311565b610344600480360360208110156103b857600080fd5b50356001600160a01b0316611326565b610344600480360360208110156103de57600080fd5b50356001600160a01b0316611760565b6103446004803603604081101561040457600080fd5b506001600160a01b0381351690602001356117da565b6103446004803603608081101561043057600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611db7565b610344611ee6565b6103446004803603606081101561047257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561049c57600080fd5b8201836020820111156104ae57600080fd5b803590602001918460018302840111600160201b831117156104cf57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561052157600080fd5b82018360208201111561053357600080fd5b803590602001918460018302840111600160201b8311171561055457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f4c945050505050565b6102fc612124565b6105ba600480360360208110156105b357600080fd5b5035612133565b604080516001600160a01b03958616815293909416602084015290151582840152606082015290519081900360800190f35b6102fc61217c565b6102e26004803603602081101561060a57600080fd5b50356001600160a01b031661218b565b6103446004803603602081101561063057600080fd5b503561219d565b6103446004803603602081101561064d57600080fd5b50356001600160a01b0316612311565b6103446123c4565b6103446004803603606081101561067b57600080fd5b50803590602081013590604001356001600160a01b0316612466565b610344600480360360208110156106ad57600080fd5b50356001600160a01b031661258c565b6102fc612606565b6102e2600480360360408110156106db57600080fd5b506001600160a01b0381358116916020013516612615565b6103446004803603604081101561070957600080fd5b506001600160a01b038135169060200135612947565b6103446004803603602081101561073557600080fd5b50356001600160a01b0316612a84565b6103446004803603602081101561075b57600080fd5b5035612afe565b610344612c6b565b610344600480360360a081101561078057600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561083b57600080fd5b82018360208201111561084d57600080fd5b803590602001918460018302840111600160201b8311171561086e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612cd2945050505050565b6102e2600480360360208110156108c557600080fd5b50356001600160a01b0316612ed4565b610344600480360360208110156108eb57600080fd5b50356001600160a01b0316612ee6565b6102fc612f60565b6103446004803603602081101561091957600080fd5b50356001600160a01b0316612f6f565b6102fc613067565b6103446004803603604081101561094757600080fd5b506001600160a01b038135169060200135613076565b6103446004803603604081101561097357600080fd5b50803590602001356001600160a01b0316613297565b6102fc6133b5565b6102e2600480360360208110156109a757600080fd5b50356001600160a01b03166133c4565b6001600160a01b0381166000908152600a602052604081205481906109da6139b9565b600b82815481106109e757fe5b60009182526020918290206040805160808101825260039390930290910180546001600160a01b03908116808552600183015491821685870152600160a01b90910460ff16151584840152600290910154606084015281516366d16cc360e01b81529151929450926366d16cc392600480840193829003018186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d6020811015610a9957600080fd5b5051815160408051636b78c93160e11b815290519296506001600160a01b039091169163d6f1926291600480820192602092909190829003018186803b158015610ae257600080fd5b505afa158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b50519395939450505050565b600754600160a01b900460ff1681565b600754600090600160a01b900460ff1615610b74576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205480610bd6576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6000600b8281548110610be557fe5b906000526020600020906003020190506000925060008160000160009054906101000a90046001600160a01b03166001600160a01b0316634641257d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c4d57600080fd5b505af1158015610c61573d6000803e3d6000fd5b505050506040513d6020811015610c7757600080fd5b505190508015611165578154604080516366d16cc360e01b815290516000926001600160a01b0316916366d16cc3916004808301926020929190829003018186803b158015610cc557600080fd5b505afa158015610cd9573d6000803e3d6000fd5b505050506040513d6020811015610cef57600080fd5b5051600284018054840190556004549091506060906001600160a01b0380841691161415610da1576040805160028082526060820183529091602083019080368337505060045482519293506001600160a01b031691839150600090610d5157fe5b6001600160a01b039283166020918202929092010152600354825191169082906001908110610d7c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610e47565b6040805160038082526080820190925290602082016060803683370190505090508181600081518110610dd057fe5b6001600160a01b039283166020918202929092010152600454825191169082906001908110610dfb57fe5b6001600160a01b039283166020918202929092010152600354825191169082906002908110610e2657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60025460408051636eb1769f60e11b81523060048201526001600160a01b03928316602482015290519184169163dd62ed3e91604480820192602092909190829003018186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d6020811015610ec457600080fd5b5051610ee657600254610ee6906001600160a01b0384811691166000196133d6565b6060600260009054906101000a90046001600160a01b03166001600160a01b03166338ed17398560008530426003016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610f85578181015183820152602001610f6d565b505050509050019650505050505050600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610feb57600080fd5b8101908080516040519392919084600160201b82111561100a57600080fd5b90830190602082018581111561101f57600080fd5b82518660208202830111600160201b8211171561103b57600080fd5b82525081516020918201928201910280838360005b83811015611068578181015183820152602001611050565b5050505090500160405250505090508060018351038151811061108757fe5b60209081029190910101516006549097506001600160a01b0316156110df576006546110df906001600160a01b03166110cc60646110c68b604b6134ee565b9061354e565b6003546001600160a01b03169190613590565b6007546001600160a01b03161561111057600754611110906001600160a01b03166110cc60646110c68b60196134ee565b604080516001600160a01b03808b168252851660208201528082018690526060810189905290517fc5ca8fc2af130d27971637eec9f6085b5535bf62d406885bbb132e17b1c9964c9181900360800190a15050505b505050919050565b6002546001600160a01b031681565b6001546001600160a01b031633146111c9576040805162461bcd60e51b815260206004820152600b60248201526a2737ba103937baba32b91760a91b604482015290519081900360640190fd5b600754600160a01b900460ff1615611212576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b61121b82611326565b6001600160a01b038216600090815260086020526040812054908282116112425781611244565b825b90506112508482613076565b50505050565b61125e6135e2565b6000546001600160a01b039081169116146112ae576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b61271081565b600181565b60056020526000908152604090205460ff1681565b600754600160a01b900460ff161561136f576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600a6020526040902054806113d1576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6113d96139b9565b600b82815481106113e657fe5b6000918252602080832060408051608081018252600390940290910180546001600160a01b03908116855260018201548082168686015260ff600160a01b909104161515858401526002909101546060850152871684526009909152909120549091508061149b576040805162461bcd60e51b815260206004820152601a60248201527f5265736572766573526174696f73206e6f74206578697374732e000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b81526001600160a01b03928316600482015290516000928716916370a08231916024808301926020929190829003018186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d602081101561151357600080fd5b50516001600160a01b03861660009081526008602052604081205491925061154b846115456127106110c687876135e6565b906134ee565b9050808310156116085760006115618285613640565b905085600001516001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115ad57600080fd5b505af11580156115c1573d6000803e3d6000fd5b50506001546115df92506001600160a01b038b811692501683613590565b6115e98382613640565b6001600160a01b0389166000908152600860205260409020555061171b565b8083111561171b57600061161c8483613640565b60015460408051630a43004160e31b81526001600160a01b038c8116600483015260248201859052915193945091169163521802089160448082019260009290919082900301818387803b15801561167357600080fd5b505af1158015611687573d6000803e3d6000fd5b5050505085600001516001600160a01b031663b6b55f25826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050505061170081846135e690919063ffffffff16565b6001600160a01b038916600090815260086020526040902055505b604080516001600160a01b038916815290517f2d996eec1a258adebd9c1f9a9ffde58c855c550e10ed816d16c6d924d06df3159181900360200190a150505050505050565b6117686135e2565b6000546001600160a01b039081169116146117b8576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604090205460ff1661182b576040805162461bcd60e51b815260206004820152600a6024820152692737ba1030b236b4b71760b11b604482015290519081900360640190fd5b600b548110611877576040805162461bcd60e51b8152602060048201526013602482015272283937bb34b232b9103737ba1030b23232b21760691b604482015290519081900360640190fd5b6000600b828154811061188657fe5b6000918252602090912060039091020160018101549091506001600160a01b038481169116146118f2576040805162461bcd60e51b81526020600482015260126024820152712a37b5b2b7103737ba1036b0ba31b432b21760711b604482015290519081900360640190fd5b6001810154600160a01b900460ff16611947576040805162461bcd60e51b8152602060048201526012602482015271283937bb34b232b9103234b9b0b13632b21760711b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a6020526040902054828114156119b5576040805162461bcd60e51b815260206004820152601860248201527f50726f766964657220616c72656164792063686f73656e2e0000000000000000604482015290519081900360640190fd5b8154604080516366d16cc360e01b815290516001600160a01b03909216916366d16cc391600480820192602092909190829003018186803b1580156119f957600080fd5b505afa158015611a0d573d6000803e3d6000fd5b505050506040513d6020811015611a2357600080fd5b505160025460408051636eb1769f60e11b81523060048201526001600160a01b0392831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b158015611a7857600080fd5b505afa158015611a8c573d6000803e3d6000fd5b505050506040513d6020811015611aa257600080fd5b5051611b36576002548254604080516366d16cc360e01b81529051611b36936001600160a01b0390811693600019939116916366d16cc391600480820192602092909190829003018186803b158015611afa57600080fd5b505afa158015611b0e573d6000803e3d6000fd5b505050506040513d6020811015611b2457600080fd5b50516001600160a01b031691906133d6565b6001820154825460408051636eb1769f60e11b81523060048201526001600160a01b0392831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b158015611b8d57600080fd5b505afa158015611ba1573d6000803e3d6000fd5b505050506040513d6020811015611bb757600080fd5b5051611bdd5781546001830154611bdd916001600160a01b0391821691166000196133d6565b8015611d5557611bec84610b28565b506000600b8281548110611bfc57fe5b60009182526020808320600390920290910180546040805163429c145b60e11b815290519295506001600160a01b039091169263853828b69260048084019382900301818787803b158015611c5057600080fd5b505af1158015611c64573d6000803e3d6000fd5b505050506040513d6020811015611c7a57600080fd5b50516001600160a01b03871660009081526008602052604090205490915080821015611ced576040805162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420776974686472617720616d6f756e742e000000604482015290519081900360640190fd5b84546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b158015611d3957600080fd5b505af1158015611d4d573d6000803e3d6000fd5b505050505050505b6001600160a01b038085166000818152600a602090815260409182902087905585548251941684528301869052805191927fac81d0962e006dff42fdf4b06763b55b883e007b85c34d6ee6200c8311f00a1c929081900390910190a250505050565b611dbf6135e2565b6000546001600160a01b03908116911614611e0f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b611e176139b9565b600b8481548110611e2457fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff16151585840152600290910154606085015281516317d5759960e31b81528a821660048201529087166024820152604481018890529051929450909263beabacc89260648084019382900301818387803b158015611ec757600080fd5b505af1158015611edb573d6000803e3d6000fd5b505050505050505050565b3360009081526005602052604090205460ff16611f37576040805162461bcd60e51b815260206004820152600a6024820152692737ba1030b236b4b71760b11b604482015290519081900360640190fd5b6007805460ff60a01b1916600160a01b179055565b611f546135e2565b6000546001600160a01b03908116911614611fa4576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6060825160001415611fb757508061203a565b82805190602001208260405160200180836001600160e01b031916815260040182805190602001908083835b602083106120025780518252601f199092019160209182019101611fe3565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000846001600160a01b0316826040518082805190602001908083835b602083106120765780518252601f199092019160209182019101612057565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146120d8576040519150601f19603f3d011682016040523d82523d6000602084013e6120dd565b606091505b505090508061211d5760405162461bcd60e51b8152600401808060200182810382526022815260200180613a286022913960400191505060405180910390fd5b5050505050565b6006546001600160a01b031681565b600b818154811061214057fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935090821691600160a01b900460ff169084565b6003546001600160a01b031681565b600a6020526000908152604090205481565b6121a56135e2565b6000546001600160a01b039081169116146121f5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600b548110612242576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1032bc34b9ba399760611b604482015290519081900360640190fd5b6000600b828154811061225157fe5b906000526020600020906003020190508060010160149054906101000a900460ff16156122c5576040805162461bcd60e51b815260206004820152601960248201527f50726f766964657220616c726561647920656e61626c65642e00000000000000604482015290519081900360640190fd5b60018101805460ff60a01b1916600160a01b1790556040805183815290517f4037576c567bca2905d4a9000a516b7e286204d25e21adcc379d86e31456f8829181900360200190a15050565b6123196135e2565b6000546001600160a01b03908116911614612369576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6123cc6135e2565b6000546001600160a01b0390811691161461241c576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61246e6135e2565b6000546001600160a01b039081169116146124be576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6124c66139b9565b600b84815481106124d357fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff1615158584015260029091015460608501528151637b1a490960e01b815290871660048201526024810188905290519294509092637b1a49099260448084019382900301818387803b15801561256e57600080fd5b505af1158015612582573d6000803e3d6000fd5b5050505050505050565b6125946135e2565b6000546001600160a01b039081169116146125e4576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b600061261f6135e2565b6000546001600160a01b0390811691161461266f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b604080516080810182526001600160a01b0380851680835286821660208085019182526001858701818152600060608801818152600b80549485018155909152965160039092027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9810180549388166001600160a01b031994851617905593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8501805492511515600160a01b0260ff60a01b19929098169290931691909117169490941790935592517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90930192909255825163f77c479160e01b81529251309363f77c4791926004808301939192829003018186803b15801561279457600080fd5b505afa1580156127a8573d6000803e3d6000fd5b505050506040513d60208110156127be57600080fd5b50516001600160a01b031614612815576040805162461bcd60e51b815260206004820152601760248201527621b7b73a3937b63632b9103737ba1036b0ba31b432b21760491b604482015290519081900360640190fd5b826001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d602081101561288257600080fd5b50516001600160a01b0316146128d9576040805162461bcd60e51b815260206004820152601760248201527621b7b73a3937b63632b9103737ba1036b0ba31b432b21760491b604482015290519081900360640190fd5b600b546000906128ea906001613640565b9050836001600160a01b03167fb58c1155ce603c11717c452373e5d304917add1c5612ed5a562e2a57b4392ae5848360405180836001600160a01b031681526020018281526020019250505060405180910390a290505b92915050565b61294f6135e2565b6000546001600160a01b0390811691161461299f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b8060018110156129e7576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103930ba34b79760911b604482015290519081900360640190fd5b612710811115612a2f576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103930ba34b79760911b604482015290519081900360640190fd5b6001600160a01b038316600081815260096020908152604091829020859055815185815291517f922e909b4dc383e7613763ba1887c7fb3254f36aa386915f61a28df6c25400ae9281900390910190a2505050565b612a8c6135e2565b6000546001600160a01b03908116911614612adc576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b612b066135e2565b6000546001600160a01b03908116911614612b56576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600b548110612ba3576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1032bc34b9ba399760611b604482015290519081900360640190fd5b6000600b8281548110612bb257fe5b906000526020600020906003020190508060010160149054906101000a900460ff16612c25576040805162461bcd60e51b815260206004820152601a60248201527f50726f766964657220616c72656164792064697361626c65642e000000000000604482015290519081900360640190fd5b60018101805460ff60a01b191690556040805183815290517f3d2932f53dea1d2ac13eb5e2486d828aa633d604fcf164056fe8b1adc71a13c89181900360200190a15050565b612c736135e2565b6000546001600160a01b03908116911614612cc3576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6007805460ff60a01b19169055565b612cda6135e2565b6000546001600160a01b03908116911614612d2a576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b612d326139b9565b600b8681548110612d3f57fe5b600091825260208083206040805160808082018352600390950290920180546001600160a01b0390811680855260018301548083168688015260ff600160a01b9091041615158585015260029092015460608501529151632224fa2560e01b8152918b1660048301908152602483018b9052604483019586528951608484015289519397509095632224fa25958c958c958c958c9594606482019360a49092019291880191908190849084905b83811015612e04578181015183820152602001612dec565b50505050905090810190601f168015612e315780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612e64578181015183820152602001612e4c565b50505050905090810190601f168015612e915780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015612eb457600080fd5b505af1158015612ec8573d6000803e3d6000fd5b50505050505050505050565b60096020526000908152604090205481565b612eee6135e2565b6000546001600160a01b03908116911614612f3e576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b612f776135e2565b6000546001600160a01b03908116911614612fc7576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6001600160a01b03811661300c5760405162461bcd60e51b81526004018080602001828103825260268152602001806139e16026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b6001546001600160a01b031633146130c3576040805162461bcd60e51b815260206004820152600b60248201526a2737ba103937baba32b91760a91b604482015290519081900360640190fd5b600754600160a01b900460ff161561310c576040805162461bcd60e51b8152602060048201526007602482015266232927ad22a71760c91b604482015290519081900360640190fd5b6001600160a01b03821660009081526008602052604090205481811161316f576040805162461bcd60e51b81526020600482015260136024820152722232b837b9b4ba103737ba1032b737bab3b41760691b604482015290519081900360640190fd5b6001600160a01b0383166000908152600a6020526040902054806131d1576040805162461bcd60e51b8152602060048201526014602482015273283937bb34b232b9103737ba1031b437b9b2b71760611b604482015290519081900360640190fd5b6000600b82815481106131e057fe5b600091825260208220600390910201805460408051632e1a7d4d60e01b81526004810189905290519294506001600160a01b0390911692632e1a7d4d9260248084019382900301818387803b15801561323857600080fd5b505af115801561324c573d6000803e3d6000fd5b505060015461326a92506001600160a01b0388811692501686613590565b6132748385613640565b6001600160a01b0390951660009081526008602052604090209490945550505050565b61329f6135e2565b6000546001600160a01b039081169116146132ef576040805162461bcd60e51b81526020600482018190526024820152600080516020613a4a833981519152604482015290519081900360640190fd5b6132f76139b9565b600b838154811061330457fe5b600091825260208083206040805160808101825260039490940290910180546001600160a01b03908116808652600183015480831695870195909552600160a01b90940460ff161515858401526002909101546060850152815163307c5a4160e21b815290871660048201529051929450909263c1f169049260248084019382900301818387803b15801561339857600080fd5b505af11580156133ac573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031681565b60086020526000908152604090205481565b80158061345c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561342e57600080fd5b505afa158015613442573d6000803e3d6000fd5b505050506040513d602081101561345857600080fd5b5051155b6134975760405162461bcd60e51b8152600401808060200182810382526036815260200180613a946036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526134e9908490613682565b505050565b6000826134fd57506000612941565b8282028284828161350a57fe5b04146135475760405162461bcd60e51b8152600401808060200182810382526021815260200180613a076021913960400191505060405180910390fd5b9392505050565b600061354783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613733565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526134e9908490613682565b3390565b600082820183811015613547576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061354783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137d5565b60606136d7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661382f9092919063ffffffff16565b8051909150156134e9578080602001905160208110156136f657600080fd5b50516134e95760405162461bcd60e51b815260040180806020018281038252602a815260200180613a6a602a913960400191505060405180910390fd5b600081836137bf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561378457818101518382015260200161376c565b50505050905090810190601f1680156137b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137cb57fe5b0495945050505050565b600081848411156138275760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561378457818101518382015260200161376c565b505050900390565b606061383e8484600085613846565b949350505050565b6060613851856139b3565b6138a2576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106138e15780518252601f1990920191602091820191016138c2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613943576040519150601f19603f3d011682016040523d82523d6000602084013e613948565b606091505b5091509150811561395c57915061383e9050565b80511561396c5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561378457818101518382015260200161376c565b3b151590565b6040805160808101825260008082526020820181905291810182905260608101919091529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77456d657267656e63655472696767657220657865637574696f6e206661696c65642e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220d766f2f6ea0c6a613d410c8500ebf6863e585a48438cd87875972aa3bc19a38464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e4fe6a45f354e845f954cddee6084603cedb94100000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c28e27870558cf22add83540d2126da2e4b464c2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006ed306dba10e6c6b20bba693892fac21f3b91977
-----Decoded View---------------
Arg [0] : _router (address): 0xe4FE6a45f354E845F954CdDeE6084603CEDB9410
Arg [1] : _routerForSashimi (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _sashimi (address): 0xC28E27870558cF22ADD83540d2126da2e4b464c2
Arg [3] : _wETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _beneficiary1 (address): 0x6ed306DbA10E6c6B20BBa693892Fac21f3B91977
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4fe6a45f354e845f954cddee6084603cedb9410
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000c28e27870558cf22add83540d2126da2e4b464c2
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 0000000000000000000000006ed306dba10e6c6b20bba693892fac21f3b91977
Deployed Bytecode Sourcemap
40511:12906:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53093:321;;;;;;;;;;;;;;;;-1:-1:-1;53093:321:0;-1:-1:-1;;;;;53093:321:0;;:::i;:::-;;;;-1:-1:-1;;;;;53093:321:0;;;;;;;;;;;;;;;;;;;;;41567:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;44957:1667;;;;;;;;;;;;;;;;-1:-1:-1;44957:1667:0;-1:-1:-1;;;;;44957:1667:0;;:::i;:::-;;;;;;;;;;;;;;;;41219:31;;;:::i;:::-;;;;-1:-1:-1;;;;;41219:31:0;;;;;;;;;;;;;;47223:337;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47223:337:0;;;;;;;;:::i;:::-;;50740:132;;;;;;;;;;;;;;;;-1:-1:-1;50740:132:0;-1:-1:-1;;;;;50740:132:0;;:::i;41957:45::-;;;:::i;42009:41::-;;;:::i;41367:39::-;;;;;;;;;;;;;;;;-1:-1:-1;41367:39:0;-1:-1:-1;;;;;41367:39:0;;:::i;43429:1520::-;;;;;;;;;;;;;;;;-1:-1:-1;43429:1520:0;-1:-1:-1;;;;;43429:1520:0;;:::i;51003:91::-;;;;;;;;;;;;;;;;-1:-1:-1;51003:91:0;-1:-1:-1;;;;;51003:91:0;;:::i;48829:1529::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48829:1529:0;;;;;;;;:::i;51560:247::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51560:247:0;;;;;;;;;;;;;;;;;;;;:::i;51430:75::-;;;:::i;52407:449::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52407:449:0;;;;;;;;;;;;;;;-1:-1:-1;;;52407:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52407:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52407:449:0;;;;;;;;-1:-1:-1;52407:449:0;;-1:-1:-1;;;;;52407:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52407:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52407:449:0;;-1:-1:-1;52407:449:0;;-1:-1:-1;;;;;52407:449:0:i;41451:27::-;;;:::i;42116:::-;;;;;;;;;;;;;;;;-1:-1:-1;42116:27:0;;:::i;:::-;;;;-1:-1:-1;;;;;42116:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41279:22;;;:::i;41875:50::-;;;;;;;;;;;;;;;;-1:-1:-1;41875:50:0;-1:-1:-1;;;;;41875:50:0;;:::i;47911:332::-;;;;;;;;;;;;;;;;-1:-1:-1;47911:332:0;;:::i;50606:126::-;;;;;;;;;;;;;;;;-1:-1:-1;50606:126:0;-1:-1:-1;;;;;50606:126:0;;:::i;2776:148::-;;;:::i;51862:229::-;;;;;;;;;;;;;;;;-1:-1:-1;51862:229:0;;;;;;;;;;;-1:-1:-1;;;;;51862:229:0;;:::i;51102:122::-;;;;;;;;;;;;;;;;-1:-1:-1;51102:122:0;-1:-1:-1;;;;;51102:122:0;;:::i;2134:79::-;;;:::i;48251:570::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48251:570:0;;;;;;;;;;:::i;50366:232::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50366:232:0;;;;;;;;:::i;50880:115::-;;;;;;;;;;;;;;;;-1:-1:-1;50880:115:0;-1:-1:-1;;;;;50880:115:0;;:::i;47568:335::-;;;;;;;;;;;;;;;;-1:-1:-1;47568:335:0;;:::i;51355:67::-;;;:::i;52099:300::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52099:300:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52099:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52099:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52099:300:0;;;;;;;;-1:-1:-1;52099:300:0;;-1:-1:-1;;;;;52099:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52099:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52099:300:0;;-1:-1:-1;52099:300:0;;-1:-1:-1;;;;;52099:300:0:i;41801:49::-;;;;;;;;;;;;;;;;-1:-1:-1;41801:49:0;-1:-1:-1;;;;;41801:49:0;;:::i;51232:115::-;;;;;;;;;;;;;;;;-1:-1:-1;51232:115:0;-1:-1:-1;;;;;51232:115:0;;:::i;41325:19::-;;;:::i;3079:244::-;;;;;;;;;;;;;;;;-1:-1:-1;3079:244:0;-1:-1:-1;;;;;3079:244:0;;:::i;41508:27::-;;;:::i;46632:583::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46632:583:0;;;;;;;;:::i;52864:221::-;;;;;;;;;;;;;;;;-1:-1:-1;52864:221:0;;;;;;-1:-1:-1;;;;;52864:221:0;;:::i;41176:21::-;;;:::i;41724:43::-;;;;;;;;;;;;;;;;-1:-1:-1;41724:43:0;-1:-1:-1;;;;;41724:43:0;;:::i;53093:321::-;-1:-1:-1;;;;;53208:23:0;;53145:14;53208:23;;;:15;:23;;;;;;53145:14;;53242:24;;:::i;:::-;53269:9;53279:10;53269:21;;;;;;;;;;;;;;;;;53242:48;;;;;;;;53269:21;;;;;;;;53242:48;;-1:-1:-1;;;;;53242:48:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;53242:48:0;;;;;;;;;;;;;;;;;;;;53310:38;;-1:-1:-1;;;53310:38:0;;;;53242:48;;-1:-1:-1;53242:48:0;53310:36;;:38;;;;;;;;;;53242:48;53310:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53310:38:0;53382:14;;53368:38;;;-1:-1:-1;;;53368:38:0;;;;53310;;-1:-1:-1;;;;;;53368:36:0;;;;;;:38;;;;;53310;;53368;;;;;;;;:36;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53368:38:0;53093:321;;53368:38;;-1:-1:-1;;;;53093:321:0:o;41567:18::-;;;-1:-1:-1;;;41567:18:0;;;;;:::o;44957:1667::-;42695:6;;45016:14;;-1:-1:-1;;;42695:6:0;;;;42694:7;42672:51;;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45059:23:0;::::1;45042:14;45059:23:::0;;;:15:::1;:23;::::0;;;;;45101:10;45093:43:::1;;;::::0;;-1:-1:-1;;;45093:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45093:43:0;;;;;;;;;;;;;::::1;;45147:25;45175:9;45185:6;45175:17;;;;;;;;;;;;;;;;;;45147:45;;45212:1;45203:10;;45224:20;45261:8;:14;;;;;;;;;;-1:-1:-1::0;;;;;45261:14:0::1;-1:-1:-1::0;;;;;45247:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45247:39:0;;-1:-1:-1;45301:16:0;;45297:1320:::1;;45374:14:::0;;45360:38:::1;::::0;;-1:-1:-1;;;45360:38:0;;;;45343:14:::1;::::0;-1:-1:-1;;;;;45374:14:0::1;::::0;45360:36:::1;::::0;:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;45374:14;45360:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45360:38:0;45413:18:::1;::::0;::::1;:34:::0;;;::::1;::::0;;45514:4:::1;::::0;45360:38;;-1:-1:-1;45464:21:0::1;::::0;-1:-1:-1;;;;;45504:14:0;;::::1;45514:4:::0;::::1;45504:14;45500:341;;;45559:16;::::0;;45573:1:::1;45559:16:::0;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;45604:4:0::1;::::0;45594:7;;;;-1:-1:-1;;;;;;45604:4:0::1;::::0;45594:7;;-1:-1:-1;45604:4:0::1;::::0;45594:7:::1;;;;-1:-1:-1::0;;;;;45594:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;45637:7:::1;::::0;45627;;45637;::::1;::::0;45627:4;;45637:7;;45627;::::1;;;;;;;;;;:17;-1:-1:-1::0;;;;;45627:17:0::1;;;-1:-1:-1::0;;;;;45627:17:0::1;;;::::0;::::1;45500:341;;;45705:16;::::0;;45719:1:::1;45705:16:::0;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;45705:16:0::1;45698:23;;45750:6;45740:4;45745:1;45740:7;;;;;;;;-1:-1:-1::0;;;;;45740:16:0;;::::1;:7;::::0;;::::1;::::0;;;;;:16;45785:4:::1;::::0;45775:7;;45785:4;::::1;::::0;45775;;45785;;45775:7;::::1;;;;;-1:-1:-1::0;;;;;45775:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;45818:7:::1;::::0;45808;;45818;::::1;::::0;45808:4;;45813:1:::1;::::0;45808:7;::::1;;;;;;;;;;:17;-1:-1:-1::0;;;;;45808:17:0::1;;;-1:-1:-1::0;;;;;45808:17:0::1;;;::::0;::::1;45500:341;45901:16;::::0;45861:57:::1;::::0;;-1:-1:-1;;;45861:57:0;;45894:4:::1;45861:57;::::0;::::1;::::0;-1:-1:-1;;;;;45901:16:0;;::::1;45861:57:::0;;;;;;:24;;::::1;::::0;::::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;:24;:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45861:57:0;45857:148:::1;;45969:16;::::0;45942:63:::1;::::0;-1:-1:-1;;;;;45942:26:0;;::::1;::::0;45969:16:::1;-1:-1:-1::0;;45942:26:0::1;:63::i;:::-;46082:21;46125:16;;;;;;;;;-1:-1:-1::0;;;;;46125:16:0::1;-1:-1:-1::0;;;;;46106:61:0::1;;46168:12;46182:1;46185:4;46199;46206:15;46224:1;46206:19;46106:120;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46106:120:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;46106:120:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;46106:120:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;46106:120:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;46106:120:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;46082:144;;46250:7;46272:1;46258:4;:11;:15;46250:24;;;;;;;;;::::0;;::::1;::::0;;;;;;46295:12:::1;::::0;46250:24;;-1:-1:-1;;;;;;46295:12:0::1;:26:::0;46291:116:::1;;46369:12;::::0;46340:67:::1;::::0;-1:-1:-1;;;;;46369:12:0::1;46383:23;46402:3;46383:14;:6:::0;46394:2:::1;46383:10;:14::i;:::-;:18:::0;::::1;:23::i;:::-;46347:7;::::0;-1:-1:-1;;;;;46347:7:0::1;::::0;46340:67;:28:::1;:67::i;:::-;46426:12;::::0;-1:-1:-1;;;;;46426:12:0::1;:26:::0;46422:116:::1;;46500:12;::::0;46471:67:::1;::::0;-1:-1:-1;;;;;46500:12:0::1;46514:23;46533:3;46514:14;:6:::0;46525:2:::1;46514:10;:14::i;46471:67::-;46558:47;::::0;;-1:-1:-1;;;;;46558:47:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;45297:1320;;;;42734:1;;;44957:1667:::0;;;:::o;41219:31::-;;;-1:-1:-1;;;;;41219:31:0;;:::o;47223:337::-;42220:6;;-1:-1:-1;;;;;42220:6:0;42206:10;:20;42184:81;;;;;-1:-1:-1;;;42184:81:0;;;;;;;;;;;;-1:-1:-1;;;42184:81:0;;;;;;;;;;;;;;;42695:6:::1;::::0;-1:-1:-1;;;42695:6:0;::::1;;;42694:7;42672:51;;;::::0;;-1:-1:-1;;;42672:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;;::::1;;47356:17:::2;47366:6;47356:9;:17::i;:::-;-1:-1:-1::0;;;;;47408:16:0;::::2;47384:21;47408:16:::0;;;:8:::2;:16;::::0;;;;;;47460:23;;::::2;:49;;47496:13;47460:49;;;47486:7;47460:49;47435:74;;47520:32;47529:6;47537:14;47520:8;:32::i;:::-;42734:1;;47223:337:::0;;:::o;50740:132::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50805:15:0;::::1;50823:5;50805:15:::0;;;:7:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;50805:23:0::1;::::0;;50844:20;;;;;;;::::1;::::0;;;;;;;;::::1;50740:132:::0;:::o;41957:45::-;41997:5;41957:45;:::o;42009:41::-;42049:1;42009:41;:::o;41367:39::-;;;;;;;;;;;;;;;:::o;43429:1520::-;42695:6;;-1:-1:-1;;;42695:6:0;;;;42694:7;42672:51;;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43513:23:0;::::1;43492:18;43513:23:::0;;;:15:::1;:23;::::0;;;;;43555:14;43547:47:::1;;;::::0;;-1:-1:-1;;;43547:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43547:47:0;;;;;;;;;;;;;::::1;;43605:24;;:::i;:::-;43632:9;43642:10;43632:21;;;;;;;;;::::0;;;::::1;::::0;;;43605:48:::1;::::0;;::::1;::::0;::::1;::::0;;43632:21:::1;::::0;;::::1;::::0;;::::1;43605:48:::0;;-1:-1:-1;;;;;43605:48:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;43605:48:0;;::::1;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;43690:22;::::1;::::0;;:14:::1;:22:::0;;;;;;;43605:48;;-1:-1:-1;43731:17:0;43723:56:::1;;;::::0;;-1:-1:-1;;;43723:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43842:6;::::0;43817:32:::1;::::0;;-1:-1:-1;;;43817:32:0;;-1:-1:-1;;;;;43842:6:0;;::::1;43817:32;::::0;::::1;::::0;;;43792:22:::1;::::0;43817:24;::::1;::::0;::::1;::::0;:32;;;;;::::1;::::0;;;;;;;;:24;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43817:32:0;-1:-1:-1;;;;;43890:16:0;::::1;43860:27;43890:16:::0;;;:8:::1;43817:32;43890:16:::0;;;;;43817:32;;-1:-1:-1;43941:84:0::1;44011:13:::0;43941:65:::1;42102:5;43942:39;43817:32:::0;43890:16;43942:18:::1;:39::i;43941:65::-;:69:::0;::::1;:84::i;:::-;43917:108;;44059:13;44042:14;:30;44038:860;;;44135:14;44152:33;:13:::0;44170:14;44152:17:::1;:33::i;:::-;44135:50;;44241:8;:14;;;-1:-1:-1::0;;;;;44227:38:0::1;;44266:6;44227:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44352:6:0::1;::::0;44324:43:::1;::::0;-1:-1:-1;;;;;;44324:27:0;;::::1;::::0;-1:-1:-1;44352:6:0::1;44360::::0;44324:27:::1;:43::i;:::-;44401:31;:19:::0;44425:6;44401:23:::1;:31::i;:::-;-1:-1:-1::0;;;;;44382:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;:50;-1:-1:-1;44038:860:0::1;;;44480:13;44463:14;:30;44459:439;;;44555:14;44572:33;:14:::0;44591:13;44572:18:::1;:33::i;:::-;44639:6;::::0;44620:47:::1;::::0;;-1:-1:-1;;;44620:47:0;;-1:-1:-1;;;;;44620:47:0;;::::1;;::::0;::::1;::::0;;;;;;;;;44555:50;;-1:-1:-1;44639:6:0;::::1;::::0;44620:31:::1;::::0;:47;;;;;44639:6:::1;::::0;44620:47;;;;;;;;44639:6;;44620:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44790:8;:14;;;-1:-1:-1::0;;;;;44776:37:0::1;;44814:6;44776:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44855:31;44879:6;44855:19;:23;;:31;;;;:::i;:::-;-1:-1:-1::0;;;;;44836:16:0;::::1;;::::0;;;:8:::1;:16;::::0;;;;:50;-1:-1:-1;44459:439:0::1;44915:26;::::0;;-1:-1:-1;;;;;44915:26:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;42734:1;;;;;;43429:1520:::0;:::o;51003:91::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51070:6:::1;:16:::0;;-1:-1:-1;;;;;;51070:16:0::1;-1:-1:-1::0;;;;;51070:16:0;;;::::1;::::0;;;::::1;::::0;;51003:91::o;48829:1529::-;42354:10;42346:19;;;;:7;:19;;;;;;;;42324:79;;;;;-1:-1:-1;;;42324:79:0;;;;;;;;;;;;-1:-1:-1;;;42324:79:0;;;;;;;;;;;;;;;48940:9:::1;:16:::0;48926:30;::::1;48918:62;;;::::0;;-1:-1:-1;;;48918:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48918:62:0;;;;;;;;;;;;;::::1;;48991:25;49019:9;49029:11;49019:22;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;49062:14;::::0;::::1;::::0;49019:22;;-1:-1:-1;;;;;;49062:24:0;;::::1;:14:::0;::::1;:24;49054:55;;;::::0;;-1:-1:-1;;;49054:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49054:55:0;;;;;;;;;;;;;::::1;;49128:15;::::0;::::1;::::0;-1:-1:-1;;;49128:15:0;::::1;;;49120:46;;;::::0;;-1:-1:-1;;;49120:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49120:46:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;49196:23:0;::::1;49179:14;49196:23:::0;;;:15:::1;:23;::::0;;;;;49238:21;;::::1;;49230:58;;;::::0;;-1:-1:-1;;;49230:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;49363:14:::0;;49349:38:::1;::::0;;-1:-1:-1;;;49349:38:0;;;;-1:-1:-1;;;;;49363:14:0;;::::1;::::0;49349:36:::1;::::0;:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;49363:14;49349:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49349:38:0;49414:16:::1;::::0;49342:89:::1;::::0;;-1:-1:-1;;;49342:89:0;;49407:4:::1;49342:89;::::0;::::1;::::0;-1:-1:-1;;;;;49414:16:0;;::::1;49342:89:::0;;;;;;:56;;;::::1;::::0;::::1;::::0;:89;;;;;49349:38:::1;::::0;49342:89;;;;;;;:56;:89;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49342:89:0;49338:208:::1;;49510:16;::::0;49472:14;;49458:38:::1;::::0;;-1:-1:-1;;;49458:38:0;;;;49451:95:::1;::::0;-1:-1:-1;;;;;49510:16:0;;::::1;::::0;-1:-1:-1;;49528:17:0;49472:14;::::1;::::0;49458:36:::1;::::0;:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;49472:14;49458:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49458:38:0;-1:-1:-1;;;;;49451:58:0::1;::::0;:95;:58:::1;:95::i;:::-;49570:14;::::0;::::1;::::0;49611;;49563:63:::1;::::0;;-1:-1:-1;;;49563:63:0;;49604:4:::1;49563:63;::::0;::::1;::::0;-1:-1:-1;;;;;49611:14:0;;::::1;49563:63:::0;;;;;;49570:14;;;::::1;::::0;49563:32:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;49570:14;49563:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49563:63:0;49559:156:::1;;49681:14:::0;;;49653;::::1;::::0;49646:69:::1;::::0;-1:-1:-1;;;;;49653:14:0;;::::1;::::0;49681::::1;-1:-1:-1::0;;49646:34:0::1;:69::i;:::-;49732:11:::0;;49728:504:::1;;49813:15;49821:6;49813:7;:15::i;:::-;;49843:28;49874:9;49884:6;49874:17;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;49978::::0;;49964:46:::1;::::0;;-1:-1:-1;;;49964:46:0;;;;49874:17;;-1:-1:-1;;;;;;49978:17:0;;::::1;::::0;49964:44:::1;::::0;:46:::1;::::0;;::::1;::::0;;;;;;49874:17;49978;49964:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49964:46:0;-1:-1:-1;;;;;50049:16:0;::::1;50025:21;50049:16:::0;;;:8:::1;49964:46;50049:16:::0;;;;;49964:46;;-1:-1:-1;50088:31:0;;::::1;;50080:73;;;::::0;;-1:-1:-1;;;50080:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50182:14:::0;;50168:52:::1;::::0;;-1:-1:-1;;;50168:52:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;50182:14:0;;::::1;::::0;50168:37:::1;::::0;:52;;;;;50182:14:::1;::::0;50168:52;;;;;;;;50182:14;;50168:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49728:504;;;;-1:-1:-1::0;;;;;50244:23:0;;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;;:37;;;50322:14;;50297:53;;50322:14;::::1;50297:53:::0;;;::::1;::::0;;;;;50244:23;;50297:53:::1;::::0;;;;;;;;;::::1;42414:1;;48829:1529:::0;;:::o;51560:247::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51680:24:::1;;:::i;:::-;51707:9;51717:10;51707:21;;;;;;;;;::::0;;;::::1;::::0;;;51680:48:::1;::::0;;::::1;::::0;::::1;::::0;;51707:21:::1;::::0;;;::::1;::::0;;::::1;51680:48:::0;;-1:-1:-1;;;;;51680:48:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;51680:48:0;;::::1;;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;51739:60;;-1:-1:-1;;;51739:60:0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;51680:48;;-1:-1:-1;51680:48:0;;51739:38:::1;::::0;:60;;;;;;;;;;51707:21;51680:48;51739:60;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2416:1;51560:247:::0;;;;:::o;51430:75::-;42354:10;42346:19;;;;:7;:19;;;;;;;;42324:79;;;;;-1:-1:-1;;;42324:79:0;;;;;;;;;;;;-1:-1:-1;;;42324:79:0;;;;;;;;;;;;;;;51484:6:::1;:13:::0;;-1:-1:-1;;;;51484:13:0::1;-1:-1:-1::0;;;51484:13:0::1;::::0;;51430:75::o;52407:449::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;52520:21:::1;52562:9;52556:23;52583:1;52556:28;52552:179;;;-1:-1:-1::0;52612:4:0;52552:179:::1;;;52700:9;52684:27;;;;;;52714:4;52660:59;;;;;;-1:-1:-1::0;;;;;52660:59:0::1;;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;52660:59:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52649:70;;52552:179;52744:12;52762:6;-1:-1:-1::0;;;;;52762:11:0::1;52774:8;52762:21;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;52762:21:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52743:40;;;52802:7;52794:54;;;;-1:-1:-1::0;;;52794:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2416:1;;52407:449:::0;;;:::o;41451:27::-;;;-1:-1:-1;;;;;41451:27:0;;:::o;42116:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42116:27:0;;;;-1:-1:-1;42116:27:0;;;;-1:-1:-1;;;42116:27:0;;;;;;:::o;41279:22::-;;;-1:-1:-1;;;;;41279:22:0;;:::o;41875:50::-;;;;;;;;;;;;;:::o;47911:332::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;48006:9:::1;:16:::0;47992:30;::::1;47984:63;;;::::0;;-1:-1:-1;;;47984:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47984:63:0;;;;;;;;;;;;;::::1;;48058:20;48081:9;48091:11;48081:22;;;;;;;;;;;;;;;;;;48058:45;;48123:3;:10;;;;;;;;;;;;48122:11;48114:49;;;::::0;;-1:-1:-1;;;48114:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48187:4;48174:10:::0;::::1;:17:::0;;-1:-1:-1;;;;48174:17:0::1;-1:-1:-1::0;;;48174:17:0::1;::::0;;48207:28:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;2416:1;47911:332:::0;:::o;50606:126::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50668:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:22;;-1:-1:-1;;50668:22:0::1;50686:4;50668:22;::::0;;50706:18;;;;;;;::::1;::::0;;;;;;;;::::1;50606:126:::0;:::o;2776:148::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;2883:1:::1;2867:6:::0;;2846:40:::1;::::0;-1:-1:-1;;;;;2867:6:0;;::::1;::::0;2846:40:::1;::::0;2883:1;;2846:40:::1;2914:1;2897:19:::0;;-1:-1:-1;;;;;;2897:19:0::1;::::0;;2776:148::o;51862:229::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51969:24:::1;;:::i;:::-;51996:9;52006:10;51996:21;;;;;;;;;::::0;;;::::1;::::0;;;51969:48:::1;::::0;;::::1;::::0;::::1;::::0;;51996:21:::1;::::0;;;::::1;::::0;;::::1;51969:48:::0;;-1:-1:-1;;;;;51969:48:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;51969:48:0;;::::1;;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;52028:55;;-1:-1:-1;;;52028:55:0;;;;::::1;;::::0;::::1;::::0;;;;;;;;;51969:48;;-1:-1:-1;51969:48:0;;52028:41:::1;::::0;:55;;;;;;;;;;51996:21;51969:48;52028:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2416:1;51862:229:::0;;;:::o;51102:122::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51183:16:::1;:33:::0;;-1:-1:-1;;;;;;51183:33:0::1;-1:-1:-1::0;;;;;51183:33:0;;;::::1;::::0;;;::::1;::::0;;51102:122::o;2134:79::-;2172:7;2199:6;-1:-1:-1;;;;;2199:6:0;2134:79;:::o;48251:570::-;48330:7;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;48365:118:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;48365:118:0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;48444:4:::1;48365:118:::0;;;;;;-1:-1:-1;48365:118:0;;;;;;48350:9:::1;:134:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;48350:134:0;;::::1;;::::0;;;;;;;;;;;::::1;;-1:-1:-1::0;;;48350:134:0::1;-1:-1:-1::0;;;;48350:134:0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;;;;;;;;;;;48505:34;;-1:-1:-1;;;48505:34:0;;;;48552:4:::1;::::0;48505:32:::1;::::0;:34:::1;::::0;;::::1;::::0;48365:118;;48505:34;;;;;48365:118;48505:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48505:34:0;-1:-1:-1;;;;;48505:52:0::1;;48497:88;;;::::0;;-1:-1:-1;;;48497:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48497:88:0;;;;;;;;;;;;;::::1;;48637:6;-1:-1:-1::0;;;;;48604:39:0::1;48618:6;-1:-1:-1::0;;;;;48604:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48604:29:0;-1:-1:-1;;;;;48604:39:0::1;;48596:75;;;::::0;;-1:-1:-1;;;48596:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48596:75:0;;;;;;;;;;;;;::::1;;48705:9;:16:::0;48684:18:::1;::::0;48705:23:::1;::::0;48726:1:::1;48705:20;:23::i;:::-;48684:44;;48758:6;-1:-1:-1::0;;;;;48744:41:0::1;;48766:6;48774:10;48744:41;;;;-1:-1:-1::0;;;;;48744:41:0::1;;;;;;;;;;;;;;;;;;;;;48803:10:::0;-1:-1:-1;2416:1:0::1;48251:570:::0;;;;:::o;50366:232::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;50456:14:::1;42049:1;42493:14;:31;;42485:58;;;::::0;;-1:-1:-1;;;42485:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42485:58:0;;;;;;;;;;;;;::::1;;41997:5;42562:14;:31;;42554:58;;;::::0;;-1:-1:-1;;;42554:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42554:58:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;50490:22:0;::::2;;::::0;;;:14:::2;:22;::::0;;;;;;;;:39;;;50545:45;;;;;;;::::2;::::0;;;;;;;;::::2;2416:1:::1;50366:232:::0;;:::o;50880:115::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;50959:12:::1;:28:::0;;-1:-1:-1;;;;;;50959:28:0::1;-1:-1:-1::0;;;;;50959:28:0;;;::::1;::::0;;;::::1;::::0;;50880:115::o;47568:335::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;47664:9:::1;:16:::0;47650:30;::::1;47642:63;;;::::0;;-1:-1:-1;;;47642:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47642:63:0;;;;;;;;;;;;;::::1;;47716:20;47739:9;47749:11;47739:22;;;;;;;;;;;;;;;;;;47716:45;;47780:3;:10;;;;;;;;;;;;47772:49;;;::::0;;-1:-1:-1;;;47772:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;47832:10;::::0;::::1;:18:::0;;-1:-1:-1;;;;47832:18:0::1;::::0;;47866:29:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;2416:1;47568:335:::0;:::o;51355:67::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51400:6:::1;:14:::0;;-1:-1:-1;;;;51400:14:0::1;::::0;;51355:67::o;52099:300::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;52252:24:::1;;:::i;:::-;52279:9;52289:10;52279:21;;;;;;;;;::::0;;;::::1;::::0;;;52252:48:::1;::::0;;::::1;::::0;;::::1;::::0;;52279:21:::1;::::0;;::::1;::::0;;::::1;52252:48:::0;;-1:-1:-1;;;;;52252:48:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;52252:48:0;;::::1;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;52311:80;;-1:-1:-1;;;52311:80:0;;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;52252:48;;-1:-1:-1;52252:48:0;;52311::::1;::::0;52360:6;;52368:5;;52375:9;;52386:4;;52311:80;;;;;;;;;;;;::::1;::::0;;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;52311:80:0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2416:1;52099:300:::0;;;;;:::o;41801:49::-;;;;;;;;;;;;;:::o;51232:115::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;51311:12:::1;:28:::0;;-1:-1:-1;;;;;;51311:28:0::1;-1:-1:-1::0;;;;;51311:28:0;;;::::1;::::0;;;::::1;::::0;;51232:115::o;41325:19::-;;;-1:-1:-1;;;;;41325:19:0;;:::o;3079:244::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3168:22:0;::::1;3160:73;;;;-1:-1:-1::0;;;3160:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3270:6;::::0;;3249:38:::1;::::0;-1:-1:-1;;;;;3249:38:0;;::::1;::::0;3270:6;::::1;::::0;3249:38:::1;::::0;::::1;3298:6;:17:::0;;-1:-1:-1;;;;;;3298:17:0::1;-1:-1:-1::0;;;;;3298:17:0;;;::::1;::::0;;;::::1;::::0;;3079:244::o;41508:27::-;;;-1:-1:-1;;;;;41508:27:0;;:::o;46632:583::-;42220:6;;-1:-1:-1;;;;;42220:6:0;42206:10;:20;42184:81;;;;;-1:-1:-1;;;42184:81:0;;;;;;;;;;;;-1:-1:-1;;;42184:81:0;;;;;;;;;;;;;;;42695:6:::1;::::0;-1:-1:-1;;;42695:6:0;::::1;;;42694:7;42672:51;;;::::0;;-1:-1:-1;;;42672:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42672:51:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;46755:16:0;::::2;46731:21;46755:16:::0;;;:8:::2;:16;::::0;;;;;46790:23;;::::2;46782:55;;;::::0;;-1:-1:-1;;;46782:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46782:55:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46869:23:0;::::2;46848:18;46869:23:::0;;;:15:::2;:23;::::0;;;;;46937:14;46929:47:::2;;;::::0;;-1:-1:-1;;;46929:47:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46929:47:0;;;;;;;;;;;;;::::2;;46989:25;47017:9;47027:10;47017:21;;;;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;47063:14:::0;;47049:47:::2;::::0;;-1:-1:-1;;;47049:47:0;;::::2;::::0;::::2;::::0;;;;;47017:21;;-1:-1:-1;;;;;;47063:14:0;;::::2;::::0;47049:38:::2;::::0;:47;;;;;;;;;;47017:21;47063:14;47049:47;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;47135:6:0::2;::::0;47107:44:::2;::::0;-1:-1:-1;;;;;;47107:27:0;;::::2;::::0;-1:-1:-1;47135:6:0::2;47143:7:::0;47107:27:::2;:44::i;:::-;47181:26;:13:::0;47199:7;47181:17:::2;:26::i;:::-;-1:-1:-1::0;;;;;47162:16:0;;::::2;;::::0;;;:8:::2;:16;::::0;;;;:45;;;;-1:-1:-1;;;;46632:583:0:o;52864:221::-;2356:12;:10;:12::i;:::-;2346:6;;-1:-1:-1;;;;;2346:6:0;;;:22;;;2338:67;;;;;-1:-1:-1;;;2338:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2338:67:0;;;;;;;;;;;;;;;52963:24:::1;;:::i;:::-;52990:9;53000:10;52990:21;;;;;;;;;::::0;;;::::1;::::0;;;52963:48:::1;::::0;;::::1;::::0;::::1;::::0;;52990:21:::1;::::0;;;::::1;::::0;;::::1;52963:48:::0;;-1:-1:-1;;;;;52963:48:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;52963:48:0;;::::1;;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;53022:55;;-1:-1:-1;;;53022:55:0;;;;::::1;;::::0;::::1;::::0;;;52963:48;;-1:-1:-1;52963:48:0;;53022::::1;::::0;:55;;;;;;;;;;52990:21;52963:48;53022:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2416:1;52864:221:::0;;:::o;41176:21::-;;;-1:-1:-1;;;;;41176:21:0;;:::o;41724:43::-;;;;;;;;;;;;;:::o;19813:622::-;20183:10;;;20182:62;;-1:-1:-1;20199:39:0;;;-1:-1:-1;;;20199:39:0;;20223:4;20199:39;;;;-1:-1:-1;;;;;20199:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20199:39:0;:44;20182:62;20174:152;;;;-1:-1:-1;;;20174:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20364:62;;;-1:-1:-1;;;;;20364:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20364:62:0;-1:-1:-1;;;20364:62:0;;;20337:90;;20357:5;;20337:19;:90::i;:::-;19813:622;;;:::o;9343:471::-;9401:7;9646:6;9642:47;;-1:-1:-1;9676:1:0;9669:8;;9642:47;9713:5;;;9717:1;9713;:5;:1;9737:5;;;;;:10;9729:56;;;;-1:-1:-1;;;9729:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9805:1;9343:471;-1:-1:-1;;;9343:471:0:o;10290:132::-;10348:7;10375:39;10379:1;10382;10375:39;;;;;;;;;;;;;;;;;:3;:39::i;19154:177::-;19264:58;;;-1:-1:-1;;;;;19264:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19264:58:0;-1:-1:-1;;;19264:58:0;;;19237:86;;19257:5;;19237:19;:86::i;686:106::-;774:10;686:106;:::o;7989:181::-;8047:7;8079:5;;;8103:6;;;;8095:46;;;;;-1:-1:-1;;;8095:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8453:136;8511:7;8538:43;8542:1;8545;8538:43;;;;;;;;;;;;;;;;;:3;:43::i;21459:761::-;21883:23;21909:69;21937:4;21909:69;;;;;;;;;;;;;;;;;21917:5;-1:-1:-1;;;;;21909:27:0;;;:69;;;;;:::i;:::-;21993:17;;21883:95;;-1:-1:-1;21993:21:0;21989:224;;22135:10;22124:30;;;;;;;;;;;;;;;-1:-1:-1;22124:30:0;22116:85;;;;-1:-1:-1;;;22116:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10918:278;11004:7;11039:12;11032:5;11024:28;;;;-1:-1:-1;;;11024:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11063:9;11079:1;11075;:5;;;;;;;10918:278;-1:-1:-1;;;;;10918:278:0:o;8892:192::-;8978:7;9014:12;9006:6;;;;8998:29;;;;-1:-1:-1;;;8998:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9050:5:0;;;8892:192::o;16133:196::-;16236:12;16268:53;16291:6;16299:4;16305:1;16308:12;16268:22;:53::i;:::-;16261:60;16133:196;-1:-1:-1;;;;16133:196:0:o;17510:979::-;17640:12;17673:18;17684:6;17673:10;:18::i;:::-;17665:60;;;;;-1:-1:-1;;;17665:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17799:12;17813:23;17840:6;-1:-1:-1;;;;;17840:11:0;17860:8;17871:4;17840:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17840:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17798:78;;;;17891:7;17887:595;;;17922:10;-1:-1:-1;17915:17:0;;-1:-1:-1;17915:17:0;17887:595;18036:17;;:21;18032:439;;18299:10;18293:17;18360:15;18347:10;18343:2;18339:19;18332:44;18247:148;18435:20;;-1:-1:-1;;;18435:20:0;;;;;;;;;;;;;;;;;18442:12;;18435:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13215:422;13582:20;13621:8;;;13215:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://d766f2f6ea0c6a613d410c8500ebf6863e585a48438cd87875972aa3bc19a384
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.