Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 13 from a total of 13 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 24374443 | 1037 days ago | IN | 0 POL | 0.02624464 | ||||
Deposit | 22076819 | 1097 days ago | IN | 0 POL | 0.02429292 | ||||
Withdraw | 21671797 | 1107 days ago | IN | 0 POL | 0.02284758 | ||||
Deposit | 21560931 | 1110 days ago | IN | 0 POL | 0.01481094 | ||||
Deposit | 21483415 | 1112 days ago | IN | 0 POL | 0.01583658 | ||||
Deposit | 21435091 | 1113 days ago | IN | 0 POL | 0.01847601 | ||||
Withdraw | 21423800 | 1114 days ago | IN | 0 POL | 0.02546049 | ||||
Set_new_fee_addr... | 21410654 | 1114 days ago | IN | 0 POL | 0.00087285 | ||||
Deposit | 21405336 | 1114 days ago | IN | 0 POL | 0.02047083 | ||||
Rebalance | 21279331 | 1117 days ago | IN | 0 POL | 0.02052045 | ||||
Deposit | 21207376 | 1119 days ago | IN | 0 POL | 0.02068335 | ||||
Set_new_APR | 21198472 | 1120 days ago | IN | 0 POL | 0.00078885 | ||||
Set_new_APR | 21198467 | 1120 days ago | IN | 0 POL | 0.00087285 |
Loading...
Loading
Contract Name:
xUSDT
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-11-10 */ // SPDX-License-Identifier: MIT // File: contracts/interfaces/ITreasury.sol pragma solidity 0.6.12; interface ITreasury { function depositToken(address _token) external payable; } // File: contracts/interfaces/LendingPoolAddressesProvider.sol pragma solidity 0.6.12; interface LendingPoolAddressesProvider { function getLendingPool() external view returns (address); function getLendingPoolCollateralManager() external view returns (address); } // File: contracts/interfaces/IIEarnManager.sol pragma solidity 0.6.12; interface IIEarnManager { function recommend(address _token) external view returns ( string memory choice, uint256 fapr, uint256 aapr, uint256 ftapr ); } // File: contracts/interfaces/Fulcrum.sol pragma solidity 0.6.12; interface Fulcrum { function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount); function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function assetBalanceOf(address _owner) external view returns (uint256 balance); } // File: contracts/interfaces/FortubeBank.sol pragma solidity 0.6.12; interface FortubeBank { function deposit(address token, uint256 amount) external payable; function withdraw(address underlying, uint256 withdrawTokens) external returns (uint256); function controller() external returns (address); } // File: contracts/interfaces/FortubeToken.sol pragma solidity 0.6.12; interface FortubeToken { function balanceOf(address _owner) external view returns (uint256 balance); function ONE() external view returns (uint256); function exchangeRateStored() external view returns (uint256); } // File: contracts/interfaces/Aave.sol pragma solidity 0.6.12; interface Aave { function deposit(address _reserve, uint256 _amount, address onBehalfOf, uint16 _referralCode) external; function withdraw(address _token, uint256 _amount, address _to) external returns(uint256); } // File: contracts/libraries/TokenStructs.sol pragma solidity 0.6.12; contract TokenStructs { struct Val { uint256 value; } enum ActionType { Deposit, // supply tokens Withdraw // borrow tokens } enum AssetDenomination { Wei // the amount is denominated in wei } enum AssetReference { Delta // the amount is given as a delta from the current value } struct AssetAmount { bool sign; // true if positive AssetDenomination denomination; AssetReference ref; uint256 value; } struct ActionArgs { ActionType actionType; uint256 accountId; AssetAmount amount; uint256 primaryMarketId; uint256 secondaryMarketId; address otherAddress; uint256 otherAccountId; bytes data; } struct Info { address owner; // The address that owns the account uint256 number; // A nonce that allows a single address to control many accounts } struct Wei { bool sign; // true if positive uint256 value; } event Deposit(address indexed investor, uint256 indexed amount); event Withdraw(address indexed investor, uint256 indexed amount); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/utils/ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @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 on 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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: contracts/libraries/Ownable.sol pragma solidity 0.6.12; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _candidate; 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 virtual 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"); _candidate = newOwner; } function acceptOwnership() external { require(msg.sender == _candidate, "Ownable: not cadidate"); emit OwnershipTransferred(_owner, _candidate); _owner = _candidate; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/token/ERC20/ERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin 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; 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 virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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 virtual { _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/XUSDT.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; contract xUSDT is ERC20, ReentrancyGuard, Ownable, TokenStructs { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; uint256 public pool; address public token; address public fulcrum; address public aave; address public aaveToken; address public apr; address public fortubeToken; address public fortubeBank; address public feeAddress; uint256 public feeAmount; uint256 public feePrecision; mapping (address => uint256) depositedAmount; enum Lender { NONE, AAVE, FULCRUM, FORTUBE } mapping (Lender => bool) public lenderStatus; mapping (Lender => bool) public withdrawable; Lender public provider = Lender.NONE; constructor () public ERC20("xend USDT", "xUSDT") { token = address(0xc2132D05D31c914a87C6611C10748AEb04B58e8F); apr = address(0x3a286653ae8EF3C35eE4849f57aF615eDA7d79ac); aave = address(0xd05e3E715d945B59290df0ae8eF85c1BdB684744); fulcrum = address(0x18D755c981A550B0b8919F1De2CDF882f489c155); aaveToken = address(0x60D55F02A771d515e077c9C2403a1ef324885CeC); fortubeToken = address(0xE2272A850188B43E94eD6DF5b75f1a2FDcd5aC26); fortubeBank = address(0x170371bbcfFf200bFB90333e799B9631A7680Cc5); feeAddress = address(0x9D42c2F50D5e8868B1f11a403f090b8a8b698dbE); feeAmount = 0; feePrecision = 1000; approveToken(); lenderStatus[Lender.AAVE] = true; lenderStatus[Lender.FULCRUM] = false; lenderStatus[Lender.FORTUBE] = true; withdrawable[Lender.AAVE] = true; withdrawable[Lender.FULCRUM] = false; withdrawable[Lender.FORTUBE] = true; } function set_new_APR(address _new_APR) public onlyOwner { apr = _new_APR; } function set_new_feeAmount(uint256 fee) public onlyOwner{ require(fee < feePrecision, 'fee amount must be less than 100%'); feeAmount = fee; } function set_new_fee_address(address _new_fee_address) public onlyOwner { feeAddress = _new_fee_address; } function set_new_feePrecision(uint256 _newFeePrecision) public onlyOwner{ require(_newFeePrecision >= 100, "fee precision must be greater than 100 at least"); set_new_feeAmount(feeAmount*_newFeePrecision/feePrecision); feePrecision = _newFeePrecision; } // Quick swap low gas method for pool swaps function deposit(uint256 _amount) external nonReentrant { require(_amount > 0, "deposit must be greater than 0"); pool = _calcPoolValueInToken(); IERC20(token).safeTransferFrom(msg.sender, address(this), _amount); rebalance(); // Calculate pool shares uint256 shares = 0; if (pool == 0) { shares = _amount; pool = _amount; } else { if (totalSupply() == 0) { shares = _amount; } else { shares = (_amount.mul(totalSupply())).div(pool); } } pool = _calcPoolValueInToken(); _mint(msg.sender, shares); depositedAmount[msg.sender] = depositedAmount[msg.sender].add(_amount); emit Deposit(msg.sender, _amount); } // No rebalance implementation for lower fees and faster swaps function withdraw(uint256 _shares) external nonReentrant { require(_shares > 0, "withdraw must be greater than 0"); uint256 ibalance = balanceOf(msg.sender); require(_shares <= ibalance, "insufficient balance"); // Could have over value from xTokens pool = _calcPoolValueInToken(); uint256 i = (pool.mul(ibalance)).div(totalSupply()); // Calc to redeem before updating balances uint256 r = (pool.mul(_shares)).div(totalSupply()); if(i < depositedAmount[msg.sender]){ i = i.add(1); r = r.add(1); } uint256 profit = (i.sub(depositedAmount[msg.sender])).mul(_shares.div(depositedAmount[msg.sender])); emit Transfer(msg.sender, address(0), _shares); // Check balance uint256 b = IERC20(token).balanceOf(address(this)); if (b < r) { _withdrawSome(r.sub(b)); } uint256 fee = profit.mul(feeAmount).div(feePrecision); if(fee > 0){ IERC20(token).approve(feeAddress, fee); ITreasury(feeAddress).depositToken(token); } IERC20(token).safeTransfer(msg.sender, r.sub(fee)); _burn(msg.sender, _shares); depositedAmount[msg.sender] = depositedAmount[msg.sender].sub(_shares.mul(depositedAmount[msg.sender]).div(ibalance)); rebalance(); pool = _calcPoolValueInToken(); emit Withdraw(msg.sender, _shares); } receive() external payable {} function recommend() public view returns (Lender) { (, uint256 fapr,uint256 aapr, uint256 ftapr) = IIEarnManager(apr).recommend(token); uint256 max = 0; if (fapr > max && lenderStatus[Lender.FULCRUM]) { max = fapr; } if (aapr > max && lenderStatus[Lender.AAVE]) { max = aapr; } if (ftapr > max && lenderStatus[Lender.FORTUBE]) { max = ftapr; } Lender newProvider = Lender.NONE; if (max == aapr) { newProvider = Lender.AAVE; } else if (max == fapr) { newProvider = Lender.FULCRUM; } else if (max == ftapr) { newProvider = Lender.FORTUBE; } return newProvider; } function getAave() public view returns (address) { return LendingPoolAddressesProvider(aave).getLendingPool(); } function getDepositedAmount(address investor) public view returns (uint256) { return depositedAmount[investor]; } function approveToken() public { IERC20(token).approve(getAave(), uint(-1)); IERC20(token).approve(fulcrum, uint(-1)); IERC20(token).approve(FortubeBank(fortubeBank).controller(), uint(-1)); } function balanceFortubeInToken() external view returns (uint256) { return _balanceFortubeInToken(); } function balance() external view returns (uint256) { return _balance(); } function balanceFulcrumInToken() external view returns (uint256) { return _balanceFulcrumInToken(); } function balanceFulcrum() external view returns (uint256) { return _balanceFulcrum(); } function balanceAave() external view returns (uint256) { return _balanceAave(); } function balanceFortube() external view returns (uint256) { return _balanceFortube(); } function _balance() internal view returns (uint256) { return IERC20(token).balanceOf(address(this)); } function _balanceFulcrumInToken() internal view returns (uint256) { uint256 b = _balanceFulcrum(); if (b > 0 && withdrawable[Lender.FULCRUM]) { b = Fulcrum(fulcrum).assetBalanceOf(address(this)); } return b; } function _balanceFortubeInToken() internal view returns (uint256) { uint256 b = _balanceFortube(); if (b > 0 && withdrawable[Lender.FORTUBE]) { uint256 exchangeRate = FortubeToken(fortubeToken).exchangeRateStored(); uint256 oneAmount = FortubeToken(fortubeToken).ONE(); b = b.mul(exchangeRate).div(oneAmount); } return b; } function _balanceFulcrum() internal view returns (uint256) { if(withdrawable[Lender.FULCRUM]) return IERC20(fulcrum).balanceOf(address(this)); else return 0; } function _balanceAave() internal view returns (uint256) { if(withdrawable[Lender.AAVE]) return IERC20(aaveToken).balanceOf(address(this)); else return 0; } function _balanceFortube() internal view returns (uint256) { if(withdrawable[Lender.FORTUBE]) return FortubeToken(fortubeToken).balanceOf(address(this)); else return 0; } function _withdrawAll() internal { uint256 amount = _balanceFulcrum(); if (amount > 0) { _withdrawFulcrum(amount); } amount = _balanceAave(); if (amount > 0) { _withdrawAave(amount); } amount = _balanceFortube(); if (amount > 0) { _withdrawFortube(amount); } } function _withdrawSomeFulcrum(uint256 _amount) internal { uint256 b = _balanceFulcrum(); // Balance of token in fulcrum uint256 bT = _balanceFulcrumInToken(); require(bT >= _amount, "insufficient funds"); // can have unintentional rounding errors uint256 amount = (b.mul(_amount)).div(bT).add(1); _withdrawFulcrum(amount); } function _withdrawSomeFortube(uint256 _amount) internal { uint256 b = _balanceFortube(); uint256 bT = _balanceFortubeInToken(); require(bT >= _amount, "insufficient funds"); uint256 amount = (b.mul(_amount)).div(bT).add(1); _withdrawFortube(amount); } function _withdrawSome(uint256 _amount) internal { if (provider == Lender.AAVE) { require(_balanceAave() >= _amount, "insufficient funds"); _withdrawAave(_amount); } if (provider == Lender.FULCRUM) { _withdrawSomeFulcrum(_amount); } if (provider == Lender.FORTUBE) { _withdrawSomeFortube(_amount); } } function rebalance() public { Lender newProvider = recommend(); if (newProvider != provider) { _withdrawAll(); } if (_balance() > 0) { if (newProvider == Lender.FULCRUM) { supplyFulcrum(_balance()); } else if (newProvider == Lender.AAVE) { supplyAave(_balance()); } else if (newProvider == Lender.FORTUBE) { supplyFortube(_balance()); } } provider = newProvider; } function supplyAave(uint amount) public { Aave(getAave()).deposit(token, amount, address(this), 0); } function supplyFulcrum(uint amount) public { require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed"); } function supplyFortube(uint amount) public { require(amount > 0, "FORTUBE: supply failed"); FortubeBank(fortubeBank).deposit(token, amount); } function _withdrawAave(uint amount) internal { require(Aave(getAave()).withdraw(token, amount, address(this)) > 0, "AAVE: withdraw failed"); } function _withdrawFulcrum(uint amount) internal { require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed"); } function _withdrawFortube(uint amount) internal { require(FortubeBank(fortubeBank).withdraw(token, amount) > 0, "Fortube: withdraw failed"); } function _calcPoolValueInToken() internal view returns (uint) { return _balanceFulcrumInToken() .add(_balanceAave()) .add(_balanceFortubeInToken()) .add(_balance()); } function calcPoolValueInToken() public view returns (uint) { return _calcPoolValueInToken(); } function getPricePerFullShare() public view returns (uint) { uint _pool = _calcPoolValueInToken(); return _pool.mul(1e18).div(totalSupply()); } function activateLender(Lender lender) public onlyOwner { lenderStatus[lender] = true; withdrawable[lender] = true; rebalance(); } function deactivateWithdrawableLender(Lender lender) public onlyOwner { lenderStatus[lender] = false; rebalance(); } function deactivateNonWithdrawableLender(Lender lender) public onlyOwner { lenderStatus[lender] = false; withdrawable[lender] = false; rebalance(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"investor","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"investor","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum xUSDT.Lender","name":"lender","type":"uint8"}],"name":"activateLender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceFortube","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceFortubeInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum xUSDT.Lender","name":"lender","type":"uint8"}],"name":"deactivateNonWithdrawableLender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum xUSDT.Lender","name":"lender","type":"uint8"}],"name":"deactivateWithdrawableLender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePrecision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fortubeBank","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fortubeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"getDepositedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum xUSDT.Lender","name":"","type":"uint8"}],"name":"lenderStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provider","outputs":[{"internalType":"enum xUSDT.Lender","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recommend","outputs":[{"internalType":"enum xUSDT.Lender","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_APR","type":"address"}],"name":"set_new_APR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"set_new_feeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFeePrecision","type":"uint256"}],"name":"set_new_feePrecision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_fee_address","type":"address"}],"name":"set_new_fee_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFortube","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum xUSDT.Lender","name":"","type":"uint8"}],"name":"withdrawable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526017805460ff191690553480156200001b57600080fd5b5060408051808201825260098152681e195b99081554d11560ba1b6020808301918252835180850190945260058452641e1554d11560da1b9084015281519192916200006a91600391620005c2565b50805162000080906004906020840190620005c2565b50506005805460ff191660121790555060016006556000620000a16200030b565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a80546001600160a01b031990811673c2132d05d31c914a87c6611c10748aeb04b58e8f17909155600e80548216733a286653ae8ef3c35ee4849f57af615eda7d79ac179055600c8054821673d05e3e715d945b59290df0ae8ef85c1bdb684744179055600b805482167318d755c981a550b0b8919f1de2cdf882f489c155179055600d805482167360d55f02a771d515e077c9c2403a1ef324885cec179055600f8054821673e2272a850188b43e94ed6df5b75f1a2fdcd5ac2617905560108054821673170371bbcfff200bfb90333e799b9631a7680cc517905560118054909116739d42c2f50d5e8868b1f11a403f090b8a8b698dbe17905560006012556103e8601355620002006200030f565b7f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d8054600160ff1991821681179092557f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b8054821690557fb3a65e8276bd33b3e4f7d6081ebd9899187264822358758dca2e2bc37b2a9c27805482168317905560166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4980548216831790557fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564880548216905560036000527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae80549091169091179055620006c9565b3390565b600a546001600160a01b031663095ea7b36200032a6200053c565b6000196040518363ffffffff1660e01b81526004016200034c929190620006b0565b602060405180830381600087803b1580156200036757600080fd5b505af11580156200037c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a291906200068e565b50600a54600b5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392620003dd9291169060001990600401620006b0565b602060405180830381600087803b158015620003f857600080fd5b505af11580156200040d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043391906200068e565b50600a546010546040805163f77c479160e01b815290516001600160a01b039384169363095ea7b393169163f77c47919160048083019260209291908290030181600087803b1580156200048657600080fd5b505af11580156200049b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c191906200065e565b6000196040518363ffffffff1660e01b8152600401620004e3929190620006b0565b602060405180830381600087803b158015620004fe57600080fd5b505af115801562000513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200053991906200068e565b50565b600c5460408051630261bf8b60e01b815290516000926001600160a01b031691630261bf8b916004808301926020929190829003018186803b1580156200058257600080fd5b505afa15801562000597573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005bd91906200065e565b905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200060557805160ff191683800117855562000635565b8280016001018555821562000635579182015b828111156200063557825182559160200191906001019062000618565b506200064392915062000647565b5090565b5b8082111562000643576000815560010162000648565b60006020828403121562000670578081fd5b81516001600160a01b038116811462000687578182fd5b9392505050565b600060208284031215620006a0578081fd5b8151801515811462000687578182fd5b6001600160a01b03929092168252602082015260400190565b61361e80620006d96000396000f3fe6080604052600436106103395760003560e01c806378b423af116101ab578063ad4c6592116100f7578063f5a41dea11610095578063fc0c546a1161006f578063fc0c546a14610894578063fe476e01146108a9578063fe582e24146108c9578063fedf23fc146108e957610340565b8063f5a41dea1461084a578063f7c1ec771461085f578063f9a252821461087457610340565b8063cf8ca426116100d1578063cf8ca426146107d5578063dd62ed3e146107ea578063e9081ec71461080a578063f2fde38b1461082a57610340565b8063ad4c65921461078b578063b69ef8a8146107a0578063b6b55f25146107b557610340565b80639218b52e116101645780639c7266bc1161013e5780639c7266bc14610716578063a160176d14610736578063a457c2d71461074b578063a9059cbb1461076b57610340565b80639218b52e146106cc57806395d89b41146106ec57806399b71d5c1461070157610340565b806378b423af1461064357806379ba5097146106585780637d7c2a1c1461066d5780638124955c14610682578063819faf7b146106a25780638da5cb5b146106b757610340565b8063395093511161028557806358782c211161022357806370a08231116101fd57806370a08231146105e45780637137ef9914610604578063715018a61461061957806377c7b8fc1461062e57610340565b806358782c211461059a57806365aab749146105af57806369e15404146105cf57610340565b8063463574731161025f578063463574731461053057806349b4e9c814610550578063546b66151461056557806357ded9c91461058557610340565b806339509351146104db57806341275358146104fb57806344d40d7f1461051057610340565b806316f0115b116102f257806325305c73116102cc57806325305c73146104625780632e1a7d4d14610482578063313ce567146104a457806335ff1e28146104c657610340565b806316f0115b1461041857806318160ddd1461042d57806323b872dd1461044257610340565b806306a3fe591461034557806306fdde0314610370578063085d488314610392578063095ea7b3146103b45780630eb2a267146103e157806310a325191461040357610340565b3661034057005b600080fd5b34801561035157600080fd5b5061035a610909565b6040516103679190612d9e565b60405180910390f35b34801561037c57600080fd5b50610385610918565b6040516103679190612e5e565b34801561039e57600080fd5b506103a76109af565b6040516103679190612e4a565b3480156103c057600080fd5b506103d46103cf366004612c41565b6109b8565b6040516103679190612e3f565b3480156103ed57600080fd5b506103f66109d6565b60405161036791906134b4565b34801561040f57600080fd5b506103f66109e5565b34801561042457600080fd5b506103f66109ef565b34801561043957600080fd5b506103f66109f5565b34801561044e57600080fd5b506103d461045d366004612c01565b6109fb565b34801561046e57600080fd5b506103d461047d366004612c8c565b610a83565b34801561048e57600080fd5b506104a261049d366004612d52565b610a98565b005b3480156104b057600080fd5b506104b9610e81565b60405161036791906134bd565b3480156104d257600080fd5b506103f6610e8a565b3480156104e757600080fd5b506103d46104f6366004612c41565b610e90565b34801561050757600080fd5b5061035a610ede565b34801561051c57600080fd5b506104a261052b366004612c8c565b610eed565b34801561053c57600080fd5b506104a261054b366004612b91565b610f73565b34801561055c57600080fd5b5061035a610fd4565b34801561057157600080fd5b506104a2610580366004612d52565b610fe3565b34801561059157600080fd5b5061035a611060565b3480156105a657600080fd5b5061035a61106f565b3480156105bb57600080fd5b506104a26105ca366004612d52565b61107e565b3480156105db57600080fd5b506103f66110f3565b3480156105f057600080fd5b506103f66105ff366004612b91565b6110f9565b34801561061057600080fd5b506103f6611114565b34801561062557600080fd5b506104a261111e565b34801561063a57600080fd5b506103f66111a7565b34801561064f57600080fd5b506103f66111d7565b34801561066457600080fd5b506104a26111e1565b34801561067957600080fd5b506104a261126e565b34801561068e57600080fd5b506104a261069d366004612d52565b611338565b3480156106ae57600080fd5b5061035a6113da565b3480156106c357600080fd5b5061035a6113e9565b3480156106d857600080fd5b506104a26106e7366004612b91565b6113f8565b3480156106f857600080fd5b50610385611459565b34801561070d57600080fd5b506104a26114ba565b34801561072257600080fd5b506103d4610731366004612c8c565b6116cc565b34801561074257600080fd5b506103a76116e1565b34801561075757600080fd5b506103d4610766366004612c41565b611879565b34801561077757600080fd5b506103d4610786366004612c41565b6118e1565b34801561079757600080fd5b5061035a6118f5565b3480156107ac57600080fd5b506103f6611904565b3480156107c157600080fd5b506104a26107d0366004612d52565b61190e565b3480156107e157600080fd5b506103f6611a38565b3480156107f657600080fd5b506103f6610805366004612bc9565b611a42565b34801561081657600080fd5b506103f6610825366004612b91565b611a6d565b34801561083657600080fd5b506104a2610845366004612b91565b611a88565b34801561085657600080fd5b506103f6611b0f565b34801561086b57600080fd5b5061035a611b19565b34801561088057600080fd5b506104a261088f366004612c8c565b611b96565b3480156108a057600080fd5b5061035a611c29565b3480156108b557600080fd5b506104a26108c4366004612d52565b611c38565b3480156108d557600080fd5b506104a26108e4366004612d52565b611c9d565b3480156108f557600080fd5b506104a2610904366004612c8c565b611cf3565b600d546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109a45780601f10610979576101008083540402835291602001916109a4565b820191906000526020600020905b81548152906001019060200180831161098757829003601f168201915b505050505090505b90565b60175460ff1681565b60006109cc6109c5611d86565b8484611d8a565b5060015b92915050565b60006109e0611e3e565b905090565b60006109e0611f03565b60095481565b60025490565b6000610a0884848461206f565b610a7884610a14611d86565b610a738560405180606001604052806028815260200161357c602891396001600160a01b038a16600090815260016020526040812090610a52611d86565b6001600160a01b031681526020810191909152604001600020549190612172565b611d8a565b5060015b9392505050565b60166020526000908152604090205460ff1681565b60026006541415610ac45760405162461bcd60e51b8152600401610abb90613446565b60405180910390fd5b600260065580610ae65760405162461bcd60e51b8152600401610abb9061316a565b6000610af1336110f9565b905080821115610b135760405162461bcd60e51b8152600401610abb9061313c565b610b1b61219e565b6009556000610b3e610b2b6109f5565b600954610b3890856121cf565b90612209565b90506000610b5a610b4d6109f5565b600954610b3890876121cf565b33600090815260146020526040902054909150821015610b8f57610b7f82600161223b565b9150610b8c81600161223b565b90505b33600090815260146020526040812054610bcf90610bae908790612209565b33600090815260146020526040902054610bc9908690612260565b906121cf565b905060006001600160a01b0316336001600160a01b03166000805160206135a483398151915287604051610c0391906134b4565b60405180910390a3600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c3c903090600401612d9e565b60206040518083038186803b158015610c5457600080fd5b505afa158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8c9190612d6a565b905082811015610ca857610ca8610ca38483612260565b612288565b6000610cc5601354610b38601254866121cf90919063ffffffff16565b90508015610dbd57600a5460115460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610d03929116908590600401612db2565b602060405180830381600087803b158015610d1d57600080fd5b505af1158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d559190612c6c565b50601154600a54604051632fd5526560e01b81526001600160a01b0392831692632fd5526592610d8a92911690600401612d9e565b600060405180830381600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050505b610dde33610dcb8684612260565b600a546001600160a01b03169190612315565b610de83388612370565b33600090815260146020526040902054610e2390610e0d908890610b38908b906121cf565b3360009081526014602052604090205490612260565b33600090815260146020526040902055610e3b61126e565b610e4361219e565b600955604051879033907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490600090a3505060016006555050505050565b60055460ff1690565b60135481565b60006109cc610e9d611d86565b84610a738560016000610eae611d86565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061223b565b6011546001600160a01b031681565b610ef5611d86565b6001600160a01b0316610f066113e9565b6001600160a01b031614610f2c5760405162461bcd60e51b8152600401610abb90613107565b600060156000836003811115610f3e57fe5b6003811115610f4957fe5b81526020810191909152604001600020805460ff1916911515919091179055610f7061126e565b50565b610f7b611d86565b6001600160a01b0316610f8c6113e9565b6001600160a01b031614610fb25760405162461bcd60e51b8152600401610abb90613107565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600f546001600160a01b031681565b610feb611d86565b6001600160a01b0316610ffc6113e9565b6001600160a01b0316146110225760405162461bcd60e51b8152600401610abb90613107565b60648110156110435760405162461bcd60e51b8152600401610abb90613346565b61105b60135482601254028161105557fe5b04611c38565b601355565b600e546001600160a01b031681565b600b546001600160a01b031681565b611086611b19565b600a5460405163e8eda9df60e01b81526001600160a01b039283169263e8eda9df926110be9291169085903090600090600401612e12565b600060405180830381600087803b1580156110d857600080fd5b505af11580156110ec573d6000803e3d6000fd5b5050505050565b60125481565b6001600160a01b031660009081526020819052604090205490565b60006109e061219e565b611126611d86565b6001600160a01b03166111376113e9565b6001600160a01b03161461115d5760405162461bcd60e51b8152600401610abb90613107565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b6000806111b261219e565b90506111d16111bf6109f5565b610b3883670de0b6b3a76400006121cf565b91505090565b60006109e0612440565b6008546001600160a01b0316331461120b5760405162461bcd60e51b8152600401610abb90612ed4565b6008546007546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600854600780546001600160a01b0319166001600160a01b03909216919091179055565b60006112786116e1565b60175490915060ff16600381111561128c57fe5b81600381111561129857fe5b146112a5576112a56124a6565b60006112af6124f3565b11156113175760028160038111156112c357fe5b14156112d9576112d461069d6124f3565b611317565b60018160038111156112e757fe5b14156112f8576112d46105ca6124f3565b600381600381111561130657fe5b1415611317576113176108e46124f3565b6017805482919060ff1916600183600381111561133057fe5b021790555050565b600b546040516340c10f1960e01b81526000916001600160a01b0316906340c10f199061136b9030908690600401612db2565b602060405180830381600087803b15801561138557600080fd5b505af1158015611399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bd9190612d6a565b11610f705760405162461bcd60e51b8152600401610abb90613395565b600c546001600160a01b031681565b6007546001600160a01b031690565b611400611d86565b6001600160a01b03166114116113e9565b6001600160a01b0316146114375760405162461bcd60e51b8152600401610abb90613107565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109a45780601f10610979576101008083540402835291602001916109a4565b600a546001600160a01b031663095ea7b36114d3611b19565b6000196040518363ffffffff1660e01b81526004016114f3929190612db2565b602060405180830381600087803b15801561150d57600080fd5b505af1158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190612c6c565b50600a54600b5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261157e9291169060001990600401612db2565b602060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190612c6c565b50600a546010546040805163f77c479160e01b815290516001600160a01b039384169363095ea7b393169163f77c47919160048083019260209291908290030181600087803b15801561162257600080fd5b505af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a9190612bad565b6000196040518363ffffffff1660e01b815260040161167a929190612db2565b602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612c6c565b60156020526000908152604090205460ff1681565b600e54600a546040516303622f8f60e61b81526000928392839283926001600160a01b039081169263d88be3c09261171f9290911690600401612d9e565b60006040518083038186803b15801561173757600080fd5b505afa15801561174b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117739190810190612cab565b93509350935050600080841180156117b65750600260005260156020527f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b5460ff165b156117be5750825b80831180156117f85750600160005260156020527f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d5460ff165b156118005750815b808211801561183a5750600360005260156020527fb3a65e8276bd33b3e4f7d6081ebd9899187264822358758dca2e2bc37b2a9c275460ff165b156118425750805b60008382141561185457506001611870565b8482141561186457506002611870565b82821415611870575060035b94505050505090565b60006109cc611886611d86565b84610a73856040518060600160405280602581526020016135c460259139600160006118b0611d86565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612172565b60006109cc6118ee611d86565b848461206f565b6010546001600160a01b031681565b60006109e06124f3565b600260065414156119315760405162461bcd60e51b8152600401610abb90613446565b6002600655806119535760405162461bcd60e51b8152600401610abb906132d8565b61195b61219e565b600955600a54611976906001600160a01b0316333084612574565b61197e61126e565b60006009546000141561199757506009819055806119c5565b61199f6109f5565b6119aa5750806119c5565b6119c2600954610b386119bb6109f5565b85906121cf565b90505b6119cd61219e565b6009556119da338261259b565b336000908152601460205260409020546119f4908361223b565b3360008181526014602052604080822093909355915184927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91a350506001600655565b60006109e061263d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b031660009081526014602052604090205490565b611a90611d86565b6001600160a01b0316611aa16113e9565b6001600160a01b031614611ac75760405162461bcd60e51b8152600401610abb90613107565b6001600160a01b038116611aed5760405162461bcd60e51b8152600401610abb90612f03565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109e06126a3565b600c5460408051630261bf8b60e01b815290516000926001600160a01b031691630261bf8b916004808301926020929190829003018186803b158015611b5e57600080fd5b505afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190612bad565b611b9e611d86565b6001600160a01b0316611baf6113e9565b6001600160a01b031614611bd55760405162461bcd60e51b8152600401610abb90613107565b600060156000836003811115611be757fe5b6003811115611bf257fe5b815260200190815260200160002060006101000a81548160ff021916908315150217905550600060166000836003811115610f3e57fe5b600a546001600160a01b031681565b611c40611d86565b6001600160a01b0316611c516113e9565b6001600160a01b031614611c775760405162461bcd60e51b8152600401610abb90613107565b6013548110611c985760405162461bcd60e51b8152600401610abb906131e2565b601255565b60008111611cbd5760405162461bcd60e51b8152600401610abb9061305f565b601054600a546040516311f9fbc960e21b81526001600160a01b03928316926347e7ef24926110be929116908590600401612db2565b611cfb611d86565b6001600160a01b0316611d0c6113e9565b6001600160a01b031614611d325760405162461bcd60e51b8152600401610abb90613107565b600160156000836003811115611d4457fe5b6003811115611d4f57fe5b815260200190815260200160002060006101000a81548160ff021916908315150217905550600160166000836003811115610f3e57fe5b3390565b6001600160a01b038316611db05760405162461bcd60e51b8152600401610abb90613294565b6001600160a01b038216611dd65760405162461bcd60e51b8152600401610abb90612f49565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611e319085906134b4565b60405180910390a3505050565b6002600090815260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff1615611efb57600b546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef49190612d6a565b90506109ac565b5060006109ac565b600080611f0e612440565b9050600081118015611f4b5750600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae5460ff165b156109e057600f546040805163182df0f560e01b815290516000926001600160a01b03169163182df0f5916004808301926020929190829003018186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd9190612d6a565b90506000600f60009054906101000a90046001600160a01b03166001600160a01b031663c2ee3a086040518163ffffffff1660e01b815260040160206040518083038186803b15801561201f57600080fd5b505afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120579190612d6a565b905061206781610b3885856121cf565b949350505050565b6001600160a01b0383166120955760405162461bcd60e51b8152600401610abb90613223565b6001600160a01b0382166120bb5760405162461bcd60e51b8152600401610abb90612e91565b6120c683838361236b565b61210381604051806060016040528060268152602001613556602691396001600160a01b0386166000908152602081905260409020549190612172565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612132908261223b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516906000805160206135a483398151915290611e319085906134b4565b600081848411156121965760405162461bcd60e51b8152600401610abb9190612e5e565b505050900390565b60006109e06121ab6124f3565b6121c96121b6611f03565b6121c96121c161263d565b6121c96126a3565b9061223b565b6000826121de575060006109d0565b828202828482816121eb57fe5b0414610a7c5760405162461bcd60e51b8152600401610abb9061308f565b600080821161222a5760405162461bcd60e51b8152600401610abb90612ff9565b81838161223357fe5b049392505050565b600082820183811015610a7c5760405162461bcd60e51b8152600401610abb90612f8b565b6000828211156122825760405162461bcd60e51b8152600401610abb90612fc2565b50900390565b600160175460ff16600381111561229b57fe5b14156122d157806122aa61263d565b10156122c85760405162461bcd60e51b8152600401610abb90613268565b6122d181612770565b600260175460ff1660038111156122e457fe5b14156122f3576122f38161281e565b600360175460ff16600381111561230657fe5b1415610f7057610f7081612876565b61236b8363a9059cbb60e01b8484604051602401612334929190612db2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526128ce565b505050565b6001600160a01b0382166123965760405162461bcd60e51b8152600401610abb906131a1565b6123a28260008361236b565b6123df81604051806060016040528060228152602001613534602291396001600160a01b0385166000908152602081905260409020549190612172565b6001600160a01b0383166000908152602081905260409020556002546124059082612260565b6002556040516000906001600160a01b038416906000805160206135a4833981519152906124349085906134b4565b60405180910390a35050565b6003600090815260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae5460ff1615611efb57600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b60006124b0611e3e565b905080156124c1576124c18161295d565b6124c961263d565b905080156124da576124da81612770565b6124e2612440565b90508015610f7057610f70816129ff565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612524903090600401612d9e565b60206040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190612d6a565b612595846323b872dd60e01b85858560405160240161233493929190612dcb565b50505050565b6001600160a01b0382166125c15760405162461bcd60e51b8152600401610abb9061347d565b6125cd6000838361236b565b6002546125da908261223b565b6002556001600160a01b038216600090815260208190526040902054612600908261223b565b6001600160a01b0383166000818152602081905260408082209390935591519091906000805160206135a4833981519152906124349085906134b4565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff1615611efb57600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b6000806126ae611e3e565b90506000811180156126eb5750600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff165b156109e057600b54604051630359f7eb60e11b81526001600160a01b03909116906306b3efd690612720903090600401612d9e565b60206040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612d6a565b600061277a611b19565b600a54604051631a4ca37b60e21b81526001600160a01b03928316926369328dec926127af9291169086903090600401612def565b602060405180830381600087803b1580156127c957600080fd5b505af11580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190612d6a565b11610f705760405162461bcd60e51b8152600401610abb90613030565b6000612828611e3e565b905060006128346126a3565b9050828110156128565760405162461bcd60e51b8152600401610abb90613268565b600061286b60016121c984610b3887896121cf565b90506125958161295d565b6000612880612440565b9050600061288c611f03565b9050828110156128ae5760405162461bcd60e51b8152600401610abb90613268565b60006128c360016121c984610b3887896121cf565b9050612595816129ff565b6060612923826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612aa89092919063ffffffff16565b80519091501561236b57808060200190518101906129419190612c6c565b61236b5760405162461bcd60e51b8152600401610abb906133c5565b600b54604051632770a7eb60e21b81526000916001600160a01b031690639dc29fac906129909030908690600401612db2565b602060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190612d6a565b11610f705760405162461bcd60e51b8152600401610abb906130d0565b601054600a5460405163f3fef3a360e01b81526000926001600160a01b039081169263f3fef3a392612a3992909116908690600401612db2565b602060405180830381600087803b158015612a5357600080fd5b505af1158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190612d6a565b11610f705760405162461bcd60e51b8152600401610abb9061340f565b6060612067848460008585612abc85612b52565b612ad85760405162461bcd60e51b8152600401610abb9061330f565b60006060866001600160a01b03168587604051612af59190612d82565b60006040518083038185875af1925050503d8060008114612b32576040519150601f19603f3d011682016040523d82523d6000602084013e612b37565b606091505b5091509150612b47828286612b58565b979650505050505050565b3b151590565b60608315612b67575081610a7c565b825115612b775782518084602001fd5b8160405162461bcd60e51b8152600401610abb9190612e5e565b600060208284031215612ba2578081fd5b8135610a7c8161351e565b600060208284031215612bbe578081fd5b8151610a7c8161351e565b60008060408385031215612bdb578081fd5b8235612be68161351e565b91506020830135612bf68161351e565b809150509250929050565b600080600060608486031215612c15578081fd5b8335612c208161351e565b92506020840135612c308161351e565b929592945050506040919091013590565b60008060408385031215612c53578182fd5b8235612c5e8161351e565b946020939093013593505050565b600060208284031215612c7d578081fd5b81518015158114610a7c578182fd5b600060208284031215612c9d578081fd5b813560048110610a7c578182fd5b60008060008060808587031215612cc0578081fd5b845167ffffffffffffffff80821115612cd7578283fd5b818701915087601f830112612cea578283fd5b815181811115612cf8578384fd5b612d0b601f8201601f19166020016134cb565b9150808252886020828501011115612d21578384fd5b612d328160208401602086016134f2565b506020870151604088015160609098015191999098509095509350505050565b600060208284031215612d63578081fd5b5035919050565b600060208284031215612d7b578081fd5b5051919050565b60008251612d948184602087016134f2565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b901515815260200190565b6020810160048310612e5857fe5b91905290565b6000602082528251806020840152612e7d8160408501602087016134f2565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601590820152744f776e61626c653a206e6f7420636164696461746560581b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260159082015274105055914e881dda5d1a191c985dc819985a5b1959605a1b604082015260600190565b6020808252601690820152751193d4951550914e881cdd5c1c1b1e4819985a5b195960521b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526018908201527f46554c4352554d3a207769746864726177206661696c65640000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252601f908201527f7769746864726177206d7573742062652067726561746572207468616e203000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526021908201527f66656520616d6f756e74206d757374206265206c657373207468616e203130306040820152602560f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601e908201527f6465706f736974206d7573742062652067726561746572207468616e20300000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f66656520707265636973696f6e206d757374206265206772656174657220746860408201526e185b880c4c0c08185d081b19585cdd608a1b606082015260800190565b60208082526016908201527511955310d495534e881cdd5c1c1b1e4819985a5b195960521b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526018908201527f466f72747562653a207769746864726177206661696c65640000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156134ea57600080fd5b604052919050565b60005b8381101561350d5781810151838201526020016134f5565b838111156125955750506000910152565b6001600160a01b0381168114610f7057600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220acd73d27d604df78102ad3115cad170a8bb58b6495fa2be0bcc46656daec00f964736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106103395760003560e01c806378b423af116101ab578063ad4c6592116100f7578063f5a41dea11610095578063fc0c546a1161006f578063fc0c546a14610894578063fe476e01146108a9578063fe582e24146108c9578063fedf23fc146108e957610340565b8063f5a41dea1461084a578063f7c1ec771461085f578063f9a252821461087457610340565b8063cf8ca426116100d1578063cf8ca426146107d5578063dd62ed3e146107ea578063e9081ec71461080a578063f2fde38b1461082a57610340565b8063ad4c65921461078b578063b69ef8a8146107a0578063b6b55f25146107b557610340565b80639218b52e116101645780639c7266bc1161013e5780639c7266bc14610716578063a160176d14610736578063a457c2d71461074b578063a9059cbb1461076b57610340565b80639218b52e146106cc57806395d89b41146106ec57806399b71d5c1461070157610340565b806378b423af1461064357806379ba5097146106585780637d7c2a1c1461066d5780638124955c14610682578063819faf7b146106a25780638da5cb5b146106b757610340565b8063395093511161028557806358782c211161022357806370a08231116101fd57806370a08231146105e45780637137ef9914610604578063715018a61461061957806377c7b8fc1461062e57610340565b806358782c211461059a57806365aab749146105af57806369e15404146105cf57610340565b8063463574731161025f578063463574731461053057806349b4e9c814610550578063546b66151461056557806357ded9c91461058557610340565b806339509351146104db57806341275358146104fb57806344d40d7f1461051057610340565b806316f0115b116102f257806325305c73116102cc57806325305c73146104625780632e1a7d4d14610482578063313ce567146104a457806335ff1e28146104c657610340565b806316f0115b1461041857806318160ddd1461042d57806323b872dd1461044257610340565b806306a3fe591461034557806306fdde0314610370578063085d488314610392578063095ea7b3146103b45780630eb2a267146103e157806310a325191461040357610340565b3661034057005b600080fd5b34801561035157600080fd5b5061035a610909565b6040516103679190612d9e565b60405180910390f35b34801561037c57600080fd5b50610385610918565b6040516103679190612e5e565b34801561039e57600080fd5b506103a76109af565b6040516103679190612e4a565b3480156103c057600080fd5b506103d46103cf366004612c41565b6109b8565b6040516103679190612e3f565b3480156103ed57600080fd5b506103f66109d6565b60405161036791906134b4565b34801561040f57600080fd5b506103f66109e5565b34801561042457600080fd5b506103f66109ef565b34801561043957600080fd5b506103f66109f5565b34801561044e57600080fd5b506103d461045d366004612c01565b6109fb565b34801561046e57600080fd5b506103d461047d366004612c8c565b610a83565b34801561048e57600080fd5b506104a261049d366004612d52565b610a98565b005b3480156104b057600080fd5b506104b9610e81565b60405161036791906134bd565b3480156104d257600080fd5b506103f6610e8a565b3480156104e757600080fd5b506103d46104f6366004612c41565b610e90565b34801561050757600080fd5b5061035a610ede565b34801561051c57600080fd5b506104a261052b366004612c8c565b610eed565b34801561053c57600080fd5b506104a261054b366004612b91565b610f73565b34801561055c57600080fd5b5061035a610fd4565b34801561057157600080fd5b506104a2610580366004612d52565b610fe3565b34801561059157600080fd5b5061035a611060565b3480156105a657600080fd5b5061035a61106f565b3480156105bb57600080fd5b506104a26105ca366004612d52565b61107e565b3480156105db57600080fd5b506103f66110f3565b3480156105f057600080fd5b506103f66105ff366004612b91565b6110f9565b34801561061057600080fd5b506103f6611114565b34801561062557600080fd5b506104a261111e565b34801561063a57600080fd5b506103f66111a7565b34801561064f57600080fd5b506103f66111d7565b34801561066457600080fd5b506104a26111e1565b34801561067957600080fd5b506104a261126e565b34801561068e57600080fd5b506104a261069d366004612d52565b611338565b3480156106ae57600080fd5b5061035a6113da565b3480156106c357600080fd5b5061035a6113e9565b3480156106d857600080fd5b506104a26106e7366004612b91565b6113f8565b3480156106f857600080fd5b50610385611459565b34801561070d57600080fd5b506104a26114ba565b34801561072257600080fd5b506103d4610731366004612c8c565b6116cc565b34801561074257600080fd5b506103a76116e1565b34801561075757600080fd5b506103d4610766366004612c41565b611879565b34801561077757600080fd5b506103d4610786366004612c41565b6118e1565b34801561079757600080fd5b5061035a6118f5565b3480156107ac57600080fd5b506103f6611904565b3480156107c157600080fd5b506104a26107d0366004612d52565b61190e565b3480156107e157600080fd5b506103f6611a38565b3480156107f657600080fd5b506103f6610805366004612bc9565b611a42565b34801561081657600080fd5b506103f6610825366004612b91565b611a6d565b34801561083657600080fd5b506104a2610845366004612b91565b611a88565b34801561085657600080fd5b506103f6611b0f565b34801561086b57600080fd5b5061035a611b19565b34801561088057600080fd5b506104a261088f366004612c8c565b611b96565b3480156108a057600080fd5b5061035a611c29565b3480156108b557600080fd5b506104a26108c4366004612d52565b611c38565b3480156108d557600080fd5b506104a26108e4366004612d52565b611c9d565b3480156108f557600080fd5b506104a2610904366004612c8c565b611cf3565b600d546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109a45780601f10610979576101008083540402835291602001916109a4565b820191906000526020600020905b81548152906001019060200180831161098757829003601f168201915b505050505090505b90565b60175460ff1681565b60006109cc6109c5611d86565b8484611d8a565b5060015b92915050565b60006109e0611e3e565b905090565b60006109e0611f03565b60095481565b60025490565b6000610a0884848461206f565b610a7884610a14611d86565b610a738560405180606001604052806028815260200161357c602891396001600160a01b038a16600090815260016020526040812090610a52611d86565b6001600160a01b031681526020810191909152604001600020549190612172565b611d8a565b5060015b9392505050565b60166020526000908152604090205460ff1681565b60026006541415610ac45760405162461bcd60e51b8152600401610abb90613446565b60405180910390fd5b600260065580610ae65760405162461bcd60e51b8152600401610abb9061316a565b6000610af1336110f9565b905080821115610b135760405162461bcd60e51b8152600401610abb9061313c565b610b1b61219e565b6009556000610b3e610b2b6109f5565b600954610b3890856121cf565b90612209565b90506000610b5a610b4d6109f5565b600954610b3890876121cf565b33600090815260146020526040902054909150821015610b8f57610b7f82600161223b565b9150610b8c81600161223b565b90505b33600090815260146020526040812054610bcf90610bae908790612209565b33600090815260146020526040902054610bc9908690612260565b906121cf565b905060006001600160a01b0316336001600160a01b03166000805160206135a483398151915287604051610c0391906134b4565b60405180910390a3600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610c3c903090600401612d9e565b60206040518083038186803b158015610c5457600080fd5b505afa158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8c9190612d6a565b905082811015610ca857610ca8610ca38483612260565b612288565b6000610cc5601354610b38601254866121cf90919063ffffffff16565b90508015610dbd57600a5460115460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610d03929116908590600401612db2565b602060405180830381600087803b158015610d1d57600080fd5b505af1158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d559190612c6c565b50601154600a54604051632fd5526560e01b81526001600160a01b0392831692632fd5526592610d8a92911690600401612d9e565b600060405180830381600087803b158015610da457600080fd5b505af1158015610db8573d6000803e3d6000fd5b505050505b610dde33610dcb8684612260565b600a546001600160a01b03169190612315565b610de83388612370565b33600090815260146020526040902054610e2390610e0d908890610b38908b906121cf565b3360009081526014602052604090205490612260565b33600090815260146020526040902055610e3b61126e565b610e4361219e565b600955604051879033907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490600090a3505060016006555050505050565b60055460ff1690565b60135481565b60006109cc610e9d611d86565b84610a738560016000610eae611d86565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061223b565b6011546001600160a01b031681565b610ef5611d86565b6001600160a01b0316610f066113e9565b6001600160a01b031614610f2c5760405162461bcd60e51b8152600401610abb90613107565b600060156000836003811115610f3e57fe5b6003811115610f4957fe5b81526020810191909152604001600020805460ff1916911515919091179055610f7061126e565b50565b610f7b611d86565b6001600160a01b0316610f8c6113e9565b6001600160a01b031614610fb25760405162461bcd60e51b8152600401610abb90613107565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600f546001600160a01b031681565b610feb611d86565b6001600160a01b0316610ffc6113e9565b6001600160a01b0316146110225760405162461bcd60e51b8152600401610abb90613107565b60648110156110435760405162461bcd60e51b8152600401610abb90613346565b61105b60135482601254028161105557fe5b04611c38565b601355565b600e546001600160a01b031681565b600b546001600160a01b031681565b611086611b19565b600a5460405163e8eda9df60e01b81526001600160a01b039283169263e8eda9df926110be9291169085903090600090600401612e12565b600060405180830381600087803b1580156110d857600080fd5b505af11580156110ec573d6000803e3d6000fd5b5050505050565b60125481565b6001600160a01b031660009081526020819052604090205490565b60006109e061219e565b611126611d86565b6001600160a01b03166111376113e9565b6001600160a01b03161461115d5760405162461bcd60e51b8152600401610abb90613107565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b6000806111b261219e565b90506111d16111bf6109f5565b610b3883670de0b6b3a76400006121cf565b91505090565b60006109e0612440565b6008546001600160a01b0316331461120b5760405162461bcd60e51b8152600401610abb90612ed4565b6008546007546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600854600780546001600160a01b0319166001600160a01b03909216919091179055565b60006112786116e1565b60175490915060ff16600381111561128c57fe5b81600381111561129857fe5b146112a5576112a56124a6565b60006112af6124f3565b11156113175760028160038111156112c357fe5b14156112d9576112d461069d6124f3565b611317565b60018160038111156112e757fe5b14156112f8576112d46105ca6124f3565b600381600381111561130657fe5b1415611317576113176108e46124f3565b6017805482919060ff1916600183600381111561133057fe5b021790555050565b600b546040516340c10f1960e01b81526000916001600160a01b0316906340c10f199061136b9030908690600401612db2565b602060405180830381600087803b15801561138557600080fd5b505af1158015611399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bd9190612d6a565b11610f705760405162461bcd60e51b8152600401610abb90613395565b600c546001600160a01b031681565b6007546001600160a01b031690565b611400611d86565b6001600160a01b03166114116113e9565b6001600160a01b0316146114375760405162461bcd60e51b8152600401610abb90613107565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109a45780601f10610979576101008083540402835291602001916109a4565b600a546001600160a01b031663095ea7b36114d3611b19565b6000196040518363ffffffff1660e01b81526004016114f3929190612db2565b602060405180830381600087803b15801561150d57600080fd5b505af1158015611521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115459190612c6c565b50600a54600b5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261157e9291169060001990600401612db2565b602060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190612c6c565b50600a546010546040805163f77c479160e01b815290516001600160a01b039384169363095ea7b393169163f77c47919160048083019260209291908290030181600087803b15801561162257600080fd5b505af1158015611636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165a9190612bad565b6000196040518363ffffffff1660e01b815260040161167a929190612db2565b602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612c6c565b60156020526000908152604090205460ff1681565b600e54600a546040516303622f8f60e61b81526000928392839283926001600160a01b039081169263d88be3c09261171f9290911690600401612d9e565b60006040518083038186803b15801561173757600080fd5b505afa15801561174b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117739190810190612cab565b93509350935050600080841180156117b65750600260005260156020527f07d4ff730d9753101d832555708a37d38c2c45fce8cacaefc99f06074e93fe0b5460ff165b156117be5750825b80831180156117f85750600160005260156020527f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d5460ff165b156118005750815b808211801561183a5750600360005260156020527fb3a65e8276bd33b3e4f7d6081ebd9899187264822358758dca2e2bc37b2a9c275460ff165b156118425750805b60008382141561185457506001611870565b8482141561186457506002611870565b82821415611870575060035b94505050505090565b60006109cc611886611d86565b84610a73856040518060600160405280602581526020016135c460259139600160006118b0611d86565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612172565b60006109cc6118ee611d86565b848461206f565b6010546001600160a01b031681565b60006109e06124f3565b600260065414156119315760405162461bcd60e51b8152600401610abb90613446565b6002600655806119535760405162461bcd60e51b8152600401610abb906132d8565b61195b61219e565b600955600a54611976906001600160a01b0316333084612574565b61197e61126e565b60006009546000141561199757506009819055806119c5565b61199f6109f5565b6119aa5750806119c5565b6119c2600954610b386119bb6109f5565b85906121cf565b90505b6119cd61219e565b6009556119da338261259b565b336000908152601460205260409020546119f4908361223b565b3360008181526014602052604080822093909355915184927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c91a350506001600655565b60006109e061263d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b031660009081526014602052604090205490565b611a90611d86565b6001600160a01b0316611aa16113e9565b6001600160a01b031614611ac75760405162461bcd60e51b8152600401610abb90613107565b6001600160a01b038116611aed5760405162461bcd60e51b8152600401610abb90612f03565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109e06126a3565b600c5460408051630261bf8b60e01b815290516000926001600160a01b031691630261bf8b916004808301926020929190829003018186803b158015611b5e57600080fd5b505afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190612bad565b611b9e611d86565b6001600160a01b0316611baf6113e9565b6001600160a01b031614611bd55760405162461bcd60e51b8152600401610abb90613107565b600060156000836003811115611be757fe5b6003811115611bf257fe5b815260200190815260200160002060006101000a81548160ff021916908315150217905550600060166000836003811115610f3e57fe5b600a546001600160a01b031681565b611c40611d86565b6001600160a01b0316611c516113e9565b6001600160a01b031614611c775760405162461bcd60e51b8152600401610abb90613107565b6013548110611c985760405162461bcd60e51b8152600401610abb906131e2565b601255565b60008111611cbd5760405162461bcd60e51b8152600401610abb9061305f565b601054600a546040516311f9fbc960e21b81526001600160a01b03928316926347e7ef24926110be929116908590600401612db2565b611cfb611d86565b6001600160a01b0316611d0c6113e9565b6001600160a01b031614611d325760405162461bcd60e51b8152600401610abb90613107565b600160156000836003811115611d4457fe5b6003811115611d4f57fe5b815260200190815260200160002060006101000a81548160ff021916908315150217905550600160166000836003811115610f3e57fe5b3390565b6001600160a01b038316611db05760405162461bcd60e51b8152600401610abb90613294565b6001600160a01b038216611dd65760405162461bcd60e51b8152600401610abb90612f49565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611e319085906134b4565b60405180910390a3505050565b6002600090815260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff1615611efb57600b546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b60206040518083038186803b158015611ebc57600080fd5b505afa158015611ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef49190612d6a565b90506109ac565b5060006109ac565b600080611f0e612440565b9050600081118015611f4b5750600360005260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae5460ff165b156109e057600f546040805163182df0f560e01b815290516000926001600160a01b03169163182df0f5916004808301926020929190829003018186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd9190612d6a565b90506000600f60009054906101000a90046001600160a01b03166001600160a01b031663c2ee3a086040518163ffffffff1660e01b815260040160206040518083038186803b15801561201f57600080fd5b505afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120579190612d6a565b905061206781610b3885856121cf565b949350505050565b6001600160a01b0383166120955760405162461bcd60e51b8152600401610abb90613223565b6001600160a01b0382166120bb5760405162461bcd60e51b8152600401610abb90612e91565b6120c683838361236b565b61210381604051806060016040528060268152602001613556602691396001600160a01b0386166000908152602081905260409020549190612172565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612132908261223b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516906000805160206135a483398151915290611e319085906134b4565b600081848411156121965760405162461bcd60e51b8152600401610abb9190612e5e565b505050900390565b60006109e06121ab6124f3565b6121c96121b6611f03565b6121c96121c161263d565b6121c96126a3565b9061223b565b6000826121de575060006109d0565b828202828482816121eb57fe5b0414610a7c5760405162461bcd60e51b8152600401610abb9061308f565b600080821161222a5760405162461bcd60e51b8152600401610abb90612ff9565b81838161223357fe5b049392505050565b600082820183811015610a7c5760405162461bcd60e51b8152600401610abb90612f8b565b6000828211156122825760405162461bcd60e51b8152600401610abb90612fc2565b50900390565b600160175460ff16600381111561229b57fe5b14156122d157806122aa61263d565b10156122c85760405162461bcd60e51b8152600401610abb90613268565b6122d181612770565b600260175460ff1660038111156122e457fe5b14156122f3576122f38161281e565b600360175460ff16600381111561230657fe5b1415610f7057610f7081612876565b61236b8363a9059cbb60e01b8484604051602401612334929190612db2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526128ce565b505050565b6001600160a01b0382166123965760405162461bcd60e51b8152600401610abb906131a1565b6123a28260008361236b565b6123df81604051806060016040528060228152602001613534602291396001600160a01b0385166000908152602081905260409020549190612172565b6001600160a01b0383166000908152602081905260409020556002546124059082612260565b6002556040516000906001600160a01b038416906000805160206135a4833981519152906124349085906134b4565b60405180910390a35050565b6003600090815260166020527ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae5460ff1615611efb57600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b60006124b0611e3e565b905080156124c1576124c18161295d565b6124c961263d565b905080156124da576124da81612770565b6124e2612440565b90508015610f7057610f70816129ff565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612524903090600401612d9e565b60206040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e09190612d6a565b612595846323b872dd60e01b85858560405160240161233493929190612dcb565b50505050565b6001600160a01b0382166125c15760405162461bcd60e51b8152600401610abb9061347d565b6125cd6000838361236b565b6002546125da908261223b565b6002556001600160a01b038216600090815260208190526040902054612600908261223b565b6001600160a01b0383166000818152602081905260408082209390935591519091906000805160206135a4833981519152906124349085906134b4565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff1615611efb57600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611ea4903090600401612d9e565b6000806126ae611e3e565b90506000811180156126eb5750600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff165b156109e057600b54604051630359f7eb60e11b81526001600160a01b03909116906306b3efd690612720903090600401612d9e565b60206040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612d6a565b600061277a611b19565b600a54604051631a4ca37b60e21b81526001600160a01b03928316926369328dec926127af9291169086903090600401612def565b602060405180830381600087803b1580156127c957600080fd5b505af11580156127dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128019190612d6a565b11610f705760405162461bcd60e51b8152600401610abb90613030565b6000612828611e3e565b905060006128346126a3565b9050828110156128565760405162461bcd60e51b8152600401610abb90613268565b600061286b60016121c984610b3887896121cf565b90506125958161295d565b6000612880612440565b9050600061288c611f03565b9050828110156128ae5760405162461bcd60e51b8152600401610abb90613268565b60006128c360016121c984610b3887896121cf565b9050612595816129ff565b6060612923826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612aa89092919063ffffffff16565b80519091501561236b57808060200190518101906129419190612c6c565b61236b5760405162461bcd60e51b8152600401610abb906133c5565b600b54604051632770a7eb60e21b81526000916001600160a01b031690639dc29fac906129909030908690600401612db2565b602060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190612d6a565b11610f705760405162461bcd60e51b8152600401610abb906130d0565b601054600a5460405163f3fef3a360e01b81526000926001600160a01b039081169263f3fef3a392612a3992909116908690600401612db2565b602060405180830381600087803b158015612a5357600080fd5b505af1158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190612d6a565b11610f705760405162461bcd60e51b8152600401610abb9061340f565b6060612067848460008585612abc85612b52565b612ad85760405162461bcd60e51b8152600401610abb9061330f565b60006060866001600160a01b03168587604051612af59190612d82565b60006040518083038185875af1925050503d8060008114612b32576040519150601f19603f3d011682016040523d82523d6000602084013e612b37565b606091505b5091509150612b47828286612b58565b979650505050505050565b3b151590565b60608315612b67575081610a7c565b825115612b775782518084602001fd5b8160405162461bcd60e51b8152600401610abb9190612e5e565b600060208284031215612ba2578081fd5b8135610a7c8161351e565b600060208284031215612bbe578081fd5b8151610a7c8161351e565b60008060408385031215612bdb578081fd5b8235612be68161351e565b91506020830135612bf68161351e565b809150509250929050565b600080600060608486031215612c15578081fd5b8335612c208161351e565b92506020840135612c308161351e565b929592945050506040919091013590565b60008060408385031215612c53578182fd5b8235612c5e8161351e565b946020939093013593505050565b600060208284031215612c7d578081fd5b81518015158114610a7c578182fd5b600060208284031215612c9d578081fd5b813560048110610a7c578182fd5b60008060008060808587031215612cc0578081fd5b845167ffffffffffffffff80821115612cd7578283fd5b818701915087601f830112612cea578283fd5b815181811115612cf8578384fd5b612d0b601f8201601f19166020016134cb565b9150808252886020828501011115612d21578384fd5b612d328160208401602086016134f2565b506020870151604088015160609098015191999098509095509350505050565b600060208284031215612d63578081fd5b5035919050565b600060208284031215612d7b578081fd5b5051919050565b60008251612d948184602087016134f2565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529216604082015261ffff909116606082015260800190565b901515815260200190565b6020810160048310612e5857fe5b91905290565b6000602082528251806020840152612e7d8160408501602087016134f2565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601590820152744f776e61626c653a206e6f7420636164696461746560581b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b602080825260159082015274105055914e881dda5d1a191c985dc819985a5b1959605a1b604082015260600190565b6020808252601690820152751193d4951550914e881cdd5c1c1b1e4819985a5b195960521b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526018908201527f46554c4352554d3a207769746864726177206661696c65640000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273696e73756666696369656e742062616c616e636560601b604082015260600190565b6020808252601f908201527f7769746864726177206d7573742062652067726561746572207468616e203000604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526021908201527f66656520616d6f756e74206d757374206265206c657373207468616e203130306040820152602560f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260129082015271696e73756666696369656e742066756e647360701b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601e908201527f6465706f736974206d7573742062652067726561746572207468616e20300000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f66656520707265636973696f6e206d757374206265206772656174657220746860408201526e185b880c4c0c08185d081b19585cdd608a1b606082015260800190565b60208082526016908201527511955310d495534e881cdd5c1c1b1e4819985a5b195960521b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526018908201527f466f72747562653a207769746864726177206661696c65640000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156134ea57600080fd5b604052919050565b60005b8381101561350d5781810151838201526020016134f5565b838111156125955750506000910152565b6001600160a01b0381168114610f7057600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220acd73d27d604df78102ad3115cad170a8bb58b6495fa2be0bcc46656daec00f964736f6c634300060c0033
Deployed Bytecode Sourcemap
43187:11439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43450:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34186:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43888:36::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36332:169::-;;;;;;;;;;-1:-1:-1;36332:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49366:95::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49051:109::-;;;;;;;;;;;;;:::i;43350:19::-;;;;;;;;;;;;;:::i;35285:108::-;;;;;;;;;;;;;:::i;36983:321::-;;;;;;;;;;-1:-1:-1;36983:321:0;;;;;:::i;:::-;;:::i;43837:44::-;;;;;;;;;;-1:-1:-1;43837:44:0;;;;;:::i;:::-;;:::i;46402:1445::-;;;;;;;;;;-1:-1:-1;46402:1445:0;;;;;:::i;:::-;;:::i;:::-;;35129:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43624:27::-;;;;;;;;;;;;;:::i;37713:218::-;;;;;;;;;;-1:-1:-1;37713:218:0;;;;;:::i;:::-;;:::i;43565:25::-;;;;;;;;;;;;;:::i;54321:129::-;;;;;;;;;;-1:-1:-1;54321:129:0;;;;;:::i;:::-;;:::i;44857:85::-;;;;;;;;;;-1:-1:-1;44857:85:0;;;;;:::i;:::-;;:::i;43502:27::-;;;;;;;;;;;;;:::i;45225:271::-;;;;;;;;;;-1:-1:-1;45225:271:0;;;;;:::i;:::-;;:::i;43479:18::-;;;;;;;;;;;;;:::i;43399:22::-;;;;;;;;;;;;;:::i;52806:111::-;;;;;;;;;;-1:-1:-1;52806:111:0;;;;;:::i;:::-;;:::i;43595:24::-;;;;;;;;;;;;;:::i;35456:127::-;;;;;;;;;;-1:-1:-1;35456:127:0;;;;;:::i;:::-;;:::i;53897:102::-;;;;;;;;;;;;;:::i;31250:148::-;;;;;;;;;;;;;:::i;54005:156::-;;;;;;;;;;;;;:::i;49558:95::-;;;;;;;;;;;;;:::i;31755:199::-;;;;;;;;;;;;;:::i;52335:465::-;;;;;;;;;;;;;:::i;52921:141::-;;;;;;;;;;-1:-1:-1;52921:141:0;;;;;:::i;:::-;;:::i;43426:19::-;;;;;;;;;;;;;:::i;30599:87::-;;;;;;;;;;;;;:::i;45105:116::-;;;;;;;;;;-1:-1:-1;45105:116:0;;;;;:::i;:::-;;:::i;34396:95::-;;;;;;;;;;;;;:::i;48828:217::-;;;;;;;;;;;;;:::i;43788:44::-;;;;;;;;;;-1:-1:-1;43788:44:0;;;;;:::i;:::-;;:::i;47886:681::-;;;;;;;;;;;;;:::i;38434:269::-;;;;;;;;;;-1:-1:-1;38434:269:0;;;;;:::i;:::-;;:::i;35796:175::-;;;;;;;;;;-1:-1:-1;35796:175:0;;;;;:::i;:::-;;:::i;43534:26::-;;;;;;;;;;;;;:::i;49166:81::-;;;;;;;;;;;;;:::i;45547:783::-;;;;;;;;;;-1:-1:-1;45547:783:0;;;;;:::i;:::-;;:::i;49465:89::-;;;;;;;;;;;;;:::i;36034:151::-;;;;;;;;;;-1:-1:-1;36034:151:0;;;;;:::i;:::-;;:::i;48701:121::-;;;;;;;;;;-1:-1:-1;48701:121:0;;;;;:::i;:::-;;:::i;31553:194::-;;;;;;;;;;-1:-1:-1;31553:194:0;;;;;:::i;:::-;;:::i;49253:109::-;;;;;;;;;;;;;:::i;48575:120::-;;;;;;;;;;;;;:::i;54456:167::-;;;;;;;;;;-1:-1:-1;54456:167:0;;;;;:::i;:::-;;:::i;43374:20::-;;;;;;;;;;;;;:::i;44946:155::-;;;;;;;;;;-1:-1:-1;44946:155:0;;;;;:::i;:::-;;:::i;53066:159::-;;;;;;;;;;-1:-1:-1;53066:159:0;;;;;:::i;:::-;;:::i;54167:148::-;;;;;;;;;;-1:-1:-1;54167:148:0;;;;;:::i;:::-;;:::i;43450:24::-;;;-1:-1:-1;;;;;43450:24:0;;:::o;34186:91::-;34264:5;34257:12;;;;;;;;-1:-1:-1;;34257:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34231:13;;34257:12;;34264:5;;34257:12;;34264:5;34257:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34186:91;;:::o;43888:36::-;;;;;;:::o;36332:169::-;36415:4;36432:39;36441:12;:10;:12::i;:::-;36455:7;36464:6;36432:8;:39::i;:::-;-1:-1:-1;36489:4:0;36332:169;;;;;:::o;49366:95::-;49415:7;49438:17;:15;:17::i;:::-;49431:24;;49366:95;:::o;49051:109::-;49107:7;49130:24;:22;:24::i;43350:19::-;;;;:::o;35285:108::-;35373:12;;35285:108;:::o;36983:321::-;37089:4;37106:36;37116:6;37124:9;37135:6;37106:9;:36::i;:::-;37153:121;37162:6;37170:12;:10;:12::i;:::-;37184:89;37222:6;37184:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37184:19:0;;;;;;:11;:19;;;;;;37204:12;:10;:12::i;:::-;-1:-1:-1;;;;;37184:33:0;;;;;;;;;;;;-1:-1:-1;37184:33:0;;;:89;:37;:89::i;:::-;37153:8;:121::i;:::-;-1:-1:-1;37292:4:0;36983:321;;;;;;:::o;43837:44::-;;;;;;;;;;;;;;;:::o;46402:1445::-;5187:1;5793:7;;:19;;5785:63;;;;-1:-1:-1;;;5785:63:0;;;;;;;:::i;:::-;;;;;;;;;5187:1;5926:7;:18;46493:11;46485:55:::1;;;;-1:-1:-1::0;;;46485:55:0::1;;;;;;;:::i;:::-;46551:16;46570:21;46580:10;46570:9;:21::i;:::-;46551:40;;46619:8;46608:7;:19;;46600:52;;;;-1:-1:-1::0;;;46600:52:0::1;;;;;;;:::i;:::-;46715:23;:21;:23::i;:::-;46708:4;:30:::0;46747:9:::1;46759:39;46784:13;:11;:13::i;:::-;46760:4;::::0;:18:::1;::::0;46769:8;46760::::1;:18::i;:::-;46759:24:::0;::::1;:39::i;:::-;46747:51;;46857:9;46869:38;46893:13;:11;:13::i;:::-;46870:4;::::0;:17:::1;::::0;46879:7;46870:8:::1;:17::i;46869:38::-;46939:10;46923:27;::::0;;;:15:::1;:27;::::0;;;;;46857:50;;-1:-1:-1;46919:31:0;::::1;46916:91;;;46966:8;:1:::0;46972::::1;46966:5;:8::i;:::-;46962:12:::0;-1:-1:-1;46989:8:0::1;:1:::0;46995::::1;46989:5;:8::i;:::-;46985:12;;46916:91;47101:10;47015:14;47085:27:::0;;;:15:::1;:27;::::0;;;;;47032:82:::1;::::0;47073:40:::1;::::0;:7;;:11:::1;:40::i;:::-;47055:10;47039:27;::::0;;;:15:::1;:27;::::0;;;;;47033:34:::1;::::0;:1;;:5:::1;:34::i;:::-;47032:40:::0;::::1;:82::i;:::-;47015:99;;47165:1;-1:-1:-1::0;;;;;47136:41:0::1;47145:10;-1:-1:-1::0;;;;;47136:41:0::1;-1:-1:-1::0;;;;;;;;;;;47169:7:0::1;47136:41;;;;;;:::i;:::-;;;;;;;;47231:5;::::0;47224:38:::1;::::0;-1:-1:-1;;;47224:38:0;;47212:9:::1;::::0;-1:-1:-1;;;;;47231:5:0::1;::::0;47224:23:::1;::::0;:38:::1;::::0;47256:4:::1;::::0;47224:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47212:50;;47279:1;47275;:5;47271:55;;;47293:23;47307:8;:1:::0;47313;47307:5:::1;:8::i;:::-;47293:13;:23::i;:::-;47336:11;47350:39;47376:12;;47350:21;47361:9;;47350:6;:10;;:21;;;;:::i;:39::-;47336:53:::0;-1:-1:-1;47401:7:0;;47398:122:::1;;47427:5;::::0;47442:10:::1;::::0;47420:38:::1;::::0;-1:-1:-1;;;47420:38:0;;-1:-1:-1;;;;;47427:5:0;;::::1;::::0;47420:21:::1;::::0;:38:::1;::::0;47442:10;::::1;::::0;47454:3;;47420:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;47479:10:0::1;::::0;47504:5:::1;::::0;47469:41:::1;::::0;-1:-1:-1;;;47469:41:0;;-1:-1:-1;;;;;47479:10:0;;::::1;::::0;47469:34:::1;::::0;:41:::1;::::0;47504:5;::::1;::::0;47469:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47398:122;47528:50;47555:10;47567;:1:::0;47573:3;47567:5:::1;:10::i;:::-;47535:5;::::0;-1:-1:-1;;;;;47535:5:0::1;::::0;47528:50;:26:::1;:50::i;:::-;47587:26;47593:10;47605:7;47587:5;:26::i;:::-;47712:10;47696:27;::::0;;;:15:::1;:27;::::0;;;;;47652:87:::1;::::0;47684:54:::1;::::0;47729:8;;47684:40:::1;::::0;:7;;:11:::1;:40::i;:54::-;47668:10;47652:27;::::0;;;:15:::1;:27;::::0;;;;;;:31:::1;:87::i;:::-;47638:10;47622:27;::::0;;;:15:::1;:27;::::0;;;;:117;47748:11:::1;:9;:11::i;:::-;47775:23;:21;:23::i;:::-;47768:4;:30:::0;47812:29:::1;::::0;47833:7;;47821:10:::1;::::0;47812:29:::1;::::0;;;::::1;-1:-1:-1::0;;5143:1:0;6105:7;:22;-1:-1:-1;;;;;46402:1445:0:o;35129:91::-;35203:9;;;;35129:91;:::o;43624:27::-;;;;:::o;37713:218::-;37801:4;37818:83;37827:12;:10;:12::i;:::-;37841:7;37850:50;37889:10;37850:11;:25;37862:12;:10;:12::i;:::-;-1:-1:-1;;;;;37850:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;37850:25:0;;;:34;;;;;;;;;;;:38;:50::i;43565:25::-;;;-1:-1:-1;;;;;43565:25:0;;:::o;54321:129::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;54421:5:::1;54398:12;:20;54411:6;54398:20;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54398:20:0;:28;;-1:-1:-1;;54398:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54433:11:::1;:9;:11::i;:::-;54321:129:::0;:::o;44857:85::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;44922:3:::1;:14:::0;;-1:-1:-1;;;;;;44922:14:0::1;-1:-1:-1::0;;;;;44922:14:0;;;::::1;::::0;;;::::1;::::0;;44857:85::o;43502:27::-;;;-1:-1:-1;;;;;43502:27:0;;:::o;45225:271::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;45332:3:::1;45312:16;:23;;45304:83;;;;-1:-1:-1::0;;;45304:83:0::1;;;;;;;:::i;:::-;45394:58;45439:12;;45422:16;45412:9;;:26;:39;;;;;;45394:17;:58::i;:::-;45459:12;:31:::0;45225:271::o;43479:18::-;;;-1:-1:-1;;;;;43479:18:0;;:::o;43399:22::-;;;-1:-1:-1;;;;;43399:22:0;;:::o;52806:111::-;52860:9;:7;:9::i;:::-;52879:5;;52855:56;;-1:-1:-1;;;52855:56:0;;-1:-1:-1;;;;;52855:23:0;;;;;;:56;;52879:5;;;52886:6;;52902:4;;52879:5;;52855:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52806:111;:::o;43595:24::-;;;;:::o;35456:127::-;-1:-1:-1;;;;;35557:18:0;35530:7;35557:18;;;;;;;;;;;;35456:127::o;53897:102::-;53950:4;53970:23;:21;:23::i;31250:148::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;31341:6:::1;::::0;31320:40:::1;::::0;31357:1:::1;::::0;-1:-1:-1;;;;;31341:6:0::1;::::0;31320:40:::1;::::0;31357:1;;31320:40:::1;31371:6;:19:::0;;-1:-1:-1;;;;;;31371:19:0::1;::::0;;31250:148::o;54005:156::-;54058:4;54071:10;54084:23;:21;:23::i;:::-;54071:36;;54121:34;54141:13;:11;:13::i;:::-;54121:15;:5;54131:4;54121:9;:15::i;:34::-;54114:41;;;54005:156;:::o;49558:95::-;49607:7;49630:17;:15;:17::i;31755:199::-;31824:10;;-1:-1:-1;;;;;31824:10:0;31810;:24;31802:58;;;;-1:-1:-1;;;31802:58:0;;;;;;;:::i;:::-;31905:10;;31897:6;;31876:40;;-1:-1:-1;;;;;31905:10:0;;;;31897:6;;;;31876:40;;31905:10;;31876:40;31936:10;;31927:6;:19;;-1:-1:-1;;;;;;31927:19:0;-1:-1:-1;;;;;31936:10:0;;;31927:19;;;;;;31755:199::o;52335:465::-;52370:18;52391:11;:9;:11::i;:::-;52430:8;;52370:32;;-1:-1:-1;52430:8:0;;52415:23;;;;;;;;:11;:23;;;;;;;;;52411:60;;52449:14;:12;:14::i;:::-;52496:1;52483:10;:8;:10::i;:::-;:14;52479:285;;;52527:14;52512:11;:29;;;;;;;;;52508:249;;;52554:25;52568:10;:8;:10::i;52554:25::-;52508:249;;;52614:11;52599;:26;;;;;;;;;52595:162;;;52638:22;52649:10;:8;:10::i;52595:162::-;52695:14;52680:11;:29;;;;;;;;;52676:81;;;52722:25;52736:10;:8;:10::i;52722:25::-;52772:8;:22;;52783:11;;52772:8;-1:-1:-1;;52772:22:0;;52783:11;52772:22;;;;;;;;;;;;;52335:465;:::o;52921:141::-;52989:7;;52981:44;;-1:-1:-1;;;52981:44:0;;53028:1;;-1:-1:-1;;;;;52989:7:0;;52981:21;;:44;;53011:4;;53018:6;;52981:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;52973:83;;;;-1:-1:-1;;;52973:83:0;;;;;;;:::i;43426:19::-;;;-1:-1:-1;;;;;43426:19:0;;:::o;30599:87::-;30672:6;;-1:-1:-1;;;;;30672:6:0;30599:87;:::o;45105:116::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;45186:10:::1;:29:::0;;-1:-1:-1;;;;;;45186:29:0::1;-1:-1:-1::0;;;;;45186:29:0;;;::::1;::::0;;;::::1;::::0;;45105:116::o;34396:95::-;34476:7;34469:14;;;;;;;;-1:-1:-1;;34469:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34443:13;;34469:14;;34476:7;;34469:14;;34476:7;34469:14;;;;;;;;;;;;;;;;;;;;;;;;48828:217;48875:5;;-1:-1:-1;;;;;48875:5:0;48868:21;48890:9;:7;:9::i;:::-;-1:-1:-1;;48868:42:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;48926:5:0;;48941:7;;48919:40;;-1:-1:-1;;;48919:40:0;;-1:-1:-1;;;;;48926:5:0;;;;48919:21;;:40;;48941:7;;;-1:-1:-1;;48955:2:0;48919:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;48975:5:0;;49002:11;;48990:37;;;-1:-1:-1;;;48990:37:0;;;;-1:-1:-1;;;;;48975:5:0;;;;48968:21;;49002:11;;48990:35;;:37;;;;;;;;;;;;;;48975:5;49002:11;48990:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;48968:71:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43788:44::-;;;;;;;;;;;;;;;:::o;47886:681::-;48004:3;;48019:5;;47990:35;;-1:-1:-1;;;47990:35:0;;47928:6;;;;;;;;-1:-1:-1;;;;;48004:3:0;;;;47990:28;;:35;;48019:5;;;;47990:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47990:35:0;;;;;;;;;;;;:::i;:::-;47943:82;;;;;;;48032:11;48065:3;48058:4;:10;:42;;;;-1:-1:-1;48085:14:0;48072:28;;:12;:28;;;;;;48058:42;48054:75;;;-1:-1:-1;48117:4:0;48054:75;48146:3;48139:4;:10;:39;;;;-1:-1:-1;48166:11:0;48153:25;;:12;:25;;;;;;48139:39;48135:72;;;-1:-1:-1;48195:4:0;48135:72;48225:3;48217:5;:11;:43;;;;-1:-1:-1;48245:14:0;48232:28;;:12;:28;;;;;;48217:43;48213:77;;;-1:-1:-1;48277:5:0;48213:77;48302:18;48352:4;48345:3;:11;48341:196;;;-1:-1:-1;48381:11:0;48341:196;;;48417:4;48410:3;:11;48406:131;;;-1:-1:-1;48446:14:0;48406:131;;;48485:5;48478:3;:12;48474:63;;;-1:-1:-1;48515:14:0;48474:63;48550:11;-1:-1:-1;;;;;47886:681:0;:::o;38434:269::-;38527:4;38544:129;38553:12;:10;:12::i;:::-;38567:7;38576:96;38615:15;38576:96;;;;;;;;;;;;;;;;;:11;:25;38588:12;:10;:12::i;:::-;-1:-1:-1;;;;;38576:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;38576:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;35796:175::-;35882:4;35899:42;35909:12;:10;:12::i;:::-;35923:9;35934:6;35899:9;:42::i;43534:26::-;;;-1:-1:-1;;;;;43534:26:0;;:::o;49166:81::-;49208:7;49231:10;:8;:10::i;45547:783::-;5187:1;5793:7;;:19;;5785:63;;;;-1:-1:-1;;;5785:63:0;;;;;;;:::i;:::-;5187:1;5926:7;:18;45637:11;45629:54:::1;;;;-1:-1:-1::0;;;45629:54:0::1;;;;;;;:::i;:::-;45699:23;:21;:23::i;:::-;45692:4;:30:::0;45738:5:::1;::::0;45731:66:::1;::::0;-1:-1:-1;;;;;45738:5:0::1;45762:10;45782:4;45789:7:::0;45731:30:::1;:66::i;:::-;45806:11;:9;:11::i;:::-;45858:14;45889:4;;45897:1;45889:9;45885:246;;;-1:-1:-1::0;45938:4:0::1;:14:::0;;;45920:7;45885:246:::1;;;45983:13;:11;:13::i;:::-;45979:143;;-1:-1:-1::0;46025:7:0;45979:143:::1;;;46072:38;46105:4;;46073:26;46085:13;:11;:13::i;:::-;46073:7:::0;;:11:::1;:26::i;46072:38::-;46063:47;;45979:143;46146:23;:21;:23::i;:::-;46139:4;:30:::0;46178:25:::1;46184:10;46196:6:::0;46178:5:::1;:25::i;:::-;46258:10;46242:27;::::0;;;:15:::1;:27;::::0;;;;;:40:::1;::::0;46274:7;46242:31:::1;:40::i;:::-;46228:10;46212:27;::::0;;;:15:::1;:27;::::0;;;;;:70;;;;46296:28;;46316:7;;46296:28:::1;::::0;::::1;-1:-1:-1::0;;5143:1:0;6105:7;:22;45547:783::o;49465:89::-;49511:7;49534:14;:12;:14::i;36034:151::-;-1:-1:-1;;;;;36150:18:0;;;36123:7;36150:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;36034:151::o;48701:121::-;-1:-1:-1;;;;;48791:25:0;48768:7;48791:25;;;:15;:25;;;;;;;48701:121::o;31553:194::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31642:22:0;::::1;31634:73;;;;-1:-1:-1::0;;;31634:73:0::1;;;;;;;:::i;:::-;31718:10;:21:::0;;-1:-1:-1;;;;;;31718:21:0::1;-1:-1:-1::0;;;;;31718:21:0;;;::::1;::::0;;;::::1;::::0;;31553:194::o;49253:109::-;49309:7;49332:24;:22;:24::i;48575:120::-;48667:4;;48638:51;;;-1:-1:-1;;;48638:51:0;;;;48615:7;;-1:-1:-1;;;;;48667:4:0;;48638:49;;:51;;;;;;;;;;;;;;48667:4;48638:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54456:167::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;54559:5:::1;54536:12;:20;54549:6;54536:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;54594:5;54571:12;:20;54584:6;54571:20;;;;;;;43374::::0;;;-1:-1:-1;;;;;43374:20:0;;:::o;44946:155::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;45023:12:::1;;45017:3;:18;45009:64;;;;-1:-1:-1::0;;;45009:64:0::1;;;;;;;:::i;:::-;45080:9;:15:::0;44946:155::o;53066:159::-;53135:1;53126:6;:10;53118:45;;;;-1:-1:-1;;;53118:45:0;;;;;;;:::i;:::-;53184:11;;53205:5;;53172:47;;-1:-1:-1;;;53172:47:0;;-1:-1:-1;;;;;53184:11:0;;;;53172:32;;:47;;53205:5;;;53212:6;;53172:47;;;:::i;54167:148::-;30830:12;:10;:12::i;:::-;-1:-1:-1;;;;;30819:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30819:23:0;;30811:68;;;;-1:-1:-1;;;30811:68:0;;;;;;;:::i;:::-;54253:4:::1;54230:12;:20;54243:6;54230:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;54287:4;54264:12;:20;54277:6;54264:20;;;;;;;29120:106:::0;29208:10;29120:106;:::o;41581:346::-;-1:-1:-1;;;;;41683:19:0;;41675:68;;;;-1:-1:-1;;;41675:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41762:21:0;;41754:68;;;;-1:-1:-1;;;41754:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41835:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;41887:32;;;;;41865:6;;41887:32;:::i;:::-;;;;;;;;41581:346;;;:::o;50393:186::-;50475:14;50443:7;50462:28;;;:12;:28;;;;;;50459:114;;;50513:7;;50506:40;;-1:-1:-1;;;50506:40:0;;-1:-1:-1;;;;;50513:7:0;;;;50506:25;;:40;;50540:4;;50506:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50499:47;;;;50459:114;-1:-1:-1;50572:1:0;50565:8;;50020:367;50077:7;50093:9;50105:17;:15;:17::i;:::-;50093:29;;50137:1;50133;:5;:37;;;;-1:-1:-1;50155:14:0;50142:28;;:12;:28;;;;;;50133:37;50129:238;;;50217:12;;50204:47;;;-1:-1:-1;;;50204:47:0;;;;50181:20;;-1:-1:-1;;;;;50217:12:0;;50204:45;;:47;;;;;;;;;;;;;;50217:12;50204:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50181:70;;50260:17;50293:12;;;;;;;;;-1:-1:-1;;;;;50293:12:0;-1:-1:-1;;;;;50280:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50260:52;-1:-1:-1;50325:34:0;50260:52;50325:19;:1;50331:12;50325:5;:19::i;:34::-;50321:38;50020:367;-1:-1:-1;;;;50020:367:0:o;39193:539::-;-1:-1:-1;;;;;39299:20:0;;39291:70;;;;-1:-1:-1;;;39291:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39380:23:0;;39372:71;;;;-1:-1:-1;;;39372:71:0;;;;;;;:::i;:::-;39456:47;39477:6;39485:9;39496:6;39456:20;:47::i;:::-;39536:71;39558:6;39536:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39536:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;39516:17:0;;;:9;:17;;;;;;;;;;;:91;;;;39641:20;;;;;;;:32;;39666:6;39641:24;:32::i;:::-;-1:-1:-1;;;;;39618:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;39689:35;;;;;;-1:-1:-1;;;;;;;;;;;39689:35:0;;;39717:6;;39689:35;:::i;22787:166::-;22873:7;22909:12;22901:6;;;;22893:29;;;;-1:-1:-1;;;22893:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;22940:5:0;;;22787:166::o;53695:196::-;53751:4;53771:114;53874:10;:8;:10::i;:::-;53771:90;53836:24;:22;:24::i;:::-;53771:52;53808:14;:12;:14::i;:::-;53771:24;:22;:24::i;:::-;:36;;:52::i;20839:220::-;20897:7;20921:6;20917:20;;-1:-1:-1;20936:1:0;20929:8;;20917:20;20960:5;;;20964:1;20960;:5;:1;20984:5;;;;;:10;20976:56;;;;-1:-1:-1;;;20976:56:0;;;;;;;:::i;21537:153::-;21595:7;21627:1;21623;:5;21615:44;;;;-1:-1:-1;;;21615:44:0;;;;;;;:::i;:::-;21681:1;21677;:5;;;;;;;21537:153;-1:-1:-1;;;21537:153:0:o;19960:179::-;20018:7;20050:5;;;20074:6;;;;20066:46;;;;-1:-1:-1;;;20066:46:0;;;;;;;:::i;20422:158::-;20480:7;20513:1;20508;:6;;20500:49;;;;-1:-1:-1;;;20500:49:0;;;;;;;:::i;:::-;-1:-1:-1;20567:5:0;;;20422:158::o;51961:368::-;52039:11;52027:8;;;;:23;;;;;;;;;52023:133;;;52087:7;52069:14;:12;:14::i;:::-;:25;;52061:56;;;;-1:-1:-1;;;52061:56:0;;;;;;;:::i;:::-;52126:22;52140:7;52126:13;:22::i;:::-;52178:14;52166:8;;;;:26;;;;;;;;;52162:78;;;52203:29;52224:7;52203:20;:29::i;:::-;52262:14;52250:8;;;;:26;;;;;;;;;52246:78;;;52287:29;52308:7;52287:20;:29::i;25352:177::-;25435:86;25455:5;25485:23;;;25510:2;25514:5;25462:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25462:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25462:58:0;-1:-1:-1;;;;;;25462:58:0;;;;;;;;;;25435:19;:86::i;:::-;25352:177;;;:::o;40725:418::-;-1:-1:-1;;;;;40809:21:0;;40801:67;;;;-1:-1:-1;;;40801:67:0;;;;;;;:::i;:::-;40881:49;40902:7;40919:1;40923:6;40881:20;:49::i;:::-;40964:68;40987:6;40964:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40964:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;40943:18:0;;:9;:18;;;;;;;;;;:89;41058:12;;:24;;41075:6;41058:16;:24::i;:::-;41043:12;:39;41098:37;;41124:1;;-1:-1:-1;;;;;41098:37:0;;;-1:-1:-1;;;;;;;;;;;41098:37:0;;;41128:6;;41098:37;:::i;:::-;;;;;;;;40725:418;;:::o;50769:197::-;50851:14;50819:7;50838:28;;;:12;:28;;;;;;50835:125;;;50895:12;;50882:51;;-1:-1:-1;;;50882:51:0;;-1:-1:-1;;;;;50895:12:0;;;;50882:36;;:51;;50927:4;;50882:51;;;:::i;50972:330::-;51012:15;51030:17;:15;:17::i;:::-;51012:35;-1:-1:-1;51058:10:0;;51054:57;;51079:24;51096:6;51079:16;:24::i;:::-;51126:14;:12;:14::i;:::-;51117:23;-1:-1:-1;51151:10:0;;51147:54;;51172:21;51186:6;51172:13;:21::i;:::-;51216:17;:15;:17::i;:::-;51207:26;-1:-1:-1;51244:10:0;;51240:57;;51265:24;51282:6;51265:16;:24::i;49659:110::-;49732:5;;49725:38;;-1:-1:-1;;;49725:38:0;;49702:7;;-1:-1:-1;;;;;49732:5:0;;49725:23;;:38;;49757:4;;49725:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25537:205::-;25638:96;25658:5;25688:27;;;25717:4;25723:2;25727:5;25665:68;;;;;;;;;;:::i;25638:96::-;25537:205;;;;:::o;40014:378::-;-1:-1:-1;;;;;40098:21:0;;40090:65;;;;-1:-1:-1;;;40090:65:0;;;;;;;:::i;:::-;40168:49;40197:1;40201:7;40210:6;40168:20;:49::i;:::-;40245:12;;:24;;40262:6;40245:16;:24::i;:::-;40230:12;:39;-1:-1:-1;;;;;40301:18:0;;:9;:18;;;;;;;;;;;:30;;40324:6;40301:22;:30::i;:::-;-1:-1:-1;;;;;40280:18:0;;:9;:18;;;;;;;;;;;:51;;;;40347:37;;40280:18;;:9;-1:-1:-1;;;;;;;;;;;40347:37:0;;;40377:6;;40347:37;:::i;50583:182::-;50662:11;50630:7;50649:25;;;:12;:25;;;;;;50646:113;;;50697:9;;50690:42;;-1:-1:-1;;;50690:42:0;;-1:-1:-1;;;;;50697:9:0;;;;50690:27;;:42;;50726:4;;50690:42;;;:::i;49775:239::-;49832:7;49848:9;49860:17;:15;:17::i;:::-;49848:29;;49892:1;49888;:5;:37;;;;-1:-1:-1;49910:14:0;49897:28;;:12;:28;;;;;;49888:37;49884:110;;;49948:7;;49940:46;;-1:-1:-1;;;49940:46:0;;-1:-1:-1;;;;;49948:7:0;;;;49940:31;;:46;;49980:4;;49940:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53229:152::-;53348:1;53296:9;:7;:9::i;:::-;53316:5;;53291:54;;-1:-1:-1;;;53291:54:0;;-1:-1:-1;;;;;53291:24:0;;;;;;:54;;53316:5;;;53323:6;;53339:4;;53291:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;53283:92;;;;-1:-1:-1;;;53283:92:0;;;;;;;:::i;51308:362::-;51371:9;51383:17;:15;:17::i;:::-;51371:29;;51443:10;51456:24;:22;:24::i;:::-;51443:37;;51501:7;51495:2;:13;;51487:44;;;;-1:-1:-1;;;51487:44:0;;;;;;;:::i;:::-;51585:14;51602:31;51631:1;51602:24;51623:2;51603:14;:1;51609:7;51603:5;:14::i;51602:31::-;51585:48;;51640:24;51657:6;51640:16;:24::i;51676:279::-;51739:9;51751:17;:15;:17::i;:::-;51739:29;;51775:10;51788:24;:22;:24::i;:::-;51775:37;;51833:7;51827:2;:13;;51819:44;;;;-1:-1:-1;;;51819:44:0;;;;;;;:::i;:::-;51870:14;51887:31;51916:1;51887:24;51908:2;51888:14;:1;51894:7;51888:5;:14::i;51887:31::-;51870:48;;51925:24;51942:6;51925:16;:24::i;27657:761::-;28081:23;28107:69;28135:4;28107:69;;;;;;;;;;;;;;;;;28115:5;-1:-1:-1;;;;;28107:27:0;;;:69;;;;;:::i;:::-;28191:17;;28081:95;;-1:-1:-1;28191:21:0;28187:224;;28333:10;28322:30;;;;;;;;;;;;:::i;:::-;28314:85;;;;-1:-1:-1;;;28314:85:0;;;;;;;:::i;53385:148::-;53458:7;;53450:44;;-1:-1:-1;;;53450:44:0;;53497:1;;-1:-1:-1;;;;;53458:7:0;;53450:21;;:44;;53480:4;;53487:6;;53450:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;53442:85;;;;-1:-1:-1;;;53442:85:0;;;;;;;:::i;53537:152::-;53614:11;;53636:5;;53602:48;;-1:-1:-1;;;53602:48:0;;53653:1;;-1:-1:-1;;;;;53614:11:0;;;;53602:33;;:48;;53636:5;;;;53643:6;;53602:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;53594:89;;;;-1:-1:-1;;;53594:89:0;;;;;;;:::i;12763:195::-;12866:12;12898:52;12920:6;12928:4;12934:1;12937:12;12866;14067:18;14078:6;14067:10;:18::i;:::-;14059:60;;;;-1:-1:-1;;;14059:60:0;;;;;;;:::i;:::-;14193:12;14207:23;14234:6;-1:-1:-1;;;;;14234:11:0;14254:5;14262:4;14234:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14192:75;;;;14285:52;14303:7;14312:10;14324:12;14285:17;:52::i;:::-;14278:59;13815:530;-1:-1:-1;;;;;;;13815:530:0:o;9845:422::-;10212:20;10251:8;;;9845:422::o;16355:742::-;16470:12;16499:7;16495:595;;;-1:-1:-1;16530:10:0;16523:17;;16495:595;16644:17;;:21;16640:439;;16907:10;16901:17;16968:15;16955:10;16951:2;16947:19;16940:44;16855:148;17050:12;17043:20;;-1:-1:-1;;;17043:20:0;;;;;;;;:::i;1308:241:-1:-;;1412:2;1400:9;1391:7;1387:23;1383:32;1380:2;;;-1:-1;;1418:12;1380:2;85:6;72:20;97:33;124:5;97:33;:::i;1556:263::-;;1671:2;1659:9;1650:7;1646:23;1642:32;1639:2;;;-1:-1;;1677:12;1639:2;226:6;220:13;238:33;265:5;238:33;:::i;1826:366::-;;;1947:2;1935:9;1926:7;1922:23;1918:32;1915:2;;;-1:-1;;1953:12;1915:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2005:63;-1:-1;2105:2;2144:22;;72:20;97:33;72:20;97:33;:::i;:::-;2113:63;;;;1909:283;;;;;:::o;2199:491::-;;;;2337:2;2325:9;2316:7;2312:23;2308:32;2305:2;;;-1:-1;;2343:12;2305:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2395:63;-1:-1;2495:2;2534:22;;72:20;97:33;72:20;97:33;:::i;:::-;2299:391;;2503:63;;-1:-1;;;2603:2;2642:22;;;;1097:20;;2299:391::o;2697:366::-;;;2818:2;2806:9;2797:7;2793:23;2789:32;2786:2;;;-1:-1;;2824:12;2786:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2876:63;2976:2;3015:22;;;;1097:20;;-1:-1;;;2780:283::o;3070:257::-;;3182:2;3170:9;3161:7;3157:23;3153:32;3150:2;;;-1:-1;;3188:12;3150:2;364:6;358:13;35683:5;33805:13;33798:21;35661:5;35658:32;35648:2;;-1:-1;;35694:12;3334:263;;3449:2;3437:9;3428:7;3424:23;3420:32;3417:2;;;-1:-1;;3455:12;3417:2;509:6;496:20;35800:1;35793:5;35790:12;35780:2;;-1:-1;;35806:12;3604:771;;;;;3780:3;3768:9;3759:7;3755:23;3751:33;3748:2;;;-1:-1;;3787:12;3748:2;3838:17;3832:24;3876:18;;3868:6;3865:30;3862:2;;;-1:-1;;3898:12;3862:2;3985:6;3974:9;3970:22;;;691:3;684:4;676:6;672:17;668:27;658:2;;-1:-1;;699:12;658:2;739:6;733:13;3876:18;32866:6;32863:30;32860:2;;;-1:-1;;32896:12;32860:2;761:65;32969:9;32950:17;;-1:-1;;32946:33;33037:4;33027:15;761:65;:::i;:::-;752:74;;846:6;839:5;832:21;950:3;33037:4;941:6;874;932:16;;929:25;926:2;;;-1:-1;;957:12;926:2;977:39;1009:6;33037:4;908:5;904:16;33037:4;874:6;870:17;977:39;:::i;:::-;-1:-1;33037:4;4089:22;;1245:13;4158:2;4208:22;;1245:13;4277:2;4327:22;;;1245:13;3918:84;;1245:13;;-1:-1;1245:13;;-1:-1;3742:633;-1:-1;;;;3742:633::o;4382:241::-;;4486:2;4474:9;4465:7;4461:23;4457:32;4454:2;;;-1:-1;;4492:12;4454:2;-1:-1;1097:20;;4448:175;-1:-1;4448:175::o;4630:263::-;;4745:2;4733:9;4724:7;4720:23;4716:32;4713:2;;;-1:-1;;4751:12;4713:2;-1:-1;1245:13;;4707:186;-1:-1;4707:186::o;16433:271::-;;5440:5;33146:12;5551:52;5596:6;5591:3;5584:4;5577:5;5573:16;5551:52;:::i;:::-;5615:16;;;;;16567:137;-1:-1;;16567:137::o;16711:222::-;-1:-1;;;;;34119:54;;;;5120:37;;16838:2;16823:18;;16809:124::o;17185:349::-;-1:-1;;;;;34119:54;;;;4979:58;;17520:2;17505:18;;16270:37;17348:2;17333:18;;17319:215::o;17541:444::-;-1:-1;;;;;34119:54;;;5120:37;;34119:54;;;;17888:2;17873:18;;5120:37;17971:2;17956:18;;16270:37;;;;17724:2;17709:18;;17695:290::o;18332:460::-;-1:-1;;;;;34119:54;;;5120:37;;18687:2;18672:18;;16270:37;;;;34119:54;;;18778:2;18763:18;;4979:58;18523:2;18508:18;;18494:298::o;18799:586::-;-1:-1;;;;;34119:54;;;5120:37;;19190:2;19175:18;;16270:37;;;;34119:54;;19281:2;19266:18;;4979:58;34038:6;34027:18;;;19371:2;19356:18;;5872:57;19025:3;19010:19;;18996:389::o;19392:210::-;33805:13;;33798:21;5234:34;;19513:2;19498:18;;19484:118::o;19609:240::-;19745:2;19730:18;;35449:1;35439:12;;35429:2;;35455:9;35429:2;5723:59;;;19716:133;:::o;19856:310::-;;20003:2;20024:17;20017:47;6086:5;33146:12;33585:6;20003:2;19992:9;19988:18;33573:19;6180:52;6225:6;33613:14;19992:9;33613:14;20003:2;6206:5;6202:16;6180:52;:::i;:::-;32969:9;35332:14;-1:-1;;35328:28;6244:39;;;;33613:14;6244:39;;19974:192;-1:-1;;19974:192::o;20173:416::-;20373:2;20387:47;;;6520:2;20358:18;;;33573:19;6556:34;33613:14;;;6536:55;-1:-1;;;6611:12;;;6604:27;6650:12;;;20344:245::o;20596:416::-;20796:2;20810:47;;;6901:2;20781:18;;;33573:19;-1:-1;;;33613:14;;;6917:44;6980:12;;;20767:245::o;21019:416::-;21219:2;21233:47;;;7231:2;21204:18;;;33573:19;7267:34;33613:14;;;7247:55;-1:-1;;;7322:12;;;7315:30;7364:12;;;21190:245::o;21442:416::-;21642:2;21656:47;;;7615:2;21627:18;;;33573:19;7651:34;33613:14;;;7631:55;-1:-1;;;7706:12;;;7699:26;7744:12;;;21613:245::o;21865:416::-;22065:2;22079:47;;;7995:2;22050:18;;;33573:19;8031:29;33613:14;;;8011:50;8080:12;;;22036:245::o;22288:416::-;22488:2;22502:47;;;8331:2;22473:18;;;33573:19;8367:32;33613:14;;;8347:53;8419:12;;;22459:245::o;23134:416::-;23334:2;23348:47;;;9054:2;23319:18;;;33573:19;9090:28;33613:14;;;9070:49;9138:12;;;23305:245::o;23557:416::-;23757:2;23771:47;;;9389:2;23742:18;;;33573:19;-1:-1;;;33613:14;;;9405:44;9468:12;;;23728:245::o;23980:416::-;24180:2;24194:47;;;9719:2;24165:18;;;33573:19;-1:-1;;;33613:14;;;9735:45;9799:12;;;24151:245::o;24403:416::-;24603:2;24617:47;;;10050:2;24588:18;;;33573:19;10086:34;33613:14;;;10066:55;-1:-1;;;10141:12;;;10134:25;10178:12;;;24574:245::o;24826:416::-;25026:2;25040:47;;;10429:2;25011:18;;;33573:19;10465:26;33613:14;;;10445:47;10511:12;;;24997:245::o;25249:416::-;25449:2;25463:47;;;25434:18;;;33573:19;10798:34;33613:14;;;10778:55;10852:12;;;25420:245::o;25672:416::-;25872:2;25886:47;;;11103:2;25857:18;;;33573:19;-1:-1;;;33613:14;;;11119:43;11181:12;;;25843:245::o;26095:416::-;26295:2;26309:47;;;11432:2;26280:18;;;33573:19;11468:33;33613:14;;;11448:54;11521:12;;;26266:245::o;26518:416::-;26718:2;26732:47;;;11772:2;26703:18;;;33573:19;11808:34;33613:14;;;11788:55;-1:-1;;;11863:12;;;11856:25;11900:12;;;26689:245::o;26941:416::-;27141:2;27155:47;;;12151:2;27126:18;;;33573:19;12187:34;33613:14;;;12167:55;-1:-1;;;12242:12;;;12235:25;12279:12;;;27112:245::o;27364:416::-;27564:2;27578:47;;;12530:2;27549:18;;;33573:19;12566:34;33613:14;;;12546:55;-1:-1;;;12621:12;;;12614:29;12662:12;;;27535:245::o;27787:416::-;27987:2;28001:47;;;12913:2;27972:18;;;33573:19;-1:-1;;;33613:14;;;12929:41;12989:12;;;27958:245::o;28210:416::-;28410:2;28424:47;;;13240:2;28395:18;;;33573:19;13276:34;33613:14;;;13256:55;-1:-1;;;13331:12;;;13324:28;13371:12;;;28381:245::o;28633:416::-;28833:2;28847:47;;;13622:2;28818:18;;;33573:19;13658:32;33613:14;;;13638:53;13710:12;;;28804:245::o;29056:416::-;29256:2;29270:47;;;13961:2;29241:18;;;33573:19;13997:31;33613:14;;;13977:52;14048:12;;;29227:245::o;29479:416::-;29679:2;29693:47;;;14299:2;29664:18;;;33573:19;14335:34;33613:14;;;14315:55;-1:-1;;;14390:12;;;14383:39;14441:12;;;29650:245::o;29902:416::-;30102:2;30116:47;;;14692:2;30087:18;;;33573:19;-1:-1;;;33613:14;;;14708:45;14772:12;;;30073:245::o;30325:416::-;30525:2;30539:47;;;15023:2;30510:18;;;33573:19;15059:34;33613:14;;;15039:55;-1:-1;;;15114:12;;;15107:34;15160:12;;;30496:245::o;30748:416::-;30948:2;30962:47;;;15411:2;30933:18;;;33573:19;15447:26;33613:14;;;15427:47;15493:12;;;30919:245::o;31171:416::-;31371:2;31385:47;;;15744:2;31356:18;;;33573:19;15780:33;33613:14;;;15760:54;15833:12;;;31342:245::o;31594:416::-;31794:2;31808:47;;;16084:2;31779:18;;;33573:19;16120:33;33613:14;;;16100:54;16173:12;;;31765:245::o;32017:222::-;16270:37;;;32144:2;32129:18;;32115:124::o;32246:214::-;34335:4;34324:16;;;;16386:35;;32369:2;32354:18;;32340:120::o;32467:256::-;32529:2;32523:9;32555:17;;;32630:18;32615:34;;32651:22;;;32612:62;32609:2;;;32687:1;;32677:12;32609:2;32529;32696:22;32507:216;;-1:-1;32507:216::o;34988:268::-;35053:1;35060:101;35074:6;35071:1;35068:13;35060:101;;;35141:11;;;35135:18;35122:11;;;35115:39;35096:2;35089:10;35060:101;;;35176:6;35173:1;35170:13;35167:2;;;-1:-1;;35053:1;35223:16;;35216:27;35037:219::o;35478:117::-;-1:-1;;;;;34119:54;;35537:35;;35527:2;;35586:1;;35576:12
Swarm Source
ipfs://acd73d27d604df78102ad3115cad170a8bb58b6495fa2be0bcc46656daec00f9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.