More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,565 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17538707 | 577 days ago | IN | 0 ETH | 0.00385501 | ||||
Withdraw | 17536318 | 577 days ago | IN | 0 ETH | 0.00286024 | ||||
Withdraw | 17095678 | 639 days ago | IN | 0 ETH | 0.00627169 | ||||
Withdraw | 17062147 | 644 days ago | IN | 0 ETH | 0.00542004 | ||||
Withdraw | 17050602 | 645 days ago | IN | 0 ETH | 0.00373591 | ||||
Teller Closed Wi... | 17033136 | 648 days ago | IN | 0 ETH | 0.00333309 | ||||
Withdraw | 16902270 | 666 days ago | IN | 0 ETH | 0.0021792 | ||||
Teller Closed Wi... | 16822592 | 678 days ago | IN | 0 ETH | 0.00326152 | ||||
Teller Closed Wi... | 16723539 | 691 days ago | IN | 0 ETH | 0.00257282 | ||||
Break Commitment | 16722918 | 692 days ago | IN | 0 ETH | 0.00259932 | ||||
Commit | 16701464 | 695 days ago | IN | 0 ETH | 0.00357158 | ||||
Teller Closed Wi... | 16698491 | 695 days ago | IN | 0 ETH | 0.00395584 | ||||
Withdraw | 16673176 | 699 days ago | IN | 0 ETH | 0.00384458 | ||||
Withdraw | 16671517 | 699 days ago | IN | 0 ETH | 0.01245789 | ||||
Teller Closed Wi... | 16660410 | 700 days ago | IN | 0 ETH | 0.00352027 | ||||
Teller Closed Wi... | 16659186 | 701 days ago | IN | 0 ETH | 0.00255086 | ||||
Break Commitment | 16659134 | 701 days ago | IN | 0 ETH | 0.00228439 | ||||
Withdraw | 16658570 | 701 days ago | IN | 0 ETH | 0.00275319 | ||||
Withdraw | 16647759 | 702 days ago | IN | 0 ETH | 0.00394777 | ||||
Withdraw | 16646310 | 702 days ago | IN | 0 ETH | 0.00410204 | ||||
Withdraw | 16630161 | 705 days ago | IN | 0 ETH | 0.00994717 | ||||
Teller Closed Wi... | 16624309 | 705 days ago | IN | 0 ETH | 0.00209313 | ||||
Withdraw | 16620857 | 706 days ago | IN | 0 ETH | 0.01061526 | ||||
Withdraw | 16617283 | 706 days ago | IN | 0 ETH | 0.00249307 | ||||
Teller Closed Wi... | 16614504 | 707 days ago | IN | 0 ETH | 0.00234863 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Teller
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-19 */ // File: interfaces/IVault.sol pragma solidity ^0.8.6; /** * @title Vault Interface */ interface IVault { /** * @dev External function to get vidya rate. */ function rewardRate() external view returns (uint256); /** * @dev External function to get total priority. */ function totalPriority() external view returns (uint256); /** * @dev External function to get teller priority. * @param tellerId Teller Id */ function tellerPriority(address tellerId) external view returns (uint256); /** * @dev External function to add the teller. This function can be called by only owner. * @param teller Address of teller * @param priority Priority of teller */ function addTeller(address teller, uint256 priority) external; /** * @dev External function to change the priority of teller. This function can be called by only owner. * @param teller Address of teller * @param newPriority New priority of teller */ function changePriority(address teller, uint256 newPriority) external; /** * @dev External function to pay the Vidya token to investors. This function can be called by only teller. * @param provider Address of provider * @param providerTimeWeight Weight time of provider * @param totalWeight Sum of provider weight */ function payProvider( address provider, uint256 providerTimeWeight, uint256 totalWeight ) external; /** * @dev External function to calculate the Vidya Rate. */ function calculateRateExternal() external; } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^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() { _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 making 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: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Teller.sol pragma solidity ^0.8.6; /** * @title Teller Contract */ contract Teller is Ownable, ReentrancyGuard { using Address for address; using SafeERC20 for IERC20; /// @notice Event emitted on construction. event TellerDeployed(); /// @notice Event emitted when teller status is toggled. event TellerToggled(address teller, bool status); /// @notice Event emitted when new commitment is added. event NewCommitmentAdded( uint256 bonus, uint256 time, uint256 penalty, uint256 deciAdjustment ); /// @notice Event emitted when commitment status is toggled. event CommitmentToggled(uint256 index, bool status); /// @notice Event emitted when owner sets the dev address to get the break commitment fees. event PurposeSet(address devAddress, bool purposeStatus); /// @notice Event emitted when a provider deposits lp tokens. event LpDeposited(address indexed provider, uint256 indexed amount); /// @notice Event emitted when a provider withdraws lp tokens. event Withdrew(address indexed provider, uint256 indexed amount); /// @notice Event emitted when a provider commits lp tokens. event Commited(address indexed provider, uint256 indexed commitedAmount); /// @notice Event emitted when a provider breaks the commitment. event CommitmentBroke(address indexed provider, uint256 indexed tokenSentAmount); /// @notice Event emitted when provider claimed rewards. event Claimed(address indexed provider, bool indexed success); struct Provider { uint256 LPDepositedRatio; uint256 userWeight; uint256 lastClaimedTime; uint256 commitmentIndex; uint256 committedAmount; uint256 commitmentEndTime; } struct Commitment { uint256 bonus; uint256 duration; uint256 penalty; uint256 deciAdjustment; bool isActive; } IVault public Vault; IERC20 public LpToken; uint256 public totalLP; uint256 public totalWeight; uint256 public tellerClosedTime; bool public tellerOpen; bool public purpose; address public devAddress; Commitment[] public commitmentInfo; mapping(address => Provider) public providerInfo; modifier isTellerOpen() { require(tellerOpen, "Teller: Teller is not open."); _; } modifier isProvider() { require( providerInfo[msg.sender].LPDepositedRatio != 0, "Teller: Caller is not a provider." ); _; } modifier isTellerClosed() { require(!tellerOpen, "Teller: Teller is still active."); _; } /** * @dev Constructor function * @param _LpToken Interface of LP token * @param _Vault Interface of Vault */ constructor(IERC20 _LpToken, IVault _Vault) { LpToken = _LpToken; Vault = _Vault; commitmentInfo.push(); emit TellerDeployed(); } /** * @dev External function to toggle the teller. This function can be called only by the owner. */ function toggleTeller() external onlyOwner { tellerOpen = !tellerOpen; tellerClosedTime = block.timestamp; emit TellerToggled(address(this), tellerOpen); } /** * @dev External function to add a commitment option. This function can be called only by the owner. * @param _bonus Amount of bonus * @param _days Commitment duration in days * @param _penalty The penalty * @param _deciAdjustment Decimal percentage */ function addCommitment( uint256 _bonus, uint256 _days, uint256 _penalty, uint256 _deciAdjustment ) external onlyOwner { Commitment memory holder; holder.bonus = _bonus; holder.duration = _days * 1 days; holder.penalty = _penalty; holder.deciAdjustment = _deciAdjustment; holder.isActive = true; commitmentInfo.push(holder); emit NewCommitmentAdded(_bonus, _days, _penalty, _deciAdjustment); } /** * @dev External function to toggle the commitment. This function can be called only by the owner. * @param _index Commitment index */ function toggleCommitment(uint256 _index) external onlyOwner { require( 0 < _index && _index < commitmentInfo.length, "Teller: Current index is not listed in the commitment array." ); commitmentInfo[_index].isActive = !commitmentInfo[_index].isActive; emit CommitmentToggled(_index, commitmentInfo[_index].isActive); } /** * @dev External function to set the dev address to give that address the break commitment fees. This function can be called only by the owner. * @param _address Dev address * @param _status If purpose is active or not */ function setPurpose(address _address, bool _status) external onlyOwner { purpose = _status; devAddress = _address; emit PurposeSet(devAddress, purpose); } /** * @dev External function for providers to deposit lp tokens. Teller must be open. * @param _amount LP token amount */ function depositLP(uint256 _amount) external isTellerOpen { uint256 contractBalance = LpToken.balanceOf(address(this)); LpToken.safeTransferFrom(msg.sender, address(this), _amount); Provider storage user = providerInfo[msg.sender]; if (user.LPDepositedRatio != 0) { commitmentFinished(); claim(); } else { user.lastClaimedTime = block.timestamp; } if (contractBalance == totalLP || totalLP == 0) { user.LPDepositedRatio += _amount; totalLP += _amount; } else { uint256 _adjustedAmount = (_amount * totalLP) / contractBalance; user.LPDepositedRatio += _adjustedAmount; totalLP += _adjustedAmount; } user.userWeight += _amount; totalWeight += _amount; emit LpDeposited(msg.sender, _amount); } /** * @dev External function to withdraw lp token from the teller. This function can be called only by a provider. * @param _amount LP token amount */ function withdraw(uint256 _amount) external isProvider nonReentrant { Provider storage user = providerInfo[msg.sender]; uint256 contractBalance = LpToken.balanceOf(address(this)); commitmentFinished(); uint256 userTokens = (user.LPDepositedRatio * contractBalance) / totalLP; require( userTokens - user.committedAmount >= _amount, "Teller: Provider hasn't got enough deposited LP tokens to withdraw." ); claim(); uint256 _weightChange = (_amount * user.userWeight) / userTokens; user.userWeight -= _weightChange; totalWeight -= _weightChange; uint256 ratioChange = _amount * totalLP/contractBalance; user.LPDepositedRatio -= ratioChange; totalLP -= ratioChange; LpToken.safeTransfer(msg.sender, _amount); emit Withdrew(msg.sender, _amount); } /** * @dev External function to withdraw lp token when teller is closed. This function can be called only by a provider. */ function tellerClosedWithdraw() external isTellerClosed isProvider { uint256 contractBalance = LpToken.balanceOf(address(this)); require(contractBalance != 0, "Teller: Contract balance is zero."); claim(); Provider memory user = providerInfo[msg.sender]; uint256 userTokens = (user.LPDepositedRatio * contractBalance) / totalLP; totalLP -= user.LPDepositedRatio; totalWeight -= user.userWeight; providerInfo[msg.sender] = Provider(0, 0, 0, 0, 0, 0); LpToken.safeTransfer(msg.sender, userTokens); emit Withdrew(msg.sender, userTokens); } /** * @dev External function to commit lp token to gain a minor advantage for a selected period of time. This function can be called only by a provider. * @param _amount LP token amount * @param _commitmentIndex Index of commitment array */ function commit(uint256 _amount, uint256 _commitmentIndex) external nonReentrant isProvider { require( commitmentInfo[_commitmentIndex].isActive, "Teller: Current commitment is not active." ); Provider storage user = providerInfo[msg.sender]; commitmentFinished(); uint256 contractBalance = LpToken.balanceOf(address(this)); uint256 userTokens = (user.LPDepositedRatio * contractBalance) / totalLP; require( userTokens - user.committedAmount >= _amount, "Teller: Provider hasn't got enough deposited LP tokens to commit." ); if (user.committedAmount != 0) { require( _commitmentIndex == user.commitmentIndex, "Teller: Commitment index is not the same as providers'." ); } uint256 newEndTime; if ( user.commitmentEndTime >= block.timestamp && user.committedAmount != 0 ) { newEndTime = calculateNewEndTime( user.committedAmount, _amount, user.commitmentEndTime, _commitmentIndex ); } else { newEndTime = block.timestamp + commitmentInfo[_commitmentIndex].duration; } uint256 weightToGain = (_amount * user.userWeight) / userTokens; uint256 bonusCredit = commitBonus(_commitmentIndex, weightToGain); claim(); user.commitmentIndex = _commitmentIndex; user.committedAmount += _amount; user.commitmentEndTime = newEndTime; user.userWeight += bonusCredit; totalWeight += bonusCredit; emit Commited(msg.sender, _amount); } /** * @dev External function to break the commitment. This function can be called only by a provider. */ function breakCommitment() external nonReentrant isProvider { Provider memory user = providerInfo[msg.sender]; require( user.commitmentEndTime > block.timestamp, "Teller: No commitment to break." ); uint256 contractBalance = LpToken.balanceOf(address(this)); uint256 tokenToReceive = (user.LPDepositedRatio * contractBalance) / totalLP; Commitment memory currentCommit = commitmentInfo[user.commitmentIndex]; //fee for breaking the commitment uint256 fee = (user.committedAmount * currentCommit.penalty) / currentCommit.deciAdjustment; //fee reduced from provider and left in teller tokenToReceive -= fee; totalLP -= user.LPDepositedRatio; totalWeight -= user.userWeight; providerInfo[msg.sender] = Provider(0, 0, 0, 0, 0, 0); //if a devloper purpose is set then transfer to address if (purpose) { LpToken.safeTransfer(devAddress, fee / 10); } //Fee is not lost it is dispersed to remaining providers. LpToken.safeTransfer(msg.sender, tokenToReceive); emit CommitmentBroke(msg.sender, tokenToReceive); } /** * @dev Internal function to claim rewards. */ function claim() internal { Provider storage user = providerInfo[msg.sender]; uint256 timeGap = block.timestamp - user.lastClaimedTime; if (!tellerOpen) { timeGap = tellerClosedTime - user.lastClaimedTime; } if (timeGap > 365 * 1 days) { timeGap = 365 * 1 days; } uint256 timeWeight = timeGap * user.userWeight; user.lastClaimedTime = block.timestamp; Vault.payProvider(msg.sender, timeWeight, totalWeight); emit Claimed(msg.sender, true); } /** * @dev Internal function to return commit bonus. * @param _commitmentIndex Index of commitment array * @param _amount Commitment token amount */ function commitBonus(uint256 _commitmentIndex, uint256 _amount) internal view returns (uint256) { if (commitmentInfo[_commitmentIndex].isActive) { return (commitmentInfo[_commitmentIndex].bonus * _amount) / commitmentInfo[_commitmentIndex].deciAdjustment; } return 0; } /** * @dev Internal function to calculate the new ending time when the current end time is overflown. * @param _oldAmount Commitment lp token amount which provider has * @param _extraAmount Lp token amount which user wants to commit * @param _oldEndTime Previous commitment ending time * @param _commitmentIndex Index of commitment array */ function calculateNewEndTime( uint256 _oldAmount, uint256 _extraAmount, uint256 _oldEndTime, uint256 _commitmentIndex ) internal view returns (uint256) { uint256 extraEndTIme = commitmentInfo[_commitmentIndex].duration + block.timestamp; uint256 newEndTime = ((_oldAmount * _oldEndTime) + (_extraAmount * extraEndTIme)) / (_oldAmount + _extraAmount); return newEndTime; } /** * @dev Internal function to finish a commitment when it has ended. */ function commitmentFinished() internal { Provider storage user = providerInfo[msg.sender]; if (user.commitmentEndTime <= block.timestamp) { user.committedAmount = 0; user.commitmentIndex = 0; } } /** * @dev External function to claim the reward token. This function can be called only by a provider and teller must be open. */ function claimExternal() external isTellerOpen isProvider nonReentrant { commitmentFinished(); claim(); } /** * @dev External function to get User info. This function can be called from a msg.sender with active deposits. * @return Time of rest committed time * @return Committed amount * @return Committed Index * @return Amount to Claim * @return Total LP deposited */ function getUserInfo(address _user) external view returns ( uint256, uint256, uint256, uint256, uint256 ) { Provider memory user = providerInfo[_user]; if (user.LPDepositedRatio > 0) { uint256 claimAmount = (Vault.rewardRate() * Vault.tellerPriority(address(this)) * (block.timestamp - user.lastClaimedTime) * user.userWeight) / (totalWeight * Vault.totalPriority()); uint256 totalLPDeposited = (providerInfo[_user] .LPDepositedRatio * LpToken.balanceOf(address(this))) / totalLP; if (user.commitmentEndTime > block.timestamp) { return ( user.commitmentEndTime - block.timestamp, user.committedAmount, user.commitmentIndex, claimAmount, totalLPDeposited ); } else { return (0, 0, 0, claimAmount, totalLPDeposited); } } else { return (0, 0, 0, 0, 0); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_LpToken","type":"address"},{"internalType":"contract IVault","name":"_Vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"bool","name":"success","type":"bool"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"commitedAmount","type":"uint256"}],"name":"Commited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenSentAmount","type":"uint256"}],"name":"CommitmentBroke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"CommitmentToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LpDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deciAdjustment","type":"uint256"}],"name":"NewCommitmentAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"purposeStatus","type":"bool"}],"name":"PurposeSet","type":"event"},{"anonymous":false,"inputs":[],"name":"TellerDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"teller","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"TellerToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"LpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonus","type":"uint256"},{"internalType":"uint256","name":"_days","type":"uint256"},{"internalType":"uint256","name":"_penalty","type":"uint256"},{"internalType":"uint256","name":"_deciAdjustment","type":"uint256"}],"name":"addCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"breakCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimExternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_commitmentIndex","type":"uint256"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentInfo","outputs":[{"internalType":"uint256","name":"bonus","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"},{"internalType":"uint256","name":"deciAdjustment","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"providerInfo","outputs":[{"internalType":"uint256","name":"LPDepositedRatio","type":"uint256"},{"internalType":"uint256","name":"userWeight","type":"uint256"},{"internalType":"uint256","name":"lastClaimedTime","type":"uint256"},{"internalType":"uint256","name":"commitmentIndex","type":"uint256"},{"internalType":"uint256","name":"committedAmount","type":"uint256"},{"internalType":"uint256","name":"commitmentEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purpose","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPurpose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tellerClosedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tellerClosedWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tellerOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"toggleCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTeller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620041fc380380620041fc83398181016040528101906200003791906200022c565b620000576200004b6200013260201b60201c565b6200013a60201b60201c565b6001808190555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600181600181540180825580915050039060005260206000209050507fdba7dba51a584a827dd1c0e952205f0485dedda85feaa9ff7f27ce02b04da0dc60405160405180910390a1505062000308565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200020f81620002d4565b92915050565b6000815190506200022681620002ee565b92915050565b60008060408385031215620002465762000245620002cf565b5b60006200025685828601620001fe565b9250506020620002698582860162000215565b9150509250929050565b60006200028082620002af565b9050919050565b6000620002948262000273565b9050919050565b6000620002a88262000273565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002df8162000287565b8114620002eb57600080fd5b50565b620002f9816200029b565b81146200030557600080fd5b50565b613ee480620003186000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c3578063b56cb4621161007c578063b56cb46214610350578063b67de3ed1461036c578063ce9312ce14610376578063eb37acfc14610392578063f2fde38b146103ae578063ff77351e146103ca57610158565b8063715018a6146102c45780637d454c91146102ce5780638da5cb5b146102ec57806396c82e571461030a578063a2aa9de814610328578063a52042491461034657610158565b80633ae25916116101155780633ae25916146101fb5780633f222b2e146102305780635bf56bc41461023a5780636386c1c7146102565780636b62e0291461028a57806370740aab146102a657610158565b80630ee1e1751461015d578063132c4feb1461017b5780632d2c44f2146101995780632e1a7d4d146101b75780633804bc49146101d35780633ad10ef6146101dd575b600080fd5b6101656103fe565b604051610172919061337c565b60405180910390f35b610183610424565b60405161019091906135d4565b60405180910390f35b6101a161042a565b6040516101ae9190613397565b60405180910390f35b6101d160048036038101906101cc9190612e89565b610450565b005b6101db6107dd565b005b6101e5610bda565b6040516101f29190613286565b60405180910390f35b61021560048036038101906102109190612def565b610c00565b60405161022796959493929190613703565b60405180910390f35b610238610c3c565b005b610254600480360381019061024f9190612ee3565b610d78565b005b610270600480360381019061026b9190612def565b6111d8565b6040516102819594939291906136b0565b60405180910390f35b6102a4600480360381019061029f9190612e1c565b611628565b005b6102ae61176d565b6040516102bb9190613361565b60405180910390f35b6102cc611780565b005b6102d6611808565b6040516102e391906135d4565b60405180910390f35b6102f461180e565b6040516103019190613286565b60405180910390f35b610312611837565b60405161031f91906135d4565b60405180910390f35b61033061183d565b60405161033d9190613361565b60405180910390f35b61034e611850565b005b61036a60048036038101906103659190612f23565b611947565b005b610374611acc565b005b610390600480360381019061038b9190612e89565b612008565b005b6103ac60048036038101906103a79190612e89565b6121b5565b005b6103c860048036038101906103c39190612def565b612490565b005b6103e460048036038101906103df9190612e89565b612588565b6040516103f595949392919061365d565b60405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156104d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cd90613514565b60405180910390fd5b6002600154141561051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051390613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105c49190613286565b60206040518083038186803b1580156105dc57600080fd5b505afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190612eb6565b905061061e6125db565b6000600454828460000154610633919061381d565b61063d91906137ec565b9050838360040154826106509190613877565b1015610691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610688906134b4565b60405180910390fd5b610699612641565b6000818460010154866106ac919061381d565b6106b691906137ec565b9050808460010160008282546106cc9190613877565b9250508190555080600560008282546106e59190613877565b92505081905550600083600454876106fd919061381d565b61070791906137ec565b90508085600001600082825461071d9190613877565b9250508190555080600460008282546107369190613877565b9250508190555061078a3387600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b853373ffffffffffffffffffffffffffffffffffffffff167fb244b9a17ad633c6e83b7983ee04320484956a68ddbe96a0b70dfca1cf19d72360405160405180910390a350505050506001808190555050565b600760009054906101000a900460ff161561082d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610824906135b4565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90613514565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109109190613286565b60206040518083038186803b15801561092857600080fd5b505afa15801561093c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109609190612eb6565b905060008114156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90613454565b60405180910390fd5b6109ae612641565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090506000600454838360000151610a4d919061381d565b610a5791906137ec565b9050816000015160046000828254610a6f9190613877565b92505081905550816020015160056000828254610a8c9190613877565b925050819055506040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815250600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050610b913382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b803373ffffffffffffffffffffffffffffffffffffffff167fb244b9a17ad633c6e83b7983ee04320484956a68ddbe96a0b70dfca1cf19d72360405160405180910390a3505050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b600760009054906101000a900460ff16610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613534565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613514565b60405180910390fd5b60026001541415610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90613594565b60405180910390fd5b6002600181905550610d676125db565b610d6f612641565b60018081905550565b60026001541415610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613514565b60405180910390fd5b60088181548110610e6057610e5f6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590613554565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610f096125db565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f669190613286565b60206040518083038186803b158015610f7e57600080fd5b505afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190612eb6565b90506000600454828460000154610fcd919061381d565b610fd791906137ec565b905084836004015482610fea9190613877565b101561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613474565b60405180910390fd5b600083600401541461107e578260030154841461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490613434565b60405180910390fd5b5b60004284600501541015801561109957506000846004015414155b156110b9576110b2846004015487866005015488612857565b90506110ed565b600885815481106110cd576110cc6139cc565b5b906000526020600020906005020160010154426110ea9190613796565b90505b600082856001015488611100919061381d565b61110a91906137ec565b9050600061111887836128d6565b9050611122612641565b8686600301819055508786600401600082825461113f9190613796565b92505081905550828660050181905550808660010160008282546111639190613796565b92505081905550806005600082825461117c9190613796565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167f8c9e571bc1b7342cfe6c78f8375b579446d31400db4bd1416f26f497c99f1b3360405160405180910390a3505050505050600180819055505050565b600080600080600080600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905060008160000151111561160b576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d44c9b46040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e057600080fd5b505afa1580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113189190612eb6565b600554611325919061381d565b826020015183604001514261133a9190613877565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c02f6dd306040518263ffffffff1660e01b81526004016113959190613286565b60206040518083038186803b1580156113ad57600080fd5b505afa1580156113c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e59190612eb6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b815260040160206040518083038186803b15801561144d57600080fd5b505afa158015611461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114859190612eb6565b61148f919061381d565b611499919061381d565b6114a3919061381d565b6114ad91906137ec565b90506000600454600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161150f9190613286565b60206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612eb6565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546115ac919061381d565b6115b691906137ec565b9050428360a0015111156115f257428360a001516115d49190613877565b8360800151846060015184849750975097509750975050505061161f565b600080600084849750975097509750975050505061161f565b600080600080600095509550955095509550505b91939590929450565b611630612983565b73ffffffffffffffffffffffffffffffffffffffff1661164e61180e565b73ffffffffffffffffffffffffffffffffffffffff16146116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b906134d4565b60405180910390fd5b80600760016101000a81548160ff02191690831515021790555081600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fea226c8708c7690f06aa5bf670b5f1a2569de7ce393c874bd66aff5e45400bd6600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900460ff166040516117619291906132d8565b60405180910390a15050565b600760019054906101000a900460ff1681565b611788612983565b73ffffffffffffffffffffffffffffffffffffffff166117a661180e565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f3906134d4565b60405180910390fd5b611806600061298b565b565b60065481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b600760009054906101000a900460ff1681565b611858612983565b73ffffffffffffffffffffffffffffffffffffffff1661187661180e565b73ffffffffffffffffffffffffffffffffffffffff16146118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906134d4565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550426006819055507f8a11b47e58360bc9a2f4945155f0de108706ee4c0ca25d5423eb5cb518d9f52a30600760009054906101000a900460ff1660405161193d9291906132d8565b60405180910390a1565b61194f612983565b73ffffffffffffffffffffffffffffffffffffffff1661196d61180e565b73ffffffffffffffffffffffffffffffffffffffff16146119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906134d4565b60405180910390fd5b6119cb612d55565b8481600001818152505062015180846119e4919061381d565b8160200181815250508281604001818152505081816060018181525050600181608001901515908115158152505060088190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050507f5cfb6a22497b0a4188c0c67ea0e3c371f8885f3b83bef02726c27ff19b0ecc9485858585604051611abd9493929190613618565b60405180910390a15050505050565b60026001541415611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790613514565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050428160a0015111611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613414565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ccd9190613286565b60206040518083038186803b158015611ce557600080fd5b505afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d9190612eb6565b90506000600454828460000151611d34919061381d565b611d3e91906137ec565b905060006008846060015181548110611d5a57611d596139cc565b5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000816060015182604001518660800151611dd3919061381d565b611ddd91906137ec565b90508083611deb9190613877565b9250846000015160046000828254611e039190613877565b92505081905550846020015160056000828254611e209190613877565b925050819055506040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815250600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600760019054906101000a900460ff1615611f6957611f68600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83611f2091906137ec565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b5b611fb63384600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167f7d559f0b1f3ca5033a403dcb4e149e04f110489f92d867bb940b7e90391cefaa60405160405180910390a3505050505060018081905550565b612010612983565b73ffffffffffffffffffffffffffffffffffffffff1661202e61180e565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b906134d4565b60405180910390fd5b806000108015612098575060088054905081105b6120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906133d4565b60405180910390fd5b600881815481106120eb576120ea6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16156008828154811061211f5761211e6139cc565b5b906000526020600020906005020160040160006101000a81548160ff0219169083151502179055507fe84b561e1534a08cb9d7d8a90b99e407426f1b33c86024d6ade79a0153d015b1816008838154811061217d5761217c6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff166040516121aa9291906135ef565b60405180910390a150565b600760009054906101000a900460ff16612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90613534565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122619190613286565b60206040518083038186803b15801561227957600080fd5b505afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612eb6565b9050612302333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a4f909392919063ffffffff16565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015414612366576123596125db565b612361612641565b612370565b4281600201819055505b60045482148061238257506000600454145b156123c0578281600001600082825461239b9190613796565b9250508190555082600460008282546123b49190613796565b92505081905550612413565b600082600454856123d1919061381d565b6123db91906137ec565b9050808260000160008282546123f19190613796565b92505081905550806004600082825461240a9190613796565b92505081905550505b828160010160008282546124279190613796565b9250508190555082600560008282546124409190613796565b92505081905550823373ffffffffffffffffffffffffffffffffffffffff167fdae4417c25a93cfb86ce5fbbb8fc1630945b61afaeab4f29cf301b9a058ba91460405160405180910390a3505050565b612498612983565b73ffffffffffffffffffffffffffffffffffffffff166124b661180e565b73ffffffffffffffffffffffffffffffffffffffff161461250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906134d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612573906133f4565b60405180910390fd5b6125858161298b565b50565b6008818154811061259857600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16905085565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090504281600501541161263e5760008160040181905550600081600301819055505b50565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154426126969190613877565b9050600760009054906101000a900460ff166126c15781600201546006546126be9190613877565b90505b6301e133808111156126d5576301e1338090505b60008260010154826126e7919061381d565b9050428360020181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329851fd933836005546040518463ffffffff1660e01b81526004016127539392919061332a565b600060405180830381600087803b15801561276d57600080fd5b505af1158015612781573d6000803e3d6000fd5b50505050600115153373ffffffffffffffffffffffffffffffffffffffff167f650639b17ab5dbad2d79a2e4757e3be67a53db225cede5d96cb5ab54837b85ce60405160405180910390a3505050565b6128528363a9059cbb60e01b84846040516024016127f0929190613301565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ad8565b505050565b600080426008848154811061286f5761286e6139cc565b5b90600052602060002090600502016001015461288b9190613796565b90506000858761289b9190613796565b82876128a7919061381d565b86896128b3919061381d565b6128bd9190613796565b6128c791906137ec565b90508092505050949350505050565b6000600883815481106128ec576128eb6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16156129785760088381548110612924576129236139cc565b5b906000526020600020906005020160030154826008858154811061294b5761294a6139cc565b5b906000526020600020906005020160000154612967919061381d565b61297191906137ec565b905061297d565b600090505b92915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ad2846323b872dd60e01b858585604051602401612a70939291906132a1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ad8565b50505050565b6000612b3a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b9f9092919063ffffffff16565b9050600081511115612b9a5780806020019051810190612b5a9190612e5c565b612b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9090613574565b60405180910390fd5b5b505050565b6060612bae8484600085612bb7565b90509392505050565b606082471015612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390613494565b60405180910390fd5b612c0585612ccb565b612c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906134f4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c6d919061326f565b60006040518083038185875af1925050503d8060008114612caa576040519150601f19603f3d011682016040523d82523d6000602084013e612caf565b606091505b5091509150612cbf828286612cee565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612cfe57829050612d4e565b600083511115612d115782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4591906133b2565b60405180910390fd5b9392505050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600081359050612d9581613e69565b92915050565b600081359050612daa81613e80565b92915050565b600081519050612dbf81613e80565b92915050565b600081359050612dd481613e97565b92915050565b600081519050612de981613e97565b92915050565b600060208284031215612e0557612e046139fb565b5b6000612e1384828501612d86565b91505092915050565b60008060408385031215612e3357612e326139fb565b5b6000612e4185828601612d86565b9250506020612e5285828601612d9b565b9150509250929050565b600060208284031215612e7257612e716139fb565b5b6000612e8084828501612db0565b91505092915050565b600060208284031215612e9f57612e9e6139fb565b5b6000612ead84828501612dc5565b91505092915050565b600060208284031215612ecc57612ecb6139fb565b5b6000612eda84828501612dda565b91505092915050565b60008060408385031215612efa57612ef96139fb565b5b6000612f0885828601612dc5565b9250506020612f1985828601612dc5565b9150509250929050565b60008060008060808587031215612f3d57612f3c6139fb565b5b6000612f4b87828801612dc5565b9450506020612f5c87828801612dc5565b9350506040612f6d87828801612dc5565b9250506060612f7e87828801612dc5565b91505092959194509250565b612f93816138ab565b82525050565b612fa2816138bd565b82525050565b6000612fb382613764565b612fbd818561377a565b9350612fcd81856020860161393b565b80840191505092915050565b612fe2816138f3565b82525050565b612ff181613905565b82525050565b60006130028261376f565b61300c8185613785565b935061301c81856020860161393b565b61302581613a00565b840191505092915050565b600061303d603c83613785565b915061304882613a11565b604082019050919050565b6000613060602683613785565b915061306b82613a60565b604082019050919050565b6000613083601f83613785565b915061308e82613aaf565b602082019050919050565b60006130a6603783613785565b91506130b182613ad8565b604082019050919050565b60006130c9602183613785565b91506130d482613b27565b604082019050919050565b60006130ec604183613785565b91506130f782613b76565b606082019050919050565b600061310f602683613785565b915061311a82613beb565b604082019050919050565b6000613132604383613785565b915061313d82613c3a565b606082019050919050565b6000613155602083613785565b915061316082613caf565b602082019050919050565b6000613178601d83613785565b915061318382613cd8565b602082019050919050565b600061319b602183613785565b91506131a682613d01565b604082019050919050565b60006131be601b83613785565b91506131c982613d50565b602082019050919050565b60006131e1602983613785565b91506131ec82613d79565b604082019050919050565b6000613204602a83613785565b915061320f82613dc8565b604082019050919050565b6000613227601f83613785565b915061323282613e17565b602082019050919050565b600061324a601f83613785565b915061325582613e40565b602082019050919050565b613269816138e9565b82525050565b600061327b8284612fa8565b915081905092915050565b600060208201905061329b6000830184612f8a565b92915050565b60006060820190506132b66000830186612f8a565b6132c36020830185612f8a565b6132d06040830184613260565b949350505050565b60006040820190506132ed6000830185612f8a565b6132fa6020830184612f99565b9392505050565b60006040820190506133166000830185612f8a565b6133236020830184613260565b9392505050565b600060608201905061333f6000830186612f8a565b61334c6020830185613260565b6133596040830184613260565b949350505050565b60006020820190506133766000830184612f99565b92915050565b60006020820190506133916000830184612fd9565b92915050565b60006020820190506133ac6000830184612fe8565b92915050565b600060208201905081810360008301526133cc8184612ff7565b905092915050565b600060208201905081810360008301526133ed81613030565b9050919050565b6000602082019050818103600083015261340d81613053565b9050919050565b6000602082019050818103600083015261342d81613076565b9050919050565b6000602082019050818103600083015261344d81613099565b9050919050565b6000602082019050818103600083015261346d816130bc565b9050919050565b6000602082019050818103600083015261348d816130df565b9050919050565b600060208201905081810360008301526134ad81613102565b9050919050565b600060208201905081810360008301526134cd81613125565b9050919050565b600060208201905081810360008301526134ed81613148565b9050919050565b6000602082019050818103600083015261350d8161316b565b9050919050565b6000602082019050818103600083015261352d8161318e565b9050919050565b6000602082019050818103600083015261354d816131b1565b9050919050565b6000602082019050818103600083015261356d816131d4565b9050919050565b6000602082019050818103600083015261358d816131f7565b9050919050565b600060208201905081810360008301526135ad8161321a565b9050919050565b600060208201905081810360008301526135cd8161323d565b9050919050565b60006020820190506135e96000830184613260565b92915050565b60006040820190506136046000830185613260565b6136116020830184612f99565b9392505050565b600060808201905061362d6000830187613260565b61363a6020830186613260565b6136476040830185613260565b6136546060830184613260565b95945050505050565b600060a0820190506136726000830188613260565b61367f6020830187613260565b61368c6040830186613260565b6136996060830185613260565b6136a66080830184612f99565b9695505050505050565b600060a0820190506136c56000830188613260565b6136d26020830187613260565b6136df6040830186613260565b6136ec6060830185613260565b6136f96080830184613260565b9695505050505050565b600060c0820190506137186000830189613260565b6137256020830188613260565b6137326040830187613260565b61373f6060830186613260565b61374c6080830185613260565b61375960a0830184613260565b979650505050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006137a1826138e9565b91506137ac836138e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137e1576137e061396e565b5b828201905092915050565b60006137f7826138e9565b9150613802836138e9565b9250826138125761381161399d565b5b828204905092915050565b6000613828826138e9565b9150613833836138e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561386c5761386b61396e565b5b828202905092915050565b6000613882826138e9565b915061388d836138e9565b9250828210156138a05761389f61396e565b5b828203905092915050565b60006138b6826138c9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006138fe82613917565b9050919050565b600061391082613917565b9050919050565b600061392282613929565b9050919050565b6000613934826138c9565b9050919050565b60005b8381101561395957808201518184015260208101905061393e565b83811115613968576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f54656c6c65723a2043757272656e7420696e646578206973206e6f74206c697360008201527f74656420696e2074686520636f6d6d69746d656e742061727261792e00000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a204e6f20636f6d6d69746d656e7420746f20627265616b2e00600082015250565b7f54656c6c65723a20436f6d6d69746d656e7420696e646578206973206e6f742060008201527f7468652073616d652061732070726f766964657273272e000000000000000000602082015250565b7f54656c6c65723a20436f6e74726163742062616c616e6365206973207a65726f60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2050726f7669646572206861736e277420676f7420656e6f7560008201527f6768206465706f7369746564204c5020746f6b656e7320746f20636f6d6d697460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2050726f7669646572206861736e277420676f7420656e6f7560008201527f6768206465706f7369746564204c5020746f6b656e7320746f2077697468647260208201527f61772e0000000000000000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f54656c6c65723a2043616c6c6572206973206e6f7420612070726f766964657260008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2054656c6c6572206973206e6f74206f70656e2e0000000000600082015250565b7f54656c6c65723a2043757272656e7420636f6d6d69746d656e74206973206e6f60008201527f74206163746976652e0000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f54656c6c65723a2054656c6c6572206973207374696c6c206163746976652e00600082015250565b613e72816138ab565b8114613e7d57600080fd5b50565b613e89816138bd565b8114613e9457600080fd5b50565b613ea0816138e9565b8114613eab57600080fd5b5056fea26469706673582212200d8da5709be5bbdd51febc42f7617cf8b3219a31e4b2b04703d253c70f01d8e164736f6c634300080700330000000000000000000000000913ddae242839f8995c0375493f9a1a3bddc977000000000000000000000000ffe93e63e94da7a44739b6abfa25b81ced979a6b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c3578063b56cb4621161007c578063b56cb46214610350578063b67de3ed1461036c578063ce9312ce14610376578063eb37acfc14610392578063f2fde38b146103ae578063ff77351e146103ca57610158565b8063715018a6146102c45780637d454c91146102ce5780638da5cb5b146102ec57806396c82e571461030a578063a2aa9de814610328578063a52042491461034657610158565b80633ae25916116101155780633ae25916146101fb5780633f222b2e146102305780635bf56bc41461023a5780636386c1c7146102565780636b62e0291461028a57806370740aab146102a657610158565b80630ee1e1751461015d578063132c4feb1461017b5780632d2c44f2146101995780632e1a7d4d146101b75780633804bc49146101d35780633ad10ef6146101dd575b600080fd5b6101656103fe565b604051610172919061337c565b60405180910390f35b610183610424565b60405161019091906135d4565b60405180910390f35b6101a161042a565b6040516101ae9190613397565b60405180910390f35b6101d160048036038101906101cc9190612e89565b610450565b005b6101db6107dd565b005b6101e5610bda565b6040516101f29190613286565b60405180910390f35b61021560048036038101906102109190612def565b610c00565b60405161022796959493929190613703565b60405180910390f35b610238610c3c565b005b610254600480360381019061024f9190612ee3565b610d78565b005b610270600480360381019061026b9190612def565b6111d8565b6040516102819594939291906136b0565b60405180910390f35b6102a4600480360381019061029f9190612e1c565b611628565b005b6102ae61176d565b6040516102bb9190613361565b60405180910390f35b6102cc611780565b005b6102d6611808565b6040516102e391906135d4565b60405180910390f35b6102f461180e565b6040516103019190613286565b60405180910390f35b610312611837565b60405161031f91906135d4565b60405180910390f35b61033061183d565b60405161033d9190613361565b60405180910390f35b61034e611850565b005b61036a60048036038101906103659190612f23565b611947565b005b610374611acc565b005b610390600480360381019061038b9190612e89565b612008565b005b6103ac60048036038101906103a79190612e89565b6121b5565b005b6103c860048036038101906103c39190612def565b612490565b005b6103e460048036038101906103df9190612e89565b612588565b6040516103f595949392919061365d565b60405180910390f35b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156104d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cd90613514565b60405180910390fd5b6002600154141561051c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051390613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105c49190613286565b60206040518083038186803b1580156105dc57600080fd5b505afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190612eb6565b905061061e6125db565b6000600454828460000154610633919061381d565b61063d91906137ec565b9050838360040154826106509190613877565b1015610691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610688906134b4565b60405180910390fd5b610699612641565b6000818460010154866106ac919061381d565b6106b691906137ec565b9050808460010160008282546106cc9190613877565b9250508190555080600560008282546106e59190613877565b92505081905550600083600454876106fd919061381d565b61070791906137ec565b90508085600001600082825461071d9190613877565b9250508190555080600460008282546107369190613877565b9250508190555061078a3387600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b853373ffffffffffffffffffffffffffffffffffffffff167fb244b9a17ad633c6e83b7983ee04320484956a68ddbe96a0b70dfca1cf19d72360405160405180910390a350505050506001808190555050565b600760009054906101000a900460ff161561082d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610824906135b4565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90613514565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109109190613286565b60206040518083038186803b15801561092857600080fd5b505afa15801561093c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109609190612eb6565b905060008114156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90613454565b60405180910390fd5b6109ae612641565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090506000600454838360000151610a4d919061381d565b610a5791906137ec565b9050816000015160046000828254610a6f9190613877565b92505081905550816020015160056000828254610a8c9190613877565b925050819055506040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815250600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050610b913382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b803373ffffffffffffffffffffffffffffffffffffffff167fb244b9a17ad633c6e83b7983ee04320484956a68ddbe96a0b70dfca1cf19d72360405160405180910390a3505050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b600760009054906101000a900460ff16610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613534565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613514565b60405180910390fd5b60026001541415610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90613594565b60405180910390fd5b6002600181905550610d676125db565b610d6f612641565b60018081905550565b60026001541415610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db590613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390613514565b60405180910390fd5b60088181548110610e6057610e5f6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590613554565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610f096125db565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f669190613286565b60206040518083038186803b158015610f7e57600080fd5b505afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190612eb6565b90506000600454828460000154610fcd919061381d565b610fd791906137ec565b905084836004015482610fea9190613877565b101561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290613474565b60405180910390fd5b600083600401541461107e578260030154841461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490613434565b60405180910390fd5b5b60004284600501541015801561109957506000846004015414155b156110b9576110b2846004015487866005015488612857565b90506110ed565b600885815481106110cd576110cc6139cc565b5b906000526020600020906005020160010154426110ea9190613796565b90505b600082856001015488611100919061381d565b61110a91906137ec565b9050600061111887836128d6565b9050611122612641565b8686600301819055508786600401600082825461113f9190613796565b92505081905550828660050181905550808660010160008282546111639190613796565b92505081905550806005600082825461117c9190613796565b92505081905550873373ffffffffffffffffffffffffffffffffffffffff167f8c9e571bc1b7342cfe6c78f8375b579446d31400db4bd1416f26f497c99f1b3360405160405180910390a3505050505050600180819055505050565b600080600080600080600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905060008160000151111561160b576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d44c9b46040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e057600080fd5b505afa1580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113189190612eb6565b600554611325919061381d565b826020015183604001514261133a9190613877565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c02f6dd306040518263ffffffff1660e01b81526004016113959190613286565b60206040518083038186803b1580156113ad57600080fd5b505afa1580156113c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e59190612eb6565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b0a47ee6040518163ffffffff1660e01b815260040160206040518083038186803b15801561144d57600080fd5b505afa158015611461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114859190612eb6565b61148f919061381d565b611499919061381d565b6114a3919061381d565b6114ad91906137ec565b90506000600454600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161150f9190613286565b60206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612eb6565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546115ac919061381d565b6115b691906137ec565b9050428360a0015111156115f257428360a001516115d49190613877565b8360800151846060015184849750975097509750975050505061161f565b600080600084849750975097509750975050505061161f565b600080600080600095509550955095509550505b91939590929450565b611630612983565b73ffffffffffffffffffffffffffffffffffffffff1661164e61180e565b73ffffffffffffffffffffffffffffffffffffffff16146116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b906134d4565b60405180910390fd5b80600760016101000a81548160ff02191690831515021790555081600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fea226c8708c7690f06aa5bf670b5f1a2569de7ce393c874bd66aff5e45400bd6600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900460ff166040516117619291906132d8565b60405180910390a15050565b600760019054906101000a900460ff1681565b611788612983565b73ffffffffffffffffffffffffffffffffffffffff166117a661180e565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f3906134d4565b60405180910390fd5b611806600061298b565b565b60065481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055481565b600760009054906101000a900460ff1681565b611858612983565b73ffffffffffffffffffffffffffffffffffffffff1661187661180e565b73ffffffffffffffffffffffffffffffffffffffff16146118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906134d4565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550426006819055507f8a11b47e58360bc9a2f4945155f0de108706ee4c0ca25d5423eb5cb518d9f52a30600760009054906101000a900460ff1660405161193d9291906132d8565b60405180910390a1565b61194f612983565b73ffffffffffffffffffffffffffffffffffffffff1661196d61180e565b73ffffffffffffffffffffffffffffffffffffffff16146119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906134d4565b60405180910390fd5b6119cb612d55565b8481600001818152505062015180846119e4919061381d565b8160200181815250508281604001818152505081816060018181525050600181608001901515908115158152505060088190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050507f5cfb6a22497b0a4188c0c67ea0e3c371f8885f3b83bef02726c27ff19b0ecc9485858585604051611abd9493929190613618565b60405180910390a15050505050565b60026001541415611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990613594565b60405180910390fd5b60026001819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790613514565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050428160a0015111611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6790613414565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ccd9190613286565b60206040518083038186803b158015611ce557600080fd5b505afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d9190612eb6565b90506000600454828460000151611d34919061381d565b611d3e91906137ec565b905060006008846060015181548110611d5a57611d596139cc565b5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000816060015182604001518660800151611dd3919061381d565b611ddd91906137ec565b90508083611deb9190613877565b9250846000015160046000828254611e039190613877565b92505081905550846020015160056000828254611e209190613877565b925050819055506040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815250600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600760019054906101000a900460ff1615611f6957611f68600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a83611f2091906137ec565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b5b611fb63384600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166127d19092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167f7d559f0b1f3ca5033a403dcb4e149e04f110489f92d867bb940b7e90391cefaa60405160405180910390a3505050505060018081905550565b612010612983565b73ffffffffffffffffffffffffffffffffffffffff1661202e61180e565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b906134d4565b60405180910390fd5b806000108015612098575060088054905081105b6120d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ce906133d4565b60405180910390fd5b600881815481106120eb576120ea6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16156008828154811061211f5761211e6139cc565b5b906000526020600020906005020160040160006101000a81548160ff0219169083151502179055507fe84b561e1534a08cb9d7d8a90b99e407426f1b33c86024d6ade79a0153d015b1816008838154811061217d5761217c6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff166040516121aa9291906135ef565b60405180910390a150565b600760009054906101000a900460ff16612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90613534565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122619190613286565b60206040518083038186803b15801561227957600080fd5b505afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612eb6565b9050612302333084600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612a4f909392919063ffffffff16565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015414612366576123596125db565b612361612641565b612370565b4281600201819055505b60045482148061238257506000600454145b156123c0578281600001600082825461239b9190613796565b9250508190555082600460008282546123b49190613796565b92505081905550612413565b600082600454856123d1919061381d565b6123db91906137ec565b9050808260000160008282546123f19190613796565b92505081905550806004600082825461240a9190613796565b92505081905550505b828160010160008282546124279190613796565b9250508190555082600560008282546124409190613796565b92505081905550823373ffffffffffffffffffffffffffffffffffffffff167fdae4417c25a93cfb86ce5fbbb8fc1630945b61afaeab4f29cf301b9a058ba91460405160405180910390a3505050565b612498612983565b73ffffffffffffffffffffffffffffffffffffffff166124b661180e565b73ffffffffffffffffffffffffffffffffffffffff161461250c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612503906134d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561257c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612573906133f4565b60405180910390fd5b6125858161298b565b50565b6008818154811061259857600080fd5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16905085565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090504281600501541161263e5760008160040181905550600081600301819055505b50565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154426126969190613877565b9050600760009054906101000a900460ff166126c15781600201546006546126be9190613877565b90505b6301e133808111156126d5576301e1338090505b60008260010154826126e7919061381d565b9050428360020181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329851fd933836005546040518463ffffffff1660e01b81526004016127539392919061332a565b600060405180830381600087803b15801561276d57600080fd5b505af1158015612781573d6000803e3d6000fd5b50505050600115153373ffffffffffffffffffffffffffffffffffffffff167f650639b17ab5dbad2d79a2e4757e3be67a53db225cede5d96cb5ab54837b85ce60405160405180910390a3505050565b6128528363a9059cbb60e01b84846040516024016127f0929190613301565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ad8565b505050565b600080426008848154811061286f5761286e6139cc565b5b90600052602060002090600502016001015461288b9190613796565b90506000858761289b9190613796565b82876128a7919061381d565b86896128b3919061381d565b6128bd9190613796565b6128c791906137ec565b90508092505050949350505050565b6000600883815481106128ec576128eb6139cc565b5b906000526020600020906005020160040160009054906101000a900460ff16156129785760088381548110612924576129236139cc565b5b906000526020600020906005020160030154826008858154811061294b5761294a6139cc565b5b906000526020600020906005020160000154612967919061381d565b61297191906137ec565b905061297d565b600090505b92915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ad2846323b872dd60e01b858585604051602401612a70939291906132a1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ad8565b50505050565b6000612b3a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b9f9092919063ffffffff16565b9050600081511115612b9a5780806020019051810190612b5a9190612e5c565b612b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9090613574565b60405180910390fd5b5b505050565b6060612bae8484600085612bb7565b90509392505050565b606082471015612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390613494565b60405180910390fd5b612c0585612ccb565b612c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906134f4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c6d919061326f565b60006040518083038185875af1925050503d8060008114612caa576040519150601f19603f3d011682016040523d82523d6000602084013e612caf565b606091505b5091509150612cbf828286612cee565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612cfe57829050612d4e565b600083511115612d115782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4591906133b2565b60405180910390fd5b9392505050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b600081359050612d9581613e69565b92915050565b600081359050612daa81613e80565b92915050565b600081519050612dbf81613e80565b92915050565b600081359050612dd481613e97565b92915050565b600081519050612de981613e97565b92915050565b600060208284031215612e0557612e046139fb565b5b6000612e1384828501612d86565b91505092915050565b60008060408385031215612e3357612e326139fb565b5b6000612e4185828601612d86565b9250506020612e5285828601612d9b565b9150509250929050565b600060208284031215612e7257612e716139fb565b5b6000612e8084828501612db0565b91505092915050565b600060208284031215612e9f57612e9e6139fb565b5b6000612ead84828501612dc5565b91505092915050565b600060208284031215612ecc57612ecb6139fb565b5b6000612eda84828501612dda565b91505092915050565b60008060408385031215612efa57612ef96139fb565b5b6000612f0885828601612dc5565b9250506020612f1985828601612dc5565b9150509250929050565b60008060008060808587031215612f3d57612f3c6139fb565b5b6000612f4b87828801612dc5565b9450506020612f5c87828801612dc5565b9350506040612f6d87828801612dc5565b9250506060612f7e87828801612dc5565b91505092959194509250565b612f93816138ab565b82525050565b612fa2816138bd565b82525050565b6000612fb382613764565b612fbd818561377a565b9350612fcd81856020860161393b565b80840191505092915050565b612fe2816138f3565b82525050565b612ff181613905565b82525050565b60006130028261376f565b61300c8185613785565b935061301c81856020860161393b565b61302581613a00565b840191505092915050565b600061303d603c83613785565b915061304882613a11565b604082019050919050565b6000613060602683613785565b915061306b82613a60565b604082019050919050565b6000613083601f83613785565b915061308e82613aaf565b602082019050919050565b60006130a6603783613785565b91506130b182613ad8565b604082019050919050565b60006130c9602183613785565b91506130d482613b27565b604082019050919050565b60006130ec604183613785565b91506130f782613b76565b606082019050919050565b600061310f602683613785565b915061311a82613beb565b604082019050919050565b6000613132604383613785565b915061313d82613c3a565b606082019050919050565b6000613155602083613785565b915061316082613caf565b602082019050919050565b6000613178601d83613785565b915061318382613cd8565b602082019050919050565b600061319b602183613785565b91506131a682613d01565b604082019050919050565b60006131be601b83613785565b91506131c982613d50565b602082019050919050565b60006131e1602983613785565b91506131ec82613d79565b604082019050919050565b6000613204602a83613785565b915061320f82613dc8565b604082019050919050565b6000613227601f83613785565b915061323282613e17565b602082019050919050565b600061324a601f83613785565b915061325582613e40565b602082019050919050565b613269816138e9565b82525050565b600061327b8284612fa8565b915081905092915050565b600060208201905061329b6000830184612f8a565b92915050565b60006060820190506132b66000830186612f8a565b6132c36020830185612f8a565b6132d06040830184613260565b949350505050565b60006040820190506132ed6000830185612f8a565b6132fa6020830184612f99565b9392505050565b60006040820190506133166000830185612f8a565b6133236020830184613260565b9392505050565b600060608201905061333f6000830186612f8a565b61334c6020830185613260565b6133596040830184613260565b949350505050565b60006020820190506133766000830184612f99565b92915050565b60006020820190506133916000830184612fd9565b92915050565b60006020820190506133ac6000830184612fe8565b92915050565b600060208201905081810360008301526133cc8184612ff7565b905092915050565b600060208201905081810360008301526133ed81613030565b9050919050565b6000602082019050818103600083015261340d81613053565b9050919050565b6000602082019050818103600083015261342d81613076565b9050919050565b6000602082019050818103600083015261344d81613099565b9050919050565b6000602082019050818103600083015261346d816130bc565b9050919050565b6000602082019050818103600083015261348d816130df565b9050919050565b600060208201905081810360008301526134ad81613102565b9050919050565b600060208201905081810360008301526134cd81613125565b9050919050565b600060208201905081810360008301526134ed81613148565b9050919050565b6000602082019050818103600083015261350d8161316b565b9050919050565b6000602082019050818103600083015261352d8161318e565b9050919050565b6000602082019050818103600083015261354d816131b1565b9050919050565b6000602082019050818103600083015261356d816131d4565b9050919050565b6000602082019050818103600083015261358d816131f7565b9050919050565b600060208201905081810360008301526135ad8161321a565b9050919050565b600060208201905081810360008301526135cd8161323d565b9050919050565b60006020820190506135e96000830184613260565b92915050565b60006040820190506136046000830185613260565b6136116020830184612f99565b9392505050565b600060808201905061362d6000830187613260565b61363a6020830186613260565b6136476040830185613260565b6136546060830184613260565b95945050505050565b600060a0820190506136726000830188613260565b61367f6020830187613260565b61368c6040830186613260565b6136996060830185613260565b6136a66080830184612f99565b9695505050505050565b600060a0820190506136c56000830188613260565b6136d26020830187613260565b6136df6040830186613260565b6136ec6060830185613260565b6136f96080830184613260565b9695505050505050565b600060c0820190506137186000830189613260565b6137256020830188613260565b6137326040830187613260565b61373f6060830186613260565b61374c6080830185613260565b61375960a0830184613260565b979650505050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006137a1826138e9565b91506137ac836138e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137e1576137e061396e565b5b828201905092915050565b60006137f7826138e9565b9150613802836138e9565b9250826138125761381161399d565b5b828204905092915050565b6000613828826138e9565b9150613833836138e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561386c5761386b61396e565b5b828202905092915050565b6000613882826138e9565b915061388d836138e9565b9250828210156138a05761389f61396e565b5b828203905092915050565b60006138b6826138c9565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006138fe82613917565b9050919050565b600061391082613917565b9050919050565b600061392282613929565b9050919050565b6000613934826138c9565b9050919050565b60005b8381101561395957808201518184015260208101905061393e565b83811115613968576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f54656c6c65723a2043757272656e7420696e646578206973206e6f74206c697360008201527f74656420696e2074686520636f6d6d69746d656e742061727261792e00000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a204e6f20636f6d6d69746d656e7420746f20627265616b2e00600082015250565b7f54656c6c65723a20436f6d6d69746d656e7420696e646578206973206e6f742060008201527f7468652073616d652061732070726f766964657273272e000000000000000000602082015250565b7f54656c6c65723a20436f6e74726163742062616c616e6365206973207a65726f60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2050726f7669646572206861736e277420676f7420656e6f7560008201527f6768206465706f7369746564204c5020746f6b656e7320746f20636f6d6d697460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2050726f7669646572206861736e277420676f7420656e6f7560008201527f6768206465706f7369746564204c5020746f6b656e7320746f2077697468647260208201527f61772e0000000000000000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f54656c6c65723a2043616c6c6572206973206e6f7420612070726f766964657260008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f54656c6c65723a2054656c6c6572206973206e6f74206f70656e2e0000000000600082015250565b7f54656c6c65723a2043757272656e7420636f6d6d69746d656e74206973206e6f60008201527f74206163746976652e0000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f54656c6c65723a2054656c6c6572206973207374696c6c206163746976652e00600082015250565b613e72816138ab565b8114613e7d57600080fd5b50565b613e89816138bd565b8114613e9457600080fd5b50565b613ea0816138e9565b8114613eab57600080fd5b5056fea26469706673582212200d8da5709be5bbdd51febc42f7617cf8b3219a31e4b2b04703d253c70f01d8e164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000913ddae242839f8995c0375493f9a1a3bddc977000000000000000000000000ffe93e63e94da7a44739b6abfa25b81ced979a6b
-----Decoded View---------------
Arg [0] : _LpToken (address): 0x0913dDAE242839f8995c0375493f9a1A3Bddc977
Arg [1] : _Vault (address): 0xFFE93E63E94da7A44739b6aBFA25B81CEd979a6b
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000913ddae242839f8995c0375493f9a1a3bddc977
Arg [1] : 000000000000000000000000ffe93e63e94da7a44739b6abfa25b81ced979a6b
Deployed Bytecode Sourcemap
23342:15978:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25303:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25333:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25277:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29748:933;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30830:656;;;:::i;:::-;;25492:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25569:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;37662:128;;;:::i;:::-;;31764:1878;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38109:1208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;28312:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25464:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22424:103;;;:::i;:::-;;25395:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21773:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25362:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25435:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26486:187;;;:::i;:::-;;26978:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33772:1305;;;:::i;:::-;;27663:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28653:913;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22682:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25526:34;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;25303:21;;;;;;;;;;;;;:::o;25333:22::-;;;;:::o;25277:19::-;;;;;;;;;;;;;:::o;29748:933::-;25839:1;25794:12;:24;25807:10;25794:24;;;;;;;;;;;;;;;:41;;;:46;;25772:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1:::1;12597:7;;:19;;12589:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1;12730:7;:18;;;;29827:21:::2;29851:12;:24;29864:10;29851:24;;;;;;;;;;;;;;;29827:48;;29886:23;29912:7;;;;;;;;;;;:17;;;29938:4;29912:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29886:58;;29955:20;:18;:20::i;:::-;29986:18;30064:7;;30032:15;30008:4;:21;;;:39;;;;:::i;:::-;30007:64;;;;:::i;:::-;29986:85;;30141:7;30117:4;:20;;;30104:10;:33;;;;:::i;:::-;:44;;30082:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;30256:7;:5;:7::i;:::-;30276:21;30330:10;30311:4;:15;;;30301:7;:25;;;;:::i;:::-;30300:40;;;;:::i;:::-;30276:64;;30370:13;30351:4;:15;;;:32;;;;;;;:::i;:::-;;;;;;;;30409:13;30394:11;;:28;;;;;;;:::i;:::-;;;;;;;;30435:19;30475:15;30467:7;;30457;:17;;;;:::i;:::-;:33;;;;:::i;:::-;30435:55;;30526:11;30501:4;:21;;;:36;;;;;;;:::i;:::-;;;;;;;;30559:11;30548:7;;:22;;;;;;;:::i;:::-;;;;;;;;30585:41;30606:10;30618:7;30585;;;;;;;;;;;:20;;;;:41;;;;;:::i;:::-;30665:7;30653:10;30644:29;;;;;;;;;;;;29816:865;;;;;11955:1:::1;12909:7:::0;:22:::1;;;;29748:933:::0;:::o;30830:656::-;25975:10;;;;;;;;;;;25974:11;25966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;25839:1:::1;25794:12;:24;25807:10;25794:24;;;;;;;;;;;;;;;:41;;;:46;;25772:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;30908:23:::2;30934:7;;;;;;;;;;;:17;;;30960:4;30934:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30908:58;;31004:1;30985:15;:20;;30977:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31056:7;:5;:7::i;:::-;31076:20;31099:12;:24;31112:10;31099:24;;;;;;;;;;;;;;;31076:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;31136:18;31214:7;;31182:15;31158:4;:21;;;:39;;;;:::i;:::-;31157:64;;;;:::i;:::-;31136:85;;31243:4;:21;;;31232:7;;:32;;;;;;;:::i;:::-;;;;;;;;31290:4;:15;;;31275:11;;:30;;;;;;;:::i;:::-;;;;;;;;31345:26;;;;;;;;31354:1;31345:26;;;;31357:1;31345:26;;;;31360:1;31345:26;;;;31363:1;31345:26;;;;31366:1;31345:26;;;;31369:1;31345:26;;::::0;31318:12:::2;:24;31331:10;31318:24;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31384:44;31405:10;31417;31384:7;;;;;;;;;;;:20;;;;:44;;;;;:::i;:::-;31467:10;31455;31446:32;;;;;;;;;;;;30897:589;;;30830:656::o:0;25492:25::-;;;;;;;;;;;;;:::o;25569:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37662:128::-;25669:10;;;;;;;;;;;25661:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;25839:1:::1;25794:12;:24;25807:10;25794:24;;;;;;;;;;;;;;;:41;;;:46;;25772:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1:::2;12597:7;;:19;;12589:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1;12730:7;:18;;;;37744:20:::3;:18;:20::i;:::-;37775:7;:5;:7::i;:::-;11955:1:::2;12909:7:::0;:22:::2;;;;37662:128::o:0;31764:1878::-;11999:1;12597:7;;:19;;12589:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1;12730:7;:18;;;;25839:1:::1;25794:12;:24;25807:10;25794:24;;;;;;;;;;;;;;;:41;;;:46;;25772:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;31921:14:::2;31936:16;31921:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;31899:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;32044:21;32068:12;:24;32081:10;32068:24;;;;;;;;;;;;;;;32044:48;;32103:20;:18;:20::i;:::-;32134:23;32160:7;;;;;;;;;;;:17;;;32186:4;32160:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32134:58;;32203:18;32281:7;;32249:15;32225:4;:21;;;:39;;;;:::i;:::-;32224:64;;;;:::i;:::-;32203:85;;32360:7;32336:4;:20;;;32323:10;:33;;;;:::i;:::-;:44;;32301:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;32501:1;32477:4;:20;;;:25;32473:215;;32565:4;:20;;;32545:16;:40;32519:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;32473:215;32700:18;32775:15;32749:4;:22;;;:41;;:83;;;;;32831:1;32807:4;:20;;;:25;;32749:83;32731:467;;;32872:175;32910:4;:20;;;32949:7;32975:4;:22;;;33016:16;32872:19;:175::i;:::-;32859:188;;32731:467;;;33145:14;33160:16;33145:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;33110:15;:76;;;;:::i;:::-;33080:106;;32731:467;33210:20;33263:10;33244:4;:15;;;33234:7;:25;;;;:::i;:::-;33233:40;;;;:::i;:::-;33210:63;;33284:19;33306:43;33318:16;33336:12;33306:11;:43::i;:::-;33284:65;;33362:7;:5;:7::i;:::-;33405:16;33382:4;:20;;:39;;;;33456:7;33432:4;:20;;;:31;;;;;;;:::i;:::-;;;;;;;;33499:10;33474:4;:22;;:35;;;;33539:11;33520:4;:15;;;:30;;;;;;;:::i;:::-;;;;;;;;33576:11;33561;;:26;;;;;;;:::i;:::-;;;;;;;;33626:7;33614:10;33605:29;;;;;;;;;;;;31888:1754;;;;;;11955:1:::0;12909:7;:22;;;;31764:1878;;:::o;38109:1208::-;38209:7;38231;38253;38275;38297;38332:20;38355:12;:19;38368:5;38355:19;;;;;;;;;;;;;;;38332:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38415:1;38391:4;:21;;;:25;38387:923;;;38433:19;38643:5;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38629:11;;:35;;;;:::i;:::-;38609:4;:15;;;38568:4;:20;;;38550:15;:38;;;;:::i;:::-;38494:5;;;;;;;;;;;:20;;;38523:4;38494:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38456:5;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;:133;;;;:::i;:::-;:168;;;;:::i;:::-;38455:210;;;;:::i;:::-;38433:232;;38682:24;38803:7;;38767;;;;;;;;;;;:17;;;38793:4;38767:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38710:12;:19;38723:5;38710:19;;;;;;;;;;;;;;;:54;;;:89;;;;:::i;:::-;38709:101;;;;:::i;:::-;38682:128;;38856:15;38831:4;:22;;;:40;38827:417;;;38947:15;38922:4;:22;;;:40;;;;:::i;:::-;38985:4;:20;;;39028:4;:20;;;39071:11;39105:16;38892:248;;;;;;;;;;;;;;;38827:417;39189:1;39192;39195;39198:11;39211:16;39181:47;;;;;;;;;;;;;;;38387:923;39284:1;39287;39290;39293;39296;39276:22;;;;;;;;;;;38109:1208;;;;;;;;:::o;28312:188::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28404:7:::1;28394;;:17;;;;;;;;;;;;;;;;;;28435:8;28422:10;;:21;;;;;;;;;;;;;;;;;;28461:31;28472:10;;;;;;;;;;;28484:7;;;;;;;;;;;28461:31;;;;;;;:::i;:::-;;;;;;;;28312:188:::0;;:::o;25464:19::-;;;;;;;;;;;;;:::o;22424:103::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22489:30:::1;22516:1;22489:18;:30::i;:::-;22424:103::o:0;25395:31::-;;;;:::o;21773:87::-;21819:7;21846:6;;;;;;;;;;;21839:13;;21773:87;:::o;25362:26::-;;;;:::o;25435:22::-;;;;;;;;;;;;;:::o;26486:187::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26554:10:::1;;;;;;;;;;;26553:11;26540:10;;:24;;;;;;;;;;;;;;;;;;26594:15;26575:16;:34;;;;26625:40;26647:4;26654:10;;;;;;;;;;;26625:40;;;;;;;:::i;:::-;;;;;;;;26486:187::o:0;26978:516::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27148:24:::1;;:::i;:::-;27200:6;27185;:12;;:21;;;::::0;::::1;27243:6;27235:5;:14;;;;:::i;:::-;27217:6;:15;;:32;;;::::0;::::1;27277:8;27260:6;:14;;:25;;;::::0;::::1;27320:15;27296:6;:21;;:39;;;::::0;::::1;27364:4;27346:6;:15;;:22;;;;;;;;;::::0;::::1;27381:14;27401:6;27381:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27426:60;27445:6;27453:5;27460:8;27470:15;27426:60;;;;;;;;;:::i;:::-;;;;;;;;27137:357;26978:516:::0;;;;:::o;33772:1305::-;11999:1;12597:7;;:19;;12589:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1;12730:7;:18;;;;25839:1:::1;25794:12;:24;25807:10;25794:24;;;;;;;;;;;;;;;:41;;;:46;;25772:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;33843:20:::2;33866:12;:24;33879:10;33866:24;;;;;;;;;;;;;;;33843:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;33950:15;33925:4;:22;;;:40;33903:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;34037:23;34063:7;;;;;;;;;;;:17;;;34089:4;34063:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34037:58;;34108:22;34190:7;;34158:15;34134:4;:21;;;:39;;;;:::i;:::-;34133:64;;;;:::i;:::-;34108:89;;34210:31;34244:14;34259:4;:20;;;34244:36;;;;;;;;:::i;:::-;;;;;;;;;;;;34210:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;34344:11;34420:13;:28;;;34382:13;:21;;;34359:4;:20;;;:44;;;;:::i;:::-;34358:90;;;;:::i;:::-;34344:104;;34547:3;34529:21;;;;;:::i;:::-;;;34574:4;:21;;;34563:7;;:32;;;;;;;:::i;:::-;;;;;;;;34623:4;:15;;;34608:11;;:30;;;;;;;:::i;:::-;;;;;;;;34678:26;;;;;;;;34687:1;34678:26;;;;34690:1;34678:26;;;;34693:1;34678:26;;;;34696:1;34678:26;;;;34699:1;34678:26;;;;34702:1;34678:26;;::::0;34651:12:::2;:24;34664:10;34651:24;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34794:7;;;;;;;;;;;34790:82;;;34818:42;34839:10;;;;;;;;;;;34857:2;34851:3;:8;;;;:::i;:::-;34818:7;;;;;;;;;;;:20;;;;:42;;;;;:::i;:::-;34790:82;34960:48;34981:10;34993:14;34960:7;;;;;;;;;;;:20;;;;:48;;;;;:::i;:::-;35054:14;35042:10;35026:43;;;;;;;;;;;;33832:1245;;;;;11955:1:::0;12909:7;:22;;;;33772:1305::o;27663:387::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27761:6:::1;27757:1;:10;:44;;;;;27780:14;:21;;;;27771:6;:30;27757:44;27735:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:14;27950:6;27935:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;;;;;;;;;;27934:32;27900:14;27915:6;27900:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:66;;;;;;;;;;;;;;;;;;27984:58;28002:6;28010:14;28025:6;28010:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;;;;;;;;;;27984:58;;;;;;;:::i;:::-;;;;;;;;27663:387:::0;:::o;28653:913::-;25669:10;;;;;;;;;;;25661:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;28722:23:::1;28748:7;;;;;;;;;;;:17;;;28774:4;28748:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28722:58;;28791:60;28816:10;28836:4;28843:7;28791;;;;;;;;;;;:24;;;;:60;;;;;;:::i;:::-;28864:21;28888:12;:24;28901:10;28888:24;;;;;;;;;;;;;;;28864:48;;28952:1;28927:4;:21;;;:26;28923:172;;28970:20;:18;:20::i;:::-;29005:7;:5;:7::i;:::-;28923:172;;;29068:15;29045:4;:20;;:38;;;;28923:172;29128:7;;29109:15;:26;:42;;;;29150:1;29139:7;;:12;29109:42;29105:332;;;29193:7;29168:4;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;29226:7;29215;;:18;;;;;;;:::i;:::-;;;;;;;;29105:332;;;29266:23;29314:15;29303:7;;29293;:17;;;;:::i;:::-;29292:37;;;;:::i;:::-;29266:63;;29369:15;29344:4;:21;;;:40;;;;;;;:::i;:::-;;;;;;;;29410:15;29399:7;;:26;;;;;;;:::i;:::-;;;;;;;;29251:186;29105:332;29468:7;29449:4;:15;;;:26;;;;;;;:::i;:::-;;;;;;;;29501:7;29486:11;;:22;;;;;;;:::i;:::-;;;;;;;;29550:7;29538:10;29526:32;;;;;;;;;;;;28711:855;;28653:913:::0;:::o;22682:201::-;22004:12;:10;:12::i;:::-;21993:23;;:7;:5;:7::i;:::-;:23;;;21985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22791:1:::1;22771:22;;:8;:22;;;;22763:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22847:28;22866:8;22847:18;:28::i;:::-;22682:201:::0;:::o;25526:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37253:253::-;37303:21;37327:12;:24;37340:10;37327:24;;;;;;;;;;;;;;;37303:48;;37392:15;37366:4;:22;;;:41;37362:137;;37447:1;37424:4;:20;;:24;;;;37486:1;37463:4;:20;;:24;;;;37362:137;37292:214;37253:253::o;35152:574::-;35189:21;35213:12;:24;35226:10;35213:24;;;;;;;;;;;;;;;35189:48;;35248:15;35284:4;:20;;;35266:15;:38;;;;:::i;:::-;35248:56;;35322:10;;;;;;;;;;;35317:93;;35378:4;:20;;;35359:16;;:39;;;;:::i;:::-;35349:49;;35317:93;35436:12;35426:7;:22;35422:77;;;35475:12;35465:22;;35422:77;35511:18;35542:4;:15;;;35532:7;:25;;;;:::i;:::-;35511:46;;35593:15;35570:4;:20;;:38;;;;35621:5;;;;;;;;;;;:17;;;35639:10;35651;35663:11;;35621:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35713:4;35693:25;;35701:10;35693:25;;;;;;;;;;;;35178:548;;;35152:574::o;16522:211::-;16639:86;16659:5;16689:23;;;16714:2;16718:5;16666:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16639:19;:86::i;:::-;16522:211;;;:::o;36682:472::-;36866:7;36886:20;36966:15;36909:14;36924:16;36909:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;:72;;;;:::i;:::-;36886:95;;36992:18;37103:12;37090:10;:25;;;;:::i;:::-;37072:12;37057;:27;;;;:::i;:::-;37028:11;37015:10;:24;;;;:::i;:::-;37014:71;;;;:::i;:::-;37013:103;;;;:::i;:::-;36992:124;;37136:10;37129:17;;;;36682:472;;;;;;:::o;35912:380::-;36026:7;36055:14;36070:16;36055:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;36051:215;;;36207:14;36222:16;36207:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:47;;;36179:7;36138:14;36153:16;36138:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;:48;;;;:::i;:::-;36137:117;;;;:::i;:::-;36113:141;;;;36051:215;36283:1;36276:8;;35912:380;;;;;:::o;20497:98::-;20550:7;20577:10;20570:17;;20497:98;:::o;23043:191::-;23117:16;23136:6;;;;;;;;;;;23117:25;;23162:8;23153:6;;:17;;;;;;;;;;;;;;;;;;23217:8;23186:40;;23207:8;23186:40;;;;;;;;;;;;23106:128;23043:191;:::o;16741:248::-;16885:96;16905:5;16935:27;;;16964:4;16970:2;16974:5;16912:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16885:19;:96::i;:::-;16741:248;;;;:::o;19095:716::-;19519:23;19545:69;19573:4;19545:69;;;;;;;;;;;;;;;;;19553:5;19545:27;;;;:69;;;;;:::i;:::-;19519:95;;19649:1;19629:10;:17;:21;19625:179;;;19726:10;19715:30;;;;;;;;;;;;:::i;:::-;19707:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19625:179;19165:646;19095:716;;:::o;5662:229::-;5799:12;5831:52;5853:6;5861:4;5867:1;5870:12;5831:21;:52::i;:::-;5824:59;;5662:229;;;;;:::o;6782:510::-;6952:12;7010:5;6985:21;:30;;6977:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7077:18;7088:6;7077:10;:18::i;:::-;7069:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7143:12;7157:23;7184:6;:11;;7203:5;7210:4;7184:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7142:73;;;;7233:51;7250:7;7259:10;7271:12;7233:16;:51::i;:::-;7226:58;;;;6782:510;;;;;;:::o;2917:326::-;2977:4;3234:1;3212:7;:19;;;:23;3205:30;;2917:326;;;:::o;9468:712::-;9618:12;9647:7;9643:530;;;9678:10;9671:17;;;;9643:530;9812:1;9792:10;:17;:21;9788:374;;;9990:10;9984:17;10051:15;10038:10;10034:2;10030:19;10023:44;9788:374;10133:12;10126:20;;;;;;;;;;;:::i;:::-;;;;;;;;9468:712;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;152:133;;;;:::o;291:137::-;345:5;376:6;370:13;361:22;;392:30;416:5;392:30;:::i;:::-;291:137;;;;:::o;434:139::-;480:5;518:6;505:20;496:29;;534:33;561:5;534:33;:::i;:::-;434:139;;;;:::o;579:143::-;636:5;667:6;661:13;652:22;;683:33;710:5;683:33;:::i;:::-;579:143;;;;:::o;728:329::-;787:6;836:2;824:9;815:7;811:23;807:32;804:119;;;842:79;;:::i;:::-;804:119;962:1;987:53;1032:7;1023:6;1012:9;1008:22;987:53;:::i;:::-;977:63;;933:117;728:329;;;;:::o;1063:468::-;1128:6;1136;1185:2;1173:9;1164:7;1160:23;1156:32;1153:119;;;1191:79;;:::i;:::-;1153:119;1311:1;1336:53;1381:7;1372:6;1361:9;1357:22;1336:53;:::i;:::-;1326:63;;1282:117;1438:2;1464:50;1506:7;1497:6;1486:9;1482:22;1464:50;:::i;:::-;1454:60;;1409:115;1063:468;;;;;:::o;1537:345::-;1604:6;1653:2;1641:9;1632:7;1628:23;1624:32;1621:119;;;1659:79;;:::i;:::-;1621:119;1779:1;1804:61;1857:7;1848:6;1837:9;1833:22;1804:61;:::i;:::-;1794:71;;1750:125;1537:345;;;;:::o;1888:329::-;1947:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:119;;;2002:79;;:::i;:::-;1964:119;2122:1;2147:53;2192:7;2183:6;2172:9;2168:22;2147:53;:::i;:::-;2137:63;;2093:117;1888:329;;;;:::o;2223:351::-;2293:6;2342:2;2330:9;2321:7;2317:23;2313:32;2310:119;;;2348:79;;:::i;:::-;2310:119;2468:1;2493:64;2549:7;2540:6;2529:9;2525:22;2493:64;:::i;:::-;2483:74;;2439:128;2223:351;;;;:::o;2580:474::-;2648:6;2656;2705:2;2693:9;2684:7;2680:23;2676:32;2673:119;;;2711:79;;:::i;:::-;2673:119;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;2580:474;;;;;:::o;3060:765::-;3146:6;3154;3162;3170;3219:3;3207:9;3198:7;3194:23;3190:33;3187:120;;;3226:79;;:::i;:::-;3187:120;3346:1;3371:53;3416:7;3407:6;3396:9;3392:22;3371:53;:::i;:::-;3361:63;;3317:117;3473:2;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3444:118;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3060:765;;;;;;;:::o;3831:118::-;3918:24;3936:5;3918:24;:::i;:::-;3913:3;3906:37;3831:118;;:::o;3955:109::-;4036:21;4051:5;4036:21;:::i;:::-;4031:3;4024:34;3955:109;;:::o;4070:373::-;4174:3;4202:38;4234:5;4202:38;:::i;:::-;4256:88;4337:6;4332:3;4256:88;:::i;:::-;4249:95;;4353:52;4398:6;4393:3;4386:4;4379:5;4375:16;4353:52;:::i;:::-;4430:6;4425:3;4421:16;4414:23;;4178:265;4070:373;;;;:::o;4449:159::-;4550:51;4595:5;4550:51;:::i;:::-;4545:3;4538:64;4449:159;;:::o;4614:157::-;4714:50;4758:5;4714:50;:::i;:::-;4709:3;4702:63;4614:157;;:::o;4777:364::-;4865:3;4893:39;4926:5;4893:39;:::i;:::-;4948:71;5012:6;5007:3;4948:71;:::i;:::-;4941:78;;5028:52;5073:6;5068:3;5061:4;5054:5;5050:16;5028:52;:::i;:::-;5105:29;5127:6;5105:29;:::i;:::-;5100:3;5096:39;5089:46;;4869:272;4777:364;;;;:::o;5147:366::-;5289:3;5310:67;5374:2;5369:3;5310:67;:::i;:::-;5303:74;;5386:93;5475:3;5386:93;:::i;:::-;5504:2;5499:3;5495:12;5488:19;;5147:366;;;:::o;5519:::-;5661:3;5682:67;5746:2;5741:3;5682:67;:::i;:::-;5675:74;;5758:93;5847:3;5758:93;:::i;:::-;5876:2;5871:3;5867:12;5860:19;;5519:366;;;:::o;5891:::-;6033:3;6054:67;6118:2;6113:3;6054:67;:::i;:::-;6047:74;;6130:93;6219:3;6130:93;:::i;:::-;6248:2;6243:3;6239:12;6232:19;;5891:366;;;:::o;6263:::-;6405:3;6426:67;6490:2;6485:3;6426:67;:::i;:::-;6419:74;;6502:93;6591:3;6502:93;:::i;:::-;6620:2;6615:3;6611:12;6604:19;;6263:366;;;:::o;6635:::-;6777:3;6798:67;6862:2;6857:3;6798:67;:::i;:::-;6791:74;;6874:93;6963:3;6874:93;:::i;:::-;6992:2;6987:3;6983:12;6976:19;;6635:366;;;:::o;7007:::-;7149:3;7170:67;7234:2;7229:3;7170:67;:::i;:::-;7163:74;;7246:93;7335:3;7246:93;:::i;:::-;7364:2;7359:3;7355:12;7348:19;;7007:366;;;:::o;7379:::-;7521:3;7542:67;7606:2;7601:3;7542:67;:::i;:::-;7535:74;;7618:93;7707:3;7618:93;:::i;:::-;7736:2;7731:3;7727:12;7720:19;;7379:366;;;:::o;7751:::-;7893:3;7914:67;7978:2;7973:3;7914:67;:::i;:::-;7907:74;;7990:93;8079:3;7990:93;:::i;:::-;8108:2;8103:3;8099:12;8092:19;;7751:366;;;:::o;8123:::-;8265:3;8286:67;8350:2;8345:3;8286:67;:::i;:::-;8279:74;;8362:93;8451:3;8362:93;:::i;:::-;8480:2;8475:3;8471:12;8464:19;;8123:366;;;:::o;8495:::-;8637:3;8658:67;8722:2;8717:3;8658:67;:::i;:::-;8651:74;;8734:93;8823:3;8734:93;:::i;:::-;8852:2;8847:3;8843:12;8836:19;;8495:366;;;:::o;8867:::-;9009:3;9030:67;9094:2;9089:3;9030:67;:::i;:::-;9023:74;;9106:93;9195:3;9106:93;:::i;:::-;9224:2;9219:3;9215:12;9208:19;;8867:366;;;:::o;9239:::-;9381:3;9402:67;9466:2;9461:3;9402:67;:::i;:::-;9395:74;;9478:93;9567:3;9478:93;:::i;:::-;9596:2;9591:3;9587:12;9580:19;;9239:366;;;:::o;9611:::-;9753:3;9774:67;9838:2;9833:3;9774:67;:::i;:::-;9767:74;;9850:93;9939:3;9850:93;:::i;:::-;9968:2;9963:3;9959:12;9952:19;;9611:366;;;:::o;9983:::-;10125:3;10146:67;10210:2;10205:3;10146:67;:::i;:::-;10139:74;;10222:93;10311:3;10222:93;:::i;:::-;10340:2;10335:3;10331:12;10324:19;;9983:366;;;:::o;10355:::-;10497:3;10518:67;10582:2;10577:3;10518:67;:::i;:::-;10511:74;;10594:93;10683:3;10594:93;:::i;:::-;10712:2;10707:3;10703:12;10696:19;;10355:366;;;:::o;10727:::-;10869:3;10890:67;10954:2;10949:3;10890:67;:::i;:::-;10883:74;;10966:93;11055:3;10966:93;:::i;:::-;11084:2;11079:3;11075:12;11068:19;;10727:366;;;:::o;11099:118::-;11186:24;11204:5;11186:24;:::i;:::-;11181:3;11174:37;11099:118;;:::o;11223:271::-;11353:3;11375:93;11464:3;11455:6;11375:93;:::i;:::-;11368:100;;11485:3;11478:10;;11223:271;;;;:::o;11500:222::-;11593:4;11631:2;11620:9;11616:18;11608:26;;11644:71;11712:1;11701:9;11697:17;11688:6;11644:71;:::i;:::-;11500:222;;;;:::o;11728:442::-;11877:4;11915:2;11904:9;11900:18;11892:26;;11928:71;11996:1;11985:9;11981:17;11972:6;11928:71;:::i;:::-;12009:72;12077:2;12066:9;12062:18;12053:6;12009:72;:::i;:::-;12091;12159:2;12148:9;12144:18;12135:6;12091:72;:::i;:::-;11728:442;;;;;;:::o;12176:320::-;12291:4;12329:2;12318:9;12314:18;12306:26;;12342:71;12410:1;12399:9;12395:17;12386:6;12342:71;:::i;:::-;12423:66;12485:2;12474:9;12470:18;12461:6;12423:66;:::i;:::-;12176:320;;;;;:::o;12502:332::-;12623:4;12661:2;12650:9;12646:18;12638:26;;12674:71;12742:1;12731:9;12727:17;12718:6;12674:71;:::i;:::-;12755:72;12823:2;12812:9;12808:18;12799:6;12755:72;:::i;:::-;12502:332;;;;;:::o;12840:442::-;12989:4;13027:2;13016:9;13012:18;13004:26;;13040:71;13108:1;13097:9;13093:17;13084:6;13040:71;:::i;:::-;13121:72;13189:2;13178:9;13174:18;13165:6;13121:72;:::i;:::-;13203;13271:2;13260:9;13256:18;13247:6;13203:72;:::i;:::-;12840:442;;;;;;:::o;13288:210::-;13375:4;13413:2;13402:9;13398:18;13390:26;;13426:65;13488:1;13477:9;13473:17;13464:6;13426:65;:::i;:::-;13288:210;;;;:::o;13504:250::-;13611:4;13649:2;13638:9;13634:18;13626:26;;13662:85;13744:1;13733:9;13729:17;13720:6;13662:85;:::i;:::-;13504:250;;;;:::o;13760:248::-;13866:4;13904:2;13893:9;13889:18;13881:26;;13917:84;13998:1;13987:9;13983:17;13974:6;13917:84;:::i;:::-;13760:248;;;;:::o;14014:313::-;14127:4;14165:2;14154:9;14150:18;14142:26;;14214:9;14208:4;14204:20;14200:1;14189:9;14185:17;14178:47;14242:78;14315:4;14306:6;14242:78;:::i;:::-;14234:86;;14014:313;;;;:::o;14333:419::-;14499:4;14537:2;14526:9;14522:18;14514:26;;14586:9;14580:4;14576:20;14572:1;14561:9;14557:17;14550:47;14614:131;14740:4;14614:131;:::i;:::-;14606:139;;14333:419;;;:::o;14758:::-;14924:4;14962:2;14951:9;14947:18;14939:26;;15011:9;15005:4;15001:20;14997:1;14986:9;14982:17;14975:47;15039:131;15165:4;15039:131;:::i;:::-;15031:139;;14758:419;;;:::o;15183:::-;15349:4;15387:2;15376:9;15372:18;15364:26;;15436:9;15430:4;15426:20;15422:1;15411:9;15407:17;15400:47;15464:131;15590:4;15464:131;:::i;:::-;15456:139;;15183:419;;;:::o;15608:::-;15774:4;15812:2;15801:9;15797:18;15789:26;;15861:9;15855:4;15851:20;15847:1;15836:9;15832:17;15825:47;15889:131;16015:4;15889:131;:::i;:::-;15881:139;;15608:419;;;:::o;16033:::-;16199:4;16237:2;16226:9;16222:18;16214:26;;16286:9;16280:4;16276:20;16272:1;16261:9;16257:17;16250:47;16314:131;16440:4;16314:131;:::i;:::-;16306:139;;16033:419;;;:::o;16458:::-;16624:4;16662:2;16651:9;16647:18;16639:26;;16711:9;16705:4;16701:20;16697:1;16686:9;16682:17;16675:47;16739:131;16865:4;16739:131;:::i;:::-;16731:139;;16458:419;;;:::o;16883:::-;17049:4;17087:2;17076:9;17072:18;17064:26;;17136:9;17130:4;17126:20;17122:1;17111:9;17107:17;17100:47;17164:131;17290:4;17164:131;:::i;:::-;17156:139;;16883:419;;;:::o;17308:::-;17474:4;17512:2;17501:9;17497:18;17489:26;;17561:9;17555:4;17551:20;17547:1;17536:9;17532:17;17525:47;17589:131;17715:4;17589:131;:::i;:::-;17581:139;;17308:419;;;:::o;17733:::-;17899:4;17937:2;17926:9;17922:18;17914:26;;17986:9;17980:4;17976:20;17972:1;17961:9;17957:17;17950:47;18014:131;18140:4;18014:131;:::i;:::-;18006:139;;17733:419;;;:::o;18158:::-;18324:4;18362:2;18351:9;18347:18;18339:26;;18411:9;18405:4;18401:20;18397:1;18386:9;18382:17;18375:47;18439:131;18565:4;18439:131;:::i;:::-;18431:139;;18158:419;;;:::o;18583:::-;18749:4;18787:2;18776:9;18772:18;18764:26;;18836:9;18830:4;18826:20;18822:1;18811:9;18807:17;18800:47;18864:131;18990:4;18864:131;:::i;:::-;18856:139;;18583:419;;;:::o;19008:::-;19174:4;19212:2;19201:9;19197:18;19189:26;;19261:9;19255:4;19251:20;19247:1;19236:9;19232:17;19225:47;19289:131;19415:4;19289:131;:::i;:::-;19281:139;;19008:419;;;:::o;19433:::-;19599:4;19637:2;19626:9;19622:18;19614:26;;19686:9;19680:4;19676:20;19672:1;19661:9;19657:17;19650:47;19714:131;19840:4;19714:131;:::i;:::-;19706:139;;19433:419;;;:::o;19858:::-;20024:4;20062:2;20051:9;20047:18;20039:26;;20111:9;20105:4;20101:20;20097:1;20086:9;20082:17;20075:47;20139:131;20265:4;20139:131;:::i;:::-;20131:139;;19858:419;;;:::o;20283:::-;20449:4;20487:2;20476:9;20472:18;20464:26;;20536:9;20530:4;20526:20;20522:1;20511:9;20507:17;20500:47;20564:131;20690:4;20564:131;:::i;:::-;20556:139;;20283:419;;;:::o;20708:::-;20874:4;20912:2;20901:9;20897:18;20889:26;;20961:9;20955:4;20951:20;20947:1;20936:9;20932:17;20925:47;20989:131;21115:4;20989:131;:::i;:::-;20981:139;;20708:419;;;:::o;21133:222::-;21226:4;21264:2;21253:9;21249:18;21241:26;;21277:71;21345:1;21334:9;21330:17;21321:6;21277:71;:::i;:::-;21133:222;;;;:::o;21361:320::-;21476:4;21514:2;21503:9;21499:18;21491:26;;21527:71;21595:1;21584:9;21580:17;21571:6;21527:71;:::i;:::-;21608:66;21670:2;21659:9;21655:18;21646:6;21608:66;:::i;:::-;21361:320;;;;;:::o;21687:553::-;21864:4;21902:3;21891:9;21887:19;21879:27;;21916:71;21984:1;21973:9;21969:17;21960:6;21916:71;:::i;:::-;21997:72;22065:2;22054:9;22050:18;22041:6;21997:72;:::i;:::-;22079;22147:2;22136:9;22132:18;22123:6;22079:72;:::i;:::-;22161;22229:2;22218:9;22214:18;22205:6;22161:72;:::i;:::-;21687:553;;;;;;;:::o;22246:652::-;22445:4;22483:3;22472:9;22468:19;22460:27;;22497:71;22565:1;22554:9;22550:17;22541:6;22497:71;:::i;:::-;22578:72;22646:2;22635:9;22631:18;22622:6;22578:72;:::i;:::-;22660;22728:2;22717:9;22713:18;22704:6;22660:72;:::i;:::-;22742;22810:2;22799:9;22795:18;22786:6;22742:72;:::i;:::-;22824:67;22886:3;22875:9;22871:19;22862:6;22824:67;:::i;:::-;22246:652;;;;;;;;:::o;22904:664::-;23109:4;23147:3;23136:9;23132:19;23124:27;;23161:71;23229:1;23218:9;23214:17;23205:6;23161:71;:::i;:::-;23242:72;23310:2;23299:9;23295:18;23286:6;23242:72;:::i;:::-;23324;23392:2;23381:9;23377:18;23368:6;23324:72;:::i;:::-;23406;23474:2;23463:9;23459:18;23450:6;23406:72;:::i;:::-;23488:73;23556:3;23545:9;23541:19;23532:6;23488:73;:::i;:::-;22904:664;;;;;;;;:::o;23574:775::-;23807:4;23845:3;23834:9;23830:19;23822:27;;23859:71;23927:1;23916:9;23912:17;23903:6;23859:71;:::i;:::-;23940:72;24008:2;23997:9;23993:18;23984:6;23940:72;:::i;:::-;24022;24090:2;24079:9;24075:18;24066:6;24022:72;:::i;:::-;24104;24172:2;24161:9;24157:18;24148:6;24104:72;:::i;:::-;24186:73;24254:3;24243:9;24239:19;24230:6;24186:73;:::i;:::-;24269;24337:3;24326:9;24322:19;24313:6;24269:73;:::i;:::-;23574:775;;;;;;;;;:::o;24436:98::-;24487:6;24521:5;24515:12;24505:22;;24436:98;;;:::o;24540:99::-;24592:6;24626:5;24620:12;24610:22;;24540:99;;;:::o;24645:147::-;24746:11;24783:3;24768:18;;24645:147;;;;:::o;24798:169::-;24882:11;24916:6;24911:3;24904:19;24956:4;24951:3;24947:14;24932:29;;24798:169;;;;:::o;24973:305::-;25013:3;25032:20;25050:1;25032:20;:::i;:::-;25027:25;;25066:20;25084:1;25066:20;:::i;:::-;25061:25;;25220:1;25152:66;25148:74;25145:1;25142:81;25139:107;;;25226:18;;:::i;:::-;25139:107;25270:1;25267;25263:9;25256:16;;24973:305;;;;:::o;25284:185::-;25324:1;25341:20;25359:1;25341:20;:::i;:::-;25336:25;;25375:20;25393:1;25375:20;:::i;:::-;25370:25;;25414:1;25404:35;;25419:18;;:::i;:::-;25404:35;25461:1;25458;25454:9;25449:14;;25284:185;;;;:::o;25475:348::-;25515:7;25538:20;25556:1;25538:20;:::i;:::-;25533:25;;25572:20;25590:1;25572:20;:::i;:::-;25567:25;;25760:1;25692:66;25688:74;25685:1;25682:81;25677:1;25670:9;25663:17;25659:105;25656:131;;;25767:18;;:::i;:::-;25656:131;25815:1;25812;25808:9;25797:20;;25475:348;;;;:::o;25829:191::-;25869:4;25889:20;25907:1;25889:20;:::i;:::-;25884:25;;25923:20;25941:1;25923:20;:::i;:::-;25918:25;;25962:1;25959;25956:8;25953:34;;;25967:18;;:::i;:::-;25953:34;26012:1;26009;26005:9;25997:17;;25829:191;;;;:::o;26026:96::-;26063:7;26092:24;26110:5;26092:24;:::i;:::-;26081:35;;26026:96;;;:::o;26128:90::-;26162:7;26205:5;26198:13;26191:21;26180:32;;26128:90;;;:::o;26224:126::-;26261:7;26301:42;26294:5;26290:54;26279:65;;26224:126;;;:::o;26356:77::-;26393:7;26422:5;26411:16;;26356:77;;;:::o;26439:140::-;26503:9;26536:37;26567:5;26536:37;:::i;:::-;26523:50;;26439:140;;;:::o;26585:139::-;26648:9;26681:37;26712:5;26681:37;:::i;:::-;26668:50;;26585:139;;;:::o;26730:126::-;26780:9;26813:37;26844:5;26813:37;:::i;:::-;26800:50;;26730:126;;;:::o;26862:113::-;26912:9;26945:24;26963:5;26945:24;:::i;:::-;26932:37;;26862:113;;;:::o;26981:307::-;27049:1;27059:113;27073:6;27070:1;27067:13;27059:113;;;27158:1;27153:3;27149:11;27143:18;27139:1;27134:3;27130:11;27123:39;27095:2;27092:1;27088:10;27083:15;;27059:113;;;27190:6;27187:1;27184:13;27181:101;;;27270:1;27261:6;27256:3;27252:16;27245:27;27181:101;27030:258;26981:307;;;:::o;27294:180::-;27342:77;27339:1;27332:88;27439:4;27436:1;27429:15;27463:4;27460:1;27453:15;27480:180;27528:77;27525:1;27518:88;27625:4;27622:1;27615:15;27649:4;27646:1;27639:15;27666:180;27714:77;27711:1;27704:88;27811:4;27808:1;27801:15;27835:4;27832:1;27825:15;27975:117;28084:1;28081;28074:12;28098:102;28139:6;28190:2;28186:7;28181:2;28174:5;28170:14;28166:28;28156:38;;28098:102;;;:::o;28206:247::-;28346:34;28342:1;28334:6;28330:14;28323:58;28415:30;28410:2;28402:6;28398:15;28391:55;28206:247;:::o;28459:225::-;28599:34;28595:1;28587:6;28583:14;28576:58;28668:8;28663:2;28655:6;28651:15;28644:33;28459:225;:::o;28690:181::-;28830:33;28826:1;28818:6;28814:14;28807:57;28690:181;:::o;28877:242::-;29017:34;29013:1;29005:6;29001:14;28994:58;29086:25;29081:2;29073:6;29069:15;29062:50;28877:242;:::o;29125:220::-;29265:34;29261:1;29253:6;29249:14;29242:58;29334:3;29329:2;29321:6;29317:15;29310:28;29125:220;:::o;29351:289::-;29491:34;29487:1;29479:6;29475:14;29468:58;29560:34;29555:2;29547:6;29543:15;29536:59;29629:3;29624:2;29616:6;29612:15;29605:28;29351:289;:::o;29646:225::-;29786:34;29782:1;29774:6;29770:14;29763:58;29855:8;29850:2;29842:6;29838:15;29831:33;29646:225;:::o;29877:291::-;30017:34;30013:1;30005:6;30001:14;29994:58;30086:34;30081:2;30073:6;30069:15;30062:59;30155:5;30150:2;30142:6;30138:15;30131:30;29877:291;:::o;30174:182::-;30314:34;30310:1;30302:6;30298:14;30291:58;30174:182;:::o;30362:179::-;30502:31;30498:1;30490:6;30486:14;30479:55;30362:179;:::o;30547:220::-;30687:34;30683:1;30675:6;30671:14;30664:58;30756:3;30751:2;30743:6;30739:15;30732:28;30547:220;:::o;30773:177::-;30913:29;30909:1;30901:6;30897:14;30890:53;30773:177;:::o;30956:228::-;31096:34;31092:1;31084:6;31080:14;31073:58;31165:11;31160:2;31152:6;31148:15;31141:36;30956:228;:::o;31190:229::-;31330:34;31326:1;31318:6;31314:14;31307:58;31399:12;31394:2;31386:6;31382:15;31375:37;31190:229;:::o;31425:181::-;31565:33;31561:1;31553:6;31549:14;31542:57;31425:181;:::o;31612:::-;31752:33;31748:1;31740:6;31736:14;31729:57;31612:181;:::o;31799:122::-;31872:24;31890:5;31872:24;:::i;:::-;31865:5;31862:35;31852:63;;31911:1;31908;31901:12;31852:63;31799:122;:::o;31927:116::-;31997:21;32012:5;31997:21;:::i;:::-;31990:5;31987:32;31977:60;;32033:1;32030;32023:12;31977:60;31927:116;:::o;32049:122::-;32122:24;32140:5;32122:24;:::i;:::-;32115:5;32112:35;32102:63;;32161:1;32158;32151:12;32102:63;32049:122;:::o
Swarm Source
ipfs://0d8da5709be5bbdd51febc42f7617cf8b3219a31e4b2b04703d253c70f01d8e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.