Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
XVMCtimeDeposit
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-05 */ // File: xvmc-contracts/libs/poolLibraries.sol pragma solidity 0.6.12; //openZeppelin contracts(also used by Pancakeswap). //modified IERC20 and SafeERC20(using transferXVMC instead of standard transferFrom) // File: @openzeppelin/contracts/utils/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); //transfers XVMC without allowance function transferXVMC(address _sender, address _recipient, uint256 _amount) external returns (bool); //returns owner address function owner() external view returns (address); /** * @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/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferXVMC.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: xvmc-contracts/pools/1year.sol pragma solidity 0.6.12; interface IMasterChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingEgg(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function emergencyWithdraw(uint256 _pid) external; function feeAddress() external view returns (address); function owner() external view returns (address); } interface IacPool { function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external; function getUserShares(address wallet) external view returns (uint256); function getNrOfStakes(address _user) external view returns (uint256); function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external; } interface IGovernance { function costToVote() external view returns (uint256); function rebalancePools() external; function getRollBonus(address _bonusForPool) external view returns (uint256); function stakeRolloverBonus(address _toAddress, address _depositToPool, uint256 _bonusToPay, uint256 _stakeID) external; function treasuryWallet() external view returns (address); } interface IVoting { function addCredit(uint256 amount, address _beneficiary) external; } /** * XVMC time-locked deposit * Auto-compounding pool * !!! Warning: !!! Licensed under Business Source License 1.1 (BSL 1.1) */ contract XVMCtimeDeposit is ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; struct UserInfo { uint256 shares; // number of shares for a user uint256 lastDepositedTime; // keeps track of deposited time for potential penalty uint256 xvmcAtLastUserAction; // keeps track of XVMC deposited at the last user action uint256 lastUserActionTime; // keeps track of the last user action time uint256 mandatoryTimeToServe; // optional: disables early withdraw } //allows stakes to be transferred, similar to token transfers struct StakeTransfer { uint256 shares; // ALLOWANCE of shares uint256 lastDepositedTime; uint256 mandatoryTimeToServe; } IERC20 public immutable token; // XVMC token IERC20 public immutable oldToken = IERC20(0x6d0c966c8A09e354Df9C48b446A474CE3343D912); IERC20 public immutable dummyToken; IMasterChef public masterchef; uint256 public immutable withdrawFeePeriod = 365 days; uint256 public immutable gracePeriod = 14 days; mapping(address => UserInfo[]) public userInfo; mapping(address => uint256) public userVote; //the ID the user is voting for mapping(uint256 => uint256) public totalVotesForID; //total votes for a given ID mapping(address => address) public userDelegate; //user can delegate their voting to another wallet mapping(address => bool) public trustedSender; //Pools with shorter lockup duration(trustedSender(contracts) can transfer into this pool) mapping(address => bool) public trustedPool; //Pools with longer lockup duration(can transfer from this pool into trustedPool(contracts)) mapping(address => mapping(address => StakeTransfer[])) private _stakeAllowances; //similar to token allowances, difference being it's not for amount of tokens, but for a specific stake defined by shares, latdeposittime and mandatorytime uint256 public poolID; uint256 public totalShares; address public admin; //admin = governing contract! address public treasury; //penalties go to this address address public migrationPool; //if pools are to change address public votingCreditAddress; uint256 public minimumGift = 1000000 * 1e18; bool public updateMinGiftGovernor = true; //allows automatic update by anybody to costToVote from governing contract uint256 public callFee = 5; // call fee paid for rebalancing pools bool public allowStakeTransfer = true; //enable/disable transferring of stakes to another wallet bool public allowStakeTransferFrom = false; //allow third party transfers(disabled initially) bool public partialWithdrawals = true; //partial withdrawals from stakes bool public partialTransfers = true; //allows transferring a portion of a stake bool public allowOrigin = true; //(dis)allows tx.origin for voting //safe to use tx.origin IMO. Can be disabled and use msg.sender instead //it allows the voting and delegating in a single transaction for all pools through a proxy contract // Easier to verify (opposed to checking event logs) uint256 public trustedSenderCount; uint256 public trustedPoolCount; event Deposit(address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime); event GiftDeposit(address indexed sender, address indexed recipient, uint256 amount, uint256 shares, uint256 lastDepositedTime); event AddAndExtendStake(address indexed sender, address indexed recipient, uint256 amount, uint256 stakeID, uint256 shares, uint256 lastDepositedTime); event Withdraw(address indexed sender, uint256 amount, uint256 penalty, uint256 shares); event TransferStake(address indexed sender, address indexed recipient, uint256 shares, uint256 stakeID); event HopPool(address indexed sender, uint256 XVMCamount, uint256 shares, address indexed newPool); event MigrateStake(address indexed goodSamaritan, uint256 XVMCamount, uint256 shares, address indexed recipient); event HopDeposit(address indexed recipient, uint256 amount, uint256 shares, uint256 previousLastDepositedTime, uint256 mandatoryTime); event RemoveVotes(address indexed voter, uint256 proposalID, uint256 change); event AddVotes(address indexed voter, uint256 proposalID, uint256 change); event TrustedSender(address contractAddress, bool setting); event TrustedPool(address contractAddress, bool setting); event StakeApproval(address owner, address spender, uint256 allowanceID, uint256 shareAllowance, uint256 lastDeposit, uint256 mandatoryTime); event StakeAllowanceRevoke(address owner, address spender, uint256 allowanceID); event TransferStakeFrom(address _from, address _to, uint256 _stakeID, uint256 _allowanceID); event SetDelegate(address userDelegating, address delegatee); /** * @notice Constructor * @param _token: XVMC token contract * @param _dummyToken: Dummy token contract * @param _masterchef: MasterChef contract * @param _admin: address of the admin * @param _treasury: address of the treasury (collects fees) */ constructor( IERC20 _token, IERC20 _dummyToken, IMasterChef _masterchef, address _admin, address _treasury, uint256 _poolID ) public { token = _token; dummyToken = _dummyToken; masterchef = _masterchef; admin = _admin; treasury = _treasury; poolID = _poolID; IERC20(_dummyToken).safeApprove(address(_masterchef), uint256(-1)); } /** * @notice Checks if the msg.sender is the admin */ modifier adminOnly() { require(msg.sender == admin, "admin: wut?"); _; } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Creates a NEW stake */ function deposit(uint256 _amount) external nonReentrant { require(_amount > 0, "Nothing to deposit"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[msg.sender].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, 0) ); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingAddDiff(msg.sender, votingFor, currentShares); } emit Deposit(msg.sender, _amount, currentShares, block.timestamp); } /** * Equivalent to Deposit * Instead of crediting the msg.sender, it credits custom recipient * A mechanism to gift a time-locked stake to another wallet * Users can withdraw at any time(but will pay a penalty) * Optionally stake can be irreversibly locked for a minimum period of time(minToServe) */ function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external nonReentrant { require(_amount >= minimumGift, "Below Minimum Gift"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_toAddress].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, _minToServeInSecs) ); uint256 votingFor = userVote[_toAddress]; if(votingFor != 0) { _updateVotingAddDiff(_toAddress, votingFor, currentShares); } emit GiftDeposit(msg.sender, _toAddress, _amount, currentShares, block.timestamp); } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Deposits into existing stake, effectively extending the stake * It's used for rolling over stakes by the governor(admin) as well * Mandatory Lock Up period can only be Increased * It can be Decreased if stake is being extended(after it matures) */ function addAndExtendStake(address _recipientAddr, uint256 _amount, uint256 _stakeID, uint256 _lockUpTokensInSeconds) external nonReentrant { require(_amount > 0, "Nothing to deposit"); require(userInfo[_recipientAddr].length > _stakeID, "wrong Stake ID"); if(msg.sender != admin) { require(_recipientAddr == msg.sender, "can only extend your own stake"); } uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } UserInfo storage user = userInfo[_recipientAddr][_stakeID]; user.shares = user.shares.add(currentShares); totalShares = totalShares.add(currentShares); if(_lockUpTokensInSeconds > user.mandatoryTimeToServe || block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod)) { user.mandatoryTimeToServe = _lockUpTokensInSeconds; } user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; user.lastDepositedTime = block.timestamp; uint256 votingFor = userVote[_recipientAddr]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddr, votingFor, currentShares); } emit AddAndExtendStake(msg.sender, _recipientAddr, _amount, _stakeID, currentShares, block.timestamp); } function withdrawAll(uint256 _stakeID) external { withdraw(userInfo[msg.sender][_stakeID].shares, _stakeID); } /** * Harvest pending rewards from masterchef * Governor pays the rewards for harvesting and rebalancing */ function harvest() external { IMasterChef(masterchef).withdraw(poolID, 0); } /** * @notice Sets admin address and treasury * If new governor is set, anyone can pay the gas to update the addresses * Masterchef owns the token, the governor owns the Masterchef * Treasury is feeAddress from masterchef(which collects fees from deposits into masterchef) * Currently all penalties are going to fee address(currently governing contract) * Alternatively, fee address can be set as a separate contract, which would re-distribute * The tokens back into pool(so honest stakers would directly receive penalties from prematurely ended stakes) * Alternatively could also split: a portion to honest stakers, a portion into governing contract. * With initial setting, all penalties are going towards governing contract */ function setAdmin() external { admin = IMasterChef(masterchef).owner(); treasury = IMasterChef(masterchef).feeAddress(); } //updates minimum gift to costToVote from Governing contract function updateMinimumGift() external { require(updateMinGiftGovernor, "automatic update disabled"); minimumGift = IGovernance(admin).costToVote(); } /** * @notice Withdraws from funds from the XVMC time-locked vault * @param _shares: Number of shares to withdraw */ function withdraw(uint256 _shares, uint256 _stakeID) public { require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); require(block.timestamp > user.lastDepositedTime.add(user.mandatoryTimeToServe), "must serve mandatory time"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 currentWithdrawFee = 0; if (block.timestamp < user.lastDepositedTime.add(withdrawFeePeriod)) { uint256 withdrawFee = uint256(5000).sub(((block.timestamp - user.lastDepositedTime).div(86400)).mul(1337).div(100)); currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } else if(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { uint256 withdrawFee = block.timestamp.sub(user.lastDepositedTime.add(withdrawFeePeriod)).div(86400).mul(1337).div(100); if(withdrawFee > 5000) { withdrawFee = 5000; } currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(msg.sender, currentAmount, currentWithdrawFee, _shares); token.safeTransfer(msg.sender, currentAmount); } /** * Users can transfer their stake to another pool * Can only transfer to pool with longer lock-up period(trusted pools) * Equivalent to withdrawing, but it deposits the stake into another pool as hopDeposit * Users can transfer stake without penalty * Time served gets transferred * The pool is "registered" as a "trustedSender" to another pool */ function hopStakeToAnotherPool(uint256 _shares, uint256 _stakeID, address _poolAddress) public { require(_shares > 0, "Nothing to withdraw"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 _lastDepositedTime = user.lastDepositedTime; if(trustedPool[_poolAddress]) { if(block.timestamp > _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { _lastDepositedTime = block.timestamp; //if after grace period, resets timer } } else { //can only hop into trusted Pools or into trusted sender(lower pool) after time has been served within grace period //only meant for stakeRollover. After hop, stake is extended and timer reset require(trustedSender[_poolAddress] && block.timestamp > _lastDepositedTime.add(withdrawFeePeriod) && block.timestamp < _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod), "can only hop into pre-set Pools"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } IacPool(_poolAddress).hopDeposit(currentAmount, msg.sender, _lastDepositedTime, user.mandatoryTimeToServe); //_poolAddress can only be trusted pool(contract) if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit HopPool(msg.sender, currentAmount, _shares, _poolAddress); } /** * hopDeposit is equivalent to gift deposit, exception being that the time served can be passed * The msg.sender can only be a trusted contract * The checks are already made in the hopStakeToAnotherPool function * msg sender can only be trusted senders */ function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external { require(trustedSender[msg.sender] || trustedPool[msg.sender], "only trusted senders(other pools)"); //only trustedSenders allowed. TrustedPools are under condition that the stake has matured(hopStake checks condition) uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_recipientAddress].push( UserInfo(currentShares, previousLastDepositedTime, _amount, block.timestamp, _mandatoryTime) ); uint256 votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, currentShares); } emit HopDeposit(_recipientAddress, _amount, currentShares, previousLastDepositedTime, _mandatoryTime); } /** * Users are encouraged to keep staking * Governor pays bonuses to re-commit and roll over your stake * Higher bonuses available for hopping into pools with longer lockup period */ function stakeRollover(address _poolInto, uint256 _stakeID) external { require(userInfo[msg.sender].length > _stakeID, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod), "stake not yet mature"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); uint256 toPay = currentAmount.mul(IGovernance(admin).getRollBonus(_poolInto)).div(10000); require(IERC20(token).balanceOf(admin) >= toPay, "governor reserves are currently insufficient"); if(_poolInto == address(this)) { IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, _stakeID); //gov sends tokens to extend the stake } else { hopStakeToAnotherPool(user.shares, _stakeID, _poolInto); //will revert if pool is wrong IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, IacPool(_poolInto).getNrOfStakes(msg.sender) - 1); //extends latest stake } } /** * Transfer stake to another account(another wallet address) */ function transferStakeToAnotherWallet(uint256 _shares, uint256 _stakeID, address _recipientAddress) external { require(allowStakeTransfer, "transfers disabled"); require(_recipientAddress != msg.sender, "can't transfer to self"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; uint256 _tokensTransferred = _shares.mul(balanceOf()).div(totalShares); require(_tokensTransferred >= minimumGift, "Below minimum threshold"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialTransfers) { require(_shares == user.shares, "must transfer full stake"); } user.shares = user.shares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, _shares); } userInfo[_recipientAddress].push( UserInfo(_shares, user.lastDepositedTime, _tokensTransferred, block.timestamp, user.mandatoryTimeToServe) ); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit TransferStake(msg.sender, _recipientAddress, _shares, _stakeID); } /** * user delegates their shares to cast a vote on a proposal * casting to proposal ID = 0 is basically neutral position (not voting) * Is origin is allowed, proxy contract can be used to vote in all pools in a single tx */ function voteForProposal(uint256 proposalID) external { address _wallet; allowOrigin ? _wallet = tx.origin : _wallet = msg.sender; uint256 votingFor = userVote[_wallet]; //the ID the user is voting for(before change) if(proposalID != votingFor) { // do nothing if false(already voting for that ID) uint256 userTotalShares = getUserTotalShares(_wallet); if(userTotalShares > 0) { //if false, no shares, thus just assign proposal ID to userVote if(proposalID != 0) { // Allocates vote to an ID if(votingFor == 0) { //starts voting, adds votes _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } else { //removes from previous vote, adds to new _updateVotingSubDiff(_wallet, votingFor, userTotalShares); _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } } else { //stops voting (previously voted, now going into neutral (=0) _updateVotingSubDiff(_wallet, votingFor, userTotalShares); } } userVote[_wallet] = proposalID; } } /* * delegatee can vote with shares of another user */ function delegateeVote(address[] calldata votingAddress, uint256 proposalID) external { for(uint256 i = 0; i < votingAddress.length; i++) { if(userDelegate[votingAddress[i]] == msg.sender) { uint256 votingFor = userVote[votingAddress[i]]; //the ID the user is voting for(before change) if(proposalID != votingFor){ uint256 userTotalShares = getUserTotalShares(votingAddress[i]); if(userTotalShares > 0) { if(proposalID != 0) { if(votingFor == 0) { _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); } } userVote[votingAddress[i]] = proposalID; } } } } /** * Users can delegate their shares */ function setDelegate(address _delegate) external { address _wallet; allowOrigin ? _wallet=tx.origin : _wallet=msg.sender; userDelegate[_wallet] = _delegate; emit SetDelegate(_wallet, _delegate); } //allows third party stake transfer(stake IDs can be changed, so instead of being identified through ID, it's identified by shares, lastdeposit and mandatory time function giveStakeAllowance(address spender, uint256 _stakeID) external { UserInfo storage user = userInfo[msg.sender][_stakeID]; require(user.shares.mul(balanceOf()).div(totalShares) >= minimumGift, "below minimum threshold"); uint256 _allowanceID = _stakeAllowances[msg.sender][spender].length; _stakeAllowances[msg.sender][spender].push( StakeTransfer(user.shares, user.lastDepositedTime, user.mandatoryTimeToServe) ); emit StakeApproval(msg.sender, spender, _allowanceID, user.shares, user.lastDepositedTime, user.mandatoryTimeToServe); } //Note: allowanceID (and not ID of the stake!) function revokeStakeAllowance(address spender, uint256 allowanceID) external { StakeTransfer[] storage allowances = _stakeAllowances[msg.sender][spender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(msg.sender, spender, allowanceID); } function nrOfstakeAllowances(address owner, address spender) public view returns (uint256) { return _stakeAllowances[owner][spender].length; } function stakeAllowances(address owner, address spender, uint256 allowanceID) public view returns (uint256, uint256, uint256) { StakeTransfer storage stakeStore = _stakeAllowances[owner][spender][allowanceID]; return (stakeStore.shares, stakeStore.lastDepositedTime, stakeStore.mandatoryTimeToServe); } /** * A third party can transfer the stake(allowance required) * Allows smart contract inter-operability similar to how regular tokens work * Can only transfer full stake (You can split the stake through other methods) * Bad: makes illiquid stakes liquid * I think best is to have the option, but leave it unavailable unless desired */ function transferStakeFrom(address _from, uint256 _stakeID, uint256 allowanceID, address _to) external returns (bool) { require(allowStakeTransferFrom, "third party stake transfers disabled"); require(_from != _to, "can't transfer to self"); require(_stakeID < userInfo[_from].length, "wrong stake ID"); UserInfo storage user = userInfo[_from][_stakeID]; (uint256 _shares, uint256 _lastDeposit, uint256 _mandatoryTime) = stakeAllowances(_from, msg.sender, allowanceID); //since stake ID can change, the stake to transfer is identified through number of shares, last deposit and mandatory time //checks if stake allowance(for allowanceID) matches the actual stake of a user require(_shares == user.shares, "incorrect stake or allowance"); require(_lastDeposit == user.lastDepositedTime, "incorrect stake or allowance"); require(_mandatoryTime == user.mandatoryTimeToServe, "incorrect stake or allowance"); uint256 votingFor = userVote[_from]; if(votingFor != 0) { _updateVotingSubDiff(_from, votingFor, _shares); } votingFor = userVote[_to]; if(votingFor != 0) { _updateVotingAddDiff(_to, votingFor, _shares); } _removeStake(_from, _stakeID); //transfer from must transfer full stake _revokeStakeAllowance(_from, allowanceID); userInfo[_to].push( UserInfo(_shares, _lastDeposit, _shares.mul(balanceOf()).div(totalShares), block.timestamp, _mandatoryTime) ); emit TransferStakeFrom(_from, _to, _stakeID, allowanceID); return true; } /** * Ability to withdraw tokens from the stake, and add voting credit * At the time of launch there is no option(voting with credit), but can be added later on */ function votingCredit(uint256 _shares, uint256 _stakeID) public { require(votingCreditAddress != address(0), "disabled"); require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(votingCreditAddress, currentAmount, 0, _shares); token.safeTransfer(votingCreditAddress, currentAmount); IVoting(votingCreditAddress).addCredit(currentAmount, msg.sender); //in the votingCreditAddress regulate how much is credited, depending on where it's coming from (msg.sender) } /** * Allows the pools to be changed to new contracts * if migration Pool is set * anyone can be a "good Samaritan" * and transfer the stake of another user to the new pool */ function migrateStake(address _staker, uint256 _stakeID) public { require(migrationPool != address(0), "migration not activated"); require(_stakeID < userInfo[_staker].length, "invalid stake ID"); UserInfo storage user = userInfo[_staker][_stakeID]; require(user.shares > 0, "no balance"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); totalShares = totalShares.sub(user.shares); user.shares = 0; // equivalent to deleting the stake. Pools are no longer to be used, //setting user shares to 0 is sufficient IacPool(migrationPool).hopDeposit(currentAmount, _staker, user.lastDepositedTime, user.mandatoryTimeToServe); emit MigrateStake(msg.sender, currentAmount, user.shares, _staker); } /** * loop and migrate all user stakes * could run out of gas if too many stakes */ function migrateAllStakes(address _staker) external { UserInfo[] storage user = userInfo[_staker]; uint256 userStakes = user.length; for(uint256 i=0; i < userStakes; i++) { migrateStake(_staker, i); } } /** * Returns number of stakes for a user */ function getNrOfStakes(address _user) external view returns (uint256) { return userInfo[_user].length; } /** * Returns all shares for a user */ function getUserTotalShares(address _user) public view returns (uint256) { UserInfo[] storage _stake = userInfo[_user]; uint256 nrOfUserStakes = _stake.length; uint256 countShares = 0; for(uint256 i=0; i < nrOfUserStakes; i++) { countShares += _stake[i].shares; } return countShares; } /** * @notice Calculates the expected harvest reward from third party * @return Expected reward to collect in XVMC */ function calculateHarvestXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); uint256 currentCallFee = amount.mul(callFee).div(10000); return currentCallFee; } /** * @return Returns total pending xvmc rewards */ function calculateTotalPendingXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return amount; } /** * @notice Calculates the price per share */ function getPricePerFullShare() external view returns (uint256) { return totalShares == 0 ? 1e18 : balanceOf().mul(1e18).div(totalShares); } /** * @notice returns number of shares for a certain stake of an user */ function getUserShares(address _wallet, uint256 _stakeID) public view returns (uint256) { return userInfo[_wallet][_stakeID].shares; } /** * @notice Calculates the total underlying tokens * @dev It includes tokens held by the contract and held in MasterChef */ function balanceOf() public view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return token.balanceOf(address(this)).add(amount); } //enables or disables ability to draw stake from another wallet(allowance required) function enableDisableStakeTransferFrom(bool _setting) external adminOnly { allowStakeTransferFrom = _setting; } /** * @notice Sets call fee * @dev Only callable by the contract admin. */ function setCallFee(uint256 _callFee) external adminOnly { callFee = _callFee; } /* * set trusted senders, other pools that we can receive from (that can hopDeposit) * guaranteed to be trusted (they rely lastDepositTime) */ function setTrustedSender(address _sender, bool _setting) external adminOnly { if(trustedSender[_sender] != _setting) { trustedSender[_sender] = _setting; _setting ? trustedSenderCount++ : trustedSenderCount--; emit TrustedSender(_sender, _setting); } } /** * set trusted pools, the smart contracts that we can send the tokens to without penalty * NOTICE: new pool must be set as trusted contract(to be able to draw balance without allowance) */ function setTrustedPool(address _pool, bool _setting) external adminOnly { if(trustedPool[_pool] != _setting) { trustedPool[_pool] = _setting; _setting ? trustedPoolCount++ : trustedPoolCount--; emit TrustedPool(_pool, _setting); } } /** * set address of new pool that we can migrate into * !!! NOTICE !!! * new pool must be set as trusted contract in the token contract by the governor(to be able to draw balance without allowance) */ function setMigrationPool(address _newPool) external adminOnly { migrationPool = _newPool; } /** * Enable or disable partial withdrawals from stakes */ function modifyPartialWithdrawals(bool _decision) external adminOnly { partialWithdrawals = _decision; } function modifyPartialTransfers(bool _decision) external adminOnly { partialTransfers = _decision; } function enableDisableStakeTransfer(bool _setting) external adminOnly { allowStakeTransfer = _setting; } /** * @notice Withdraws from MasterChef to Vault without caring about rewards. * @dev EMERGENCY ONLY. Only callable by the contract admin. */ function emergencyWithdraw() external adminOnly { IMasterChef(masterchef).emergencyWithdraw(poolID); token.safeTransfer(admin, token.balanceOf(address(this))); } /* * Unlikely, but Masterchef can be changed if needed to be used without changing pools * masterchef = IMasterChef(token.owner()); * Must stop earning first(withdraw tokens from old chef) */ function setMasterChefAddress(IMasterChef _masterchef, uint256 _newPoolID) external adminOnly { masterchef = _masterchef; poolID = _newPoolID; //in case pool ID changes uint256 _dummyAllowance = IERC20(dummyToken).allowance(address(this), address(masterchef)); if(_dummyAllowance == 0) { IERC20(dummyToken).safeApprove(address(_masterchef), type(uint256).max); } } /** * When contract is launched, dummyToken shall be deposited to start earning rewards */ function startEarning() external adminOnly { IMasterChef(masterchef).deposit(poolID, dummyToken.balanceOf(address(this))); } /** * Dummy token can be withdrawn if ever needed(allows for flexibility) */ function stopEarning(uint256 _withdrawAmount) external adminOnly { if(_withdrawAmount == 0) { IMasterChef(masterchef).withdraw(poolID, dummyToken.balanceOf(address(masterchef))); } else { IMasterChef(masterchef).withdraw(poolID, _withdrawAmount); } } /** * Withdraws dummyToken to owner(who can burn it if needed) */ function withdrawDummy(uint256 _amount) external adminOnly { if(_amount == 0) { dummyToken.safeTransfer(admin, dummyToken.balanceOf(address(this))); } else { dummyToken.safeTransfer(admin, _amount); } } function allowTxOrigin(bool _setting) external adminOnly { allowOrigin = _setting; } //sets minimum amount(for sending gift, transferring to another wallet,...) //if setting is enabled, minimumGift can be auto-updated to costToVote from governor by anybody function setMinimumGiftDeposit(uint256 _amount, bool _setting) external adminOnly { minimumGift = _amount; updateMinGiftGovernor = _setting; } function regulateVotingCredit(address _newAddress) external adminOnly { votingCreditAddress = _newAddress; } /** * option to withdraw wrongfully sent tokens(but requires change of the governing contract to do so) * If you send wrong tokens to the contract address, consider them lost. Though there is possibility of recovery */ function withdrawStuckTokens(address _tokenAddress) external adminOnly { require(_tokenAddress != address(token), "wrong token"); require(_tokenAddress != address(dummyToken), "wrong token"); IERC20(_tokenAddress).safeTransfer(IGovernance(admin).treasuryWallet(), IERC20(_tokenAddress).balanceOf(address(this))); } //Note: allowanceID (and not ID of the stake!) function _revokeStakeAllowance(address owner, uint256 allowanceID) private { StakeTransfer[] storage allowances = _stakeAllowances[owner][msg.sender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(owner, msg.sender, allowanceID); } /** * updates votes(whenever there is transfer of funds) */ function _updateVotingAddDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].add(diff); emit AddVotes(voter, proposalID, diff); } function _updateVotingSubDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].sub(diff); emit RemoveVotes(voter, proposalID, diff); } /** * removes the stake */ function _removeStake(address _staker, uint256 _stakeID) private { UserInfo[] storage stakes = userInfo[_staker]; uint256 lastStakeID = stakes.length - 1; if(_stakeID != lastStakeID) { stakes[_stakeID] = stakes[lastStakeID]; } stakes.pop(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IERC20","name":"_dummyToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_poolID","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"AddAndExtendStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"GiftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"HopDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"newPool","type":"address"}],"name":"HopPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"goodSamaritan","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"MigrateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"RemoveVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userDelegating","type":"address"},{"indexed":false,"internalType":"address","name":"delegatee","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"StakeAllowanceRevoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAllowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"StakeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"TransferStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allowanceID","type":"uint256"}],"name":"TransferStakeFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedSender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"_lockUpTokensInSeconds","type":"uint256"}],"name":"addAndExtendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowOrigin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"allowTxOrigin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"votingAddress","type":"address[]"},{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"delegateeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dummyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minToServeInSecs","type":"uint256"}],"name":"giftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"giveStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"_mandatoryTime","type":"uint256"}],"name":"hopDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"hopStakeToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"migrateAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"migrateStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"nrOfstakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"regulateVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"revokeStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPool","type":"address"}],"name":"setMigrationPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMinimumGiftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"stakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolInto","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRollover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"stopEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalVotesForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"allowanceID","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferStakeFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"transferStakeToAnotherWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedSenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinGiftGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinimumGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"xvmcAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"mandatoryTimeToServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040527f6d0c966c8a09e354df9c48b446a474ce3343d91200000000000000000000000060a0526301e1338060e052621275006101005269d3c21bcecceda1000000600f5560108054600160ff1991821681179092556005601155601280546401000000006301000000620100009290941690941762ffff0019161763ff00000019169190911760ff60201b1916919091179055348015620000a357600080fd5b5060405162005eb038038062005eb0833981810160405260c0811015620000c957600080fd5b508051602080830151604084015160608086015160808088015160a090980151600160008190556001600160601b031989861b81169093529386901b90911660c05282546001600160a01b038086166001600160a01b031992831617909455600b8054858516908316179055600c8054858b16921691909117905560098190559596939592949093929162000171919087169086906000199062004d786200017d821b17901c565b50505050505062000590565b80158062000207575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620001d757600080fd5b505afa158015620001ec573d6000803e3d6000fd5b505050506040513d60208110156200020357600080fd5b5051155b620002445760405162461bcd60e51b815260040180806020018281038252603681526020018062005e7a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200029c918591620002a116565b505050565b6060620002fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200035d60201b62004e8b179092919060201c565b8051909150156200029c578080602001905160208110156200031e57600080fd5b50516200029c5760405162461bcd60e51b815260040180806020018281038252602a81526020018062005e50602a913960400191505060405180910390fd5b60606200036e848460008562000378565b90505b9392505050565b606082471015620003bb5760405162461bcd60e51b815260040180806020018281038252602681526020018062005e2a6026913960400191505060405180910390fd5b620003c685620004e0565b62000418576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620004595780518252601f19909201916020918201910162000438565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620004bd576040519150601f19603f3d011682016040523d82523d6000602084013e620004c2565b606091505b509092509050620004d5828286620004e6565b979650505050505050565b3b151590565b60608315620004f757508162000371565b825115620005085782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620005545781810151838201526020016200053a565b50505050905090810190601f168015620005825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c60a05160601c60c05160601c60e051610100516157b16200067960003980610f3e5280610ff85280611e575280612e9b525080610f635280610fc5528061101d5280611d915280611e7b5280611ed0528061362f52806139a95280614c2c52508061132452806113a352806113e052806124a852806126b75280612a0a5280612a925280612f3b528061449f52508061339d525080611e175280611f3e528061202a528061233a52806125795280612b7d528061356352806137dc5280613af8528061442a52806149215280614b355280614bb45280614d5652506157b16000f3fe608060405234801561001057600080fd5b50600436106104495760003560e01c806390321e1a11610241578063ca208adb1161013b578063ddd9d045116100c3578063e89bfdab11610087578063e89bfdab14610ca4578063f5ba1c8714610cac578063f851a44014610cd2578063fb1db27814610cda578063fc0c546a14610ce257610449565b8063ddd9d04514610c25578063ded6275e14610c51578063df10b4e614610c59578063e56d607d14610c61578063e5ea69ff14610c7e57610449565b8063d693f8341161010a578063d693f83414610b8f578063d6d3774b14610bb5578063d6fe340514610bd8578063d71a4bc214610bf7578063db2e21bc14610c1d57610449565b8063ca208adb14610af6578063ca5eb5e114610b24578063cb96372814610b4a578063cc7c7dec14610b7057610449565b8063b330fc53116101c9578063ba1797871161018d578063ba179787146109f6578063bbb224f014610a66578063bdcd9c8014610a6e578063be50baa914610a9a578063c721308f14610aee57610449565b8063b330fc5314610947578063b3f5f6551461096d578063b6b55f25146109a5578063b7cdbed3146109c2578063b949103b146109ee57610449565b8063a06db7dc11610210578063a06db7dc146108f5578063a36e40fc146108fd578063a56924bd14610905578063aaa9603a1461090d578063b31c710a1461093f57610449565b806390321e1a146108a9578063955afa6c146108b1578063958e2d31146108b95780639f6a9283146108d657610449565b80633b500bcb1161035257806364f5c072116102da578063800b2f341161029e578063800b2f34146107e95780638482b20214610815578063859f267f146108415780638d934485146108735780638ffdce691461087b57610449565b806364f5c072146107ac57806367479ec5146107b4578063722713f7146107bc57806377c7b8fc146107c45780637eb3f084146107cc57610449565b8063527cc2f111610321578063527cc2f1146106df57806352d816471461070b57806359a8fd981461072a57806361d027b314610750578063626718971461077457610449565b80633b500bcb146106545780633f6ba4151461068e578063441a3e70146106b45780634641257d146106d757610449565b806321ce919d116103d55780632cae2096116103a45780632cae2096146106065780632e8ba0391461060e578063341d609f14610616578063343d927e146106445780633a98ef391461064c57610449565b806321ce919d14610582578063221665e5146105d957806325c6ea1f146105e157806326465826146105e957610449565b8063159ad8cd1161041c578063159ad8cd146104e45780631718e21114610501578063174628d11461051b578063182c1da1146105555780631de8e5921461055d57610449565b8063045c6ce01461044e578063062d5ed41461046d5780630b799acf1461049f5780630cf57ace146104be575b600080fd5b61046b6004803603602081101561046457600080fd5b5035610cea565b005b61046b6004803603606081101561048357600080fd5b50803590602081013590604001356001600160a01b0316610da2565b61046b600480360360208110156104b557600080fd5b503515156111fd565b61046b600480360360208110156104d457600080fd5b50356001600160a01b031661126a565b61046b600480360360208110156104fa57600080fd5b50356112a7565b61050961140c565b60408051918252519081900360200190f35b6105416004803603602081101561053157600080fd5b50356001600160a01b0316611412565b604080519115158252519081900360200190f35b610541611427565b61046b6004803603604081101561057357600080fd5b50803590602001351515611430565b6105ae6004803603604081101561059857600080fd5b506001600160a01b038135169060200135611496565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61046b6114e1565b6105096115b7565b61046b600480360360208110156105ff57600080fd5b50356115bd565b61046b61160f565b61054161172f565b6105096004803603604081101561062c57600080fd5b506001600160a01b0381358116916020013516611738565b610509611765565b61050961176b565b6105416004803603608081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611771565b610541600480360360208110156106a457600080fd5b50356001600160a01b0316611b63565b61046b600480360360408110156106ca57600080fd5b5080359060200135611b78565b61046b612059565b61046b600480360360408110156106f557600080fd5b506001600160a01b0381351690602001356120c3565b61046b6004803603602081101561072157600080fd5b503515156121d0565b61046b6004803603602081101561074057600080fd5b50356001600160a01b031661223b565b6107586122aa565b604080516001600160a01b039092168252519081900360200190f35b61046b6004803603608081101561078a57600080fd5b508035906001600160a01b0360208201351690604081013590606001356122b9565b610541612495565b6107586124a6565b6105096124ca565b6105096125f8565b61046b600480360360208110156107e257600080fd5b5035612632565b61046b600480360360408110156107ff57600080fd5b506001600160a01b038135169060200135612800565b61046b6004803603604081101561082b57600080fd5b506001600160a01b038135169060200135612975565b61046b6004803603606081101561085757600080fd5b508035906001600160a01b036020820135169060400135612abb565b610509612cd9565b61046b6004803603604081101561089157600080fd5b506001600160a01b0381351690602001351515612cdf565b610509612de3565b610758612de9565b61046b600480360360208110156108cf57600080fd5b5035612df8565b61046b600480360360208110156108ec57600080fd5b50351515612e30565b610509612e99565b61046b612ebd565b610541612ff6565b61046b6004803603606081101561092357600080fd5b50803590602081013590604001356001600160a01b0316613004565b61075861339b565b6107586004803603602081101561095d57600080fd5b50356001600160a01b03166133bf565b61046b6004803603608081101561098357600080fd5b506001600160a01b0381351690602081013590604081013590606001356133da565b61046b600480360360208110156109bb57600080fd5b503561371f565b61046b600480360360408110156109d857600080fd5b506001600160a01b038135169060200135613923565b610541613d67565b61046b60048036036040811015610a0c57600080fd5b810190602081018135640100000000811115610a2757600080fd5b820183602082011115610a3957600080fd5b80359060200191846020830284011164010000000083111715610a5b57600080fd5b919350915035613d76565b610509613f0d565b61046b60048036036040811015610a8457600080fd5b506001600160a01b038135169060200135613f99565b610ad060048036036060811015610ab057600080fd5b506001600160a01b038135811691602081013590911690604001356141d3565b60408051938452602084019290925282820152519081900360600190f35b610541614239565b61046b60048036036040811015610b0c57600080fd5b506001600160a01b0381351690602001351515614249565b61046b60048036036020811015610b3a57600080fd5b50356001600160a01b031661434c565b61046b60048036036020811015610b6057600080fd5b50356001600160a01b03166143db565b61046b60048036036020811015610b8657600080fd5b50351515614607565b61046b60048036036020811015610ba557600080fd5b50356001600160a01b031661466e565b61046b60048036036040811015610bcb57600080fd5b50803590602001356146dd565b61046b60048036036020811015610bee57600080fd5b5035151561499d565b61050960048036036020811015610c0d57600080fd5b50356001600160a01b03166149fd565b61046b614a55565b61050960048036036040811015610c3b57600080fd5b506001600160a01b038135169060200135614bdd565b610758614c1b565b610509614c2a565b61050960048036036020811015610c7757600080fd5b5035614c4e565b61050960048036036020811015610c9457600080fd5b50356001600160a01b0316614c60565b610509614c7b565b61050960048036036020811015610cc257600080fd5b50356001600160a01b0316614d24565b610758614d36565b610758614d45565b610758614d54565b601254600090640100000000900460ff16610d0757503380610d0b565b5032805b506001600160a01b038116600090815260036020526040902054828114610d9d576000610d37836149fd565b90508015610d80578315610d755781610d5a57610d55838583614ea4565b610d70565b610d65838383614f19565b610d70838583614ea4565b610d80565b610d80838383614f19565b506001600160a01b03821660009081526003602052604090208390555b505050565b60008311610ded576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b336000908152600260205260409020548210610e41576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b336000908152600260205260408120805484908110610e5c57fe5b906000526020600020906005020190508060000154841115610eb3576040805162461bcd60e51b815260206004820152601f6024820152600080516020615696833981519152604482015290519081900360640190fd5b60125462010000900460ff16610f135780548414610f13576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b60018101546001600160a01b03831660009081526007602052604090205460ff1615610f9c57610f8d7f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f8e565b90614f8e565b421115610f975750425b611095565b6001600160a01b03831660009081526006602052604090205460ff168015610fec5750610fe9817f0000000000000000000000000000000000000000000000000000000000000000614f8e565b42115b801561104457506110417f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f8e565b42105b611095576040805162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c7920686f7020696e746f207072652d73657420506f6f6c7300604482015290519081900360640190fd5b60006110b5600a546110af886110a96124ca565b90614fe8565b90615041565b83549091506110c490876150a8565b8355600a546110d390876150a8565b600a553360009081526003602052604090205480156110f7576110f7338289614f19565b60048085015460408051636267189760e01b8152928301859052336024840152604483018690526064830191909152516001600160a01b03871691636267189791608480830192600092919082900301818387803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b505085541591506111a2905057611192600a546110af61118a6124ca565b875490614fe8565b60028501554260038501556111ac565b6111ac3387615105565b604080518381526020810189905281516001600160a01b0388169233927f2391574aca0f6cc92f9588562ee00a7c2d33f83d17d01d8fa177ba4423740f44929081900390910190a350505050505050565b600b546001600160a01b0316331461124a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156401000000000264ff0000000019909216919091179055565b6001600160a01b0381166000908152600260205260408120805490915b818110156112a1576112998482613f99565b600101611287565b50505050565b600b546001600160a01b031633146112f4576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b806113cf57600b54604080516370a0823160e01b815230600482015290516113ca926001600160a01b03908116927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b15801561136d57600080fd5b505afa158015611381573d6000803e3d6000fd5b505050506040513d602081101561139757600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d7565b611409565b600b54611409906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116836151d7565b50565b600f5481565b60076020526000908152604090205460ff1681565b60125460ff1681565b600b546001600160a01b0316331461147d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600f919091556010805460ff1916911515919091179055565b600260205281600052604060002081815481106114af57fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60105460ff16611538576040805162461bcd60e51b815260206004820152601960248201527f6175746f6d61746963207570646174652064697361626c656400000000000000604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b03166351a41dec6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d60208110156115b057600080fd5b5051600f55565b60145481565b600b546001600160a01b0316331461160a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601155565b600160009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561165d57600080fd5b505afa158015611671573d6000803e3d6000fd5b505050506040513d602081101561168757600080fd5b5051600b80546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b8152905191909216916341275358916004808301926020929190829003018186803b1580156116e257600080fd5b505afa1580156116f6573d6000803e3d6000fd5b505050506040513d602081101561170c57600080fd5b5051600c80546001600160a01b0319166001600160a01b03909216919091179055565b60105460ff1681565b6001600160a01b038083166000908152600860209081526040808320938516835292905220545b92915050565b60135481565b600a5481565b601254600090610100900460ff166117ba5760405162461bcd60e51b81526004018080602001828103825260248152602001806157586024913960400191505060405180910390fd5b816001600160a01b0316856001600160a01b0316141561181a576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b6001600160a01b0385166000908152600260205260409020548410611877576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b6001600160a01b038516600090815260026020526040812080548690811061189b57fe5b9060005260206000209060050201905060008060006118bb8933896141d3565b92509250925083600001548314611919576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b83600101548214611971576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b836004015481146119c9576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b6001600160a01b03891660009081526003602052604090205480156119f3576119f38a8286614f19565b506001600160a01b0386166000908152600360205260409020548015611a1e57611a1e878286614ea4565b611a288a8a615105565b611a328a89615229565b60026000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280868152602001858152602001611a86600a546110af611a7f6124ca565b8a90614fe8565b8152602001428152602001848152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015550507f017cb7d605aa3dcd304a9eb2a4df6075576ccc4a5dc2fe0b518c558e8f75338d8a888b8b60405180856001600160a01b03168152602001846001600160a01b0316815260200183815260200182815260200194505050505060405180910390a15060019998505050505050505050565b60066020526000908152604090205460ff1681565b336000908152600260205260409020548110611bce576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b336000908152600260205260408120805483908110611be957fe5b9060005260206000209060050201905060008311611c44576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115611c88576040805162461bcd60e51b815260206004820152601f6024820152600080516020615696833981519152604482015290519081900360640190fd5b60048101546001820154611c9b91614f8e565b4211611cee576040805162461bcd60e51b815260206004820152601960248201527f6d757374207365727665206d616e6461746f72792074696d6500000000000000604482015290519081900360640190fd5b60125462010000900460ff16611d4e5780548314611d4e576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b6000611d62600a546110af866110a96124ca565b8254909150611d7190856150a8565b8255600a54611d8090856150a8565b600a556001820154600090611db5907f0000000000000000000000000000000000000000000000000000000000000000614f8e565b421015611e52576000611df1611de860646110af6105396110a9620151808a60010154420361504190919063ffffffff16565b611388906150a8565b9050611e036127106110af8584614fe8565b600c54909250611e40906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d7565b611e4a83836150a8565b925050611f75565b611ead7f0000000000000000000000000000000000000000000000000000000000000000610f877f00000000000000000000000000000000000000000000000000000000000000008660010154614f8e90919063ffffffff16565b421115611f75576000611f0960646110af6105396110a9620151806110af611f027f00000000000000000000000000000000000000000000000000000000000000008c60010154614f8e90919063ffffffff16565b42906150a8565b9050611388811115611f1a57506113885b611f2a6127106110af8584614fe8565b600c54909250611f67906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d7565b611f7183836150a8565b9250505b825415611faf57611f9f600a546110af611f9785611f916124ca565b906150a8565b865490614fe8565b6002840155426003840155611fb9565b611fb93385615105565b336000908152600360205260409020548015611fda57611fda338288614f19565b6040805184815260208101849052808201889052905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a26120516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633856151d7565b505050505050565b60015460095460408051630441a3e760e41b8152600481019290925260006024830181905290516001600160a01b039093169263441a3e7092604480820193929182900301818387803b1580156120af57600080fd5b505af11580156112a1573d6000803e3d6000fd5b3360009081526008602090815260408083206001600160a01b0386168452909152812080549091906120f69060016150a8565b905080831461214e5781818154811061210b57fe5b906000526020600020906003020182848154811061212557fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b8180548061215857fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080513381526001600160a01b03871692810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b600b546001600160a01b0316331461221d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805491151563010000000263ff00000019909216919091179055565b600b546001600160a01b03163314612288576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b031681565b3360009081526006602052604090205460ff16806122e657503360009081526007602052604090205460ff165b6123215760405162461bcd60e51b81526004018080602001828103825260218152602001806156b66021913960400191505060405180910390fd5b600061232b6124ca565b90506123626001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088615336565b6000600a5460001461238e57612387826110af600a5489614fe890919063ffffffff16565b9050612391565b50845b600a5461239e9082614f8e565b600a556001600160a01b0385166000818152600260208181526040808420815160a0810183528781528084018b81528184018e81524260608401908152608084018d8152855460018181018855968b52888b2095516005909102909501948555925194840194909455519582019590955590516003808301919091559351600490910155938352522054801561243957612439868284614ea4565b60408051888152602081018490528082018790526060810186905290516001600160a01b038816917fb66a80ae2ebf4737952b9c2b57a9d34ef56806ab937f481b75197ae991d81afb919081900360800190a250505050505050565b601254640100000000900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b15801561252457600080fd5b505afa158015612538573d6000803e3d6000fd5b505050506040513d602081101561254e57600080fd5b5051604080516370a0823160e01b815230600482015290519192506125f29183916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b1580156125c057600080fd5b505afa1580156125d4573d6000803e3d6000fd5b505050506040513d60208110156125ea57600080fd5b505190614f8e565b91505090565b6000600a546000146126235761261e600a546110af670de0b6b3a76400006110a96124ca565b61262d565b670de0b6b3a76400005b905090565b600b546001600160a01b0316331461267f576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b8061278e57600154600954604080516370a0823160e01b81526001600160a01b03938416600482018190529151919363441a3e7093927f0000000000000000000000000000000000000000000000000000000000000000909116916370a08231916024808301926020929190829003018186803b1580156126ff57600080fd5b505afa158015612713573d6000803e3d6000fd5b505050506040513d602081101561272957600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b50505050611409565b60015460095460408051630441a3e760e41b8152600481019290925260248201849052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b5050505050565b33600090815260026020526040812080548390811061281b57fe5b90600052602060002090600502019050600f54612847600a546110af61283f6124ca565b855490614fe8565b101561289a576040805162461bcd60e51b815260206004820152601760248201527f62656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b3360008181526008602090815260408083206001600160a01b0388168085528184528285208054928552835160608082018652895482526001808b018054848a0190815260048d018054868b01908152848a018855968c529a8a90209451600389029095019485555191840191909155925160029092019190915588549154965485519889529588019290925286840183905290860152608085019390935260a08401919091525190917f13356b03fc409456fbfbc8b432cb402b7841b3114d1d159625eb0f3d4e3a4681919081900360c00190a150505050565b600b546001600160a01b031633146129c2576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b038481169190911791829055600983905560408051636eb1769f60e11b81523060048201529282166024840152516000927f00000000000000000000000000000000000000000000000000000000000000009092169163dd62ed3e916044808301926020929190829003018186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b5051905080610d9d57610d9d6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684600019614d78565b60026000541415612b13576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600f54831015612b64576040805162461bcd60e51b815260206004820152601260248201527110995b1bddc8135a5b9a5b5d5b4811da599d60721b604482015290519081900360640190fd5b6000612b6e6124ca565b9050612ba56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615336565b6000600a54600014612bd157612bca826110af600a5488614fe890919063ffffffff16565b9050612bd4565b50835b600a54612be19082614f8e565b600a556001600160a01b0384166000818152600260208181526040808420815160a081018352878152428185018181528285018e815260608401928352608084018d8152855460018181018855968b52888b2095516005909102909501948555915194840194909455925195820195909555935160038086019190915590516004909401939093559383525220548015612c8057612c80858284614ea4565b6040805187815260208101849052428183015290516001600160a01b0387169133917f190f4e47df17911728b041870d3cd75008c166bb9d8cde694aaa68f73ad415829181900360600190a35050600160005550505050565b60095481565b600b546001600160a01b03163314612d2c576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16151581151514612ddf576001600160a01b0382166000908152600760205260409020805460ff191682151517905580612d8c57601480546000198101909155612d98565b60148054600181019091555b50604080516001600160a01b0384168152821515602082015281517f808293acec1c44217eccd857d5abb88ff31456d23bf3a000d2f5aee5f92f4c19929181900390910190a15b5050565b60115481565b600d546001600160a01b031681565b3360009081526002602052604090208054611409919083908110612e1857fe5b90600052602060002090600502016000015482611b78565b600b546001600160a01b03163314612e7d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60128054911515620100000262ff000019909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b546001600160a01b03163314612f0a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600154600954604080516370a0823160e01b815230600482015290516001600160a01b039384169363e2bbb15893927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b158015612f8457600080fd5b505afa158015612f98573d6000803e3d6000fd5b505050506040513d6020811015612fae57600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b1580156120af57600080fd5b601254610100900460ff1681565b60125460ff16613050576040805162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c9cc8191a5cd8589b195960721b604482015290519081900360640190fd5b6001600160a01b0381163314156130a7576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b3360009081526002602052604090205482106130fb576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b33600090815260026020526040812080548490811061311657fe5b906000526020600020906005020190506000613140600a546110af6131396124ca565b8890614fe8565b9050600f54811015613199576040805162461bcd60e51b815260206004820152601760248201527f42656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b81548511156131dd576040805162461bcd60e51b815260206004820152601f6024820152600080516020615696833981519152604482015290519081900360640190fd5b6012546301000000900460ff1661323e578154851461323e576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b815461324a90866150a8565b825533600090815260036020526040902054801561326d5761326d338288614f19565b506001600160a01b038316600090815260036020526040902054801561329857613298848288614ea4565b6001600160a01b0384166000908152600260208181526040808420815160a0810183528b81526001808a015482860190815293820189815242606084019081526004808d01546080860190815286548086018855968b5297909920935160059095029093019384559351908301559151938101939093555160038301555191015582541561334157613331600a546110af611f976124ca565b600284015542600384015561334b565b61334b3386615105565b604080518781526020810187905281516001600160a01b0387169233927ff3f8af030ee2cfc3c3c4ea260e6bcdd578eb1558b6eb3d79f7d0617ddbdc5b78929081900390910190a3505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005602052600090815260409020546001600160a01b031681565b60026000541415613432576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000558261347e576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205482106134db576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c814dd185ad948125160921b604482015290519081900360640190fd5b600b546001600160a01b0316331461354a576001600160a01b038416331461354a576040805162461bcd60e51b815260206004820152601e60248201527f63616e206f6e6c7920657874656e6420796f7572206f776e207374616b650000604482015290519081900360640190fd5b60006135546124ca565b905061358b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615336565b6000600a546000146135b7576135b0826110af600a5488614fe890919063ffffffff16565b90506135ba565b50835b6001600160a01b03861660009081526002602052604081208054869081106135de57fe5b90600052602060002090600502019050613605828260000154614f8e90919063ffffffff16565b8155600a546136149083614f8e565b600a55600481015484118061365657506001810154613653907f0000000000000000000000000000000000000000000000000000000000000000614f8e565b42115b1561366357600481018490555b61367c600a546110af6136746124ca565b845490614fe8565b600282015542600380830182905560018301919091556001600160a01b0388166000908152602091909152604090205480156136bd576136bd888285614ea4565b604080518881526020810188905280820185905242606082015290516001600160a01b038a169133917f7f65dfb94bab62e0708845150044cf7ad9c77fbfe6ba9e3c8c1f210e15aa953d9181900360800190a350506001600055505050505050565b60026000541415613777576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055806137c3576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b60006137cd6124ca565b90506138046001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085615336565b6000600a5460001461383057613829826110af600a5486614fe890919063ffffffff16565b9050613833565b50815b600a546138409082614f8e565b600a55336000818152600260208181526040808420815160a081018352878152428185018181528285018c81526060840192835260808401898152855460018181018855968b52888b20955160059091029095019485559151948401949094559251958201959095559351600380860191909155905160049094019390935593835252205480156138d6576138d6338284614ea4565b60408051858152602081018490524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a2505060016000555050565b336000908152600260205260409020548110613979576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061399457fe5b906000526020600020906005020190506139db7f00000000000000000000000000000000000000000000000000000000000000008260010154614f8e90919063ffffffff16565b4211613a25576040805162461bcd60e51b81526020600482015260146024820152737374616b65206e6f7420796574206d617475726560601b604482015290519081900360640190fd5b6000613a3d600a546110af84600001546110a96124ca565b600b546040805163ded6e1c960e01b81526001600160a01b0388811660048301529151939450600093613ace93612710936110af9391169163ded6e1c991602480820192602092909190829003018186803b158015613a9b57600080fd5b505afa158015613aaf573d6000803e3d6000fd5b505050506040513d6020811015613ac557600080fd5b50518590614fe8565b600b54604080516370a0823160e01b81526001600160a01b039283166004820152905192935083927f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015613b4157600080fd5b505afa158015613b55573d6000803e3d6000fd5b505050506040513d6020811015613b6b57600080fd5b50511015613baa5760405162461bcd60e51b815260040180806020018281038252602c815260200180615644602c913960400191505060405180910390fd5b6001600160a01b038516301415613c3a57600b546040805163e5f59bc160e01b81523360048201526001600160a01b03888116602483015260448201859052606482018890529151919092169163e5f59bc191608480830192600092919082900301818387803b158015613c1d57600080fd5b505af1158015613c31573d6000803e3d6000fd5b505050506127f9565b8254613c47908587610da2565b600b60009054906101000a90046001600160a01b03166001600160a01b031663e5f59bc133878460018a6001600160a01b031663e5ea69ff336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cbd57600080fd5b505afa158015613cd1573d6000803e3d6000fd5b505050506040513d6020811015613ce757600080fd5b5051604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252900360648201529051608480830192600092919082900301818387803b158015613d4857600080fd5b505af1158015613d5c573d6000803e3d6000fd5b505050505050505050565b60125462010000900460ff1681565b60005b828110156112a1573360056000868685818110613d9257fe5b6001600160a01b0360209182029390930135831684528301939093526040909101600020541691909114159050613f0557600060036000868685818110613dd557fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020549050808314613f03576000613e35868685818110613e2057fe5b905060200201356001600160a01b03166149fd565b90508015613ebc578315613ead5781613e7357613e6e868685818110613e5757fe5b905060200201356001600160a01b03168583614ea4565b613ea8565b613e99868685818110613e8257fe5b905060200201356001600160a01b03168383614f19565b613ea8868685818110613e5757fe5b613ebc565b613ebc868685818110613e8257fe5b8360036000888887818110613ecd57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002081905550505b505b600101613d79565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015613f6757600080fd5b505afa158015613f7b573d6000803e3d6000fd5b505050506040513d6020811015613f9157600080fd5b505191505090565b600d546001600160a01b0316613ff6576040805162461bcd60e51b815260206004820152601760248201527f6d6967726174696f6e206e6f7420616374697661746564000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600260205260409020548110614055576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b6001600160a01b038216600090815260026020526040812080548390811061407957fe5b9060005260206000209060050201905060008160000154116140cf576040805162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b604482015290519081900360640190fd5b60006140e7600a546110af84600001546110a96124ca565b8254600a549192506140f991906150a8565b600a556000808355600d54600184015460048086015460408051636267189760e01b81529283018790526001600160a01b038a81166024850152604484019490945260648301919091525191909216926362671897926084808201939182900301818387803b15801561416b57600080fd5b505af115801561417f573d6000803e3d6000fd5b5050835460408051858152602081019290925280516001600160a01b03891694503393507fe28c7cce19d5f22ab16a04ca1bb768f7533bf719280b5e40718b41c2641ac3099281900390910190a350505050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054829182918291908690811061420d57fe5b600091825260209091206003909102018054600182015460029092015490999198509650945050505050565b6012546301000000900460ff1681565b600b546001600160a01b03163314614296576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526006602052604090205460ff16151581151514612ddf576001600160a01b0382166000908152600660205260409020805460ff1916821515179055806142f657601380546000198101909155614302565b60138054600181019091555b50604080516001600160a01b0384168152821515602082015281517f68e0e16e4195f1bb5436073ae329e02686b513fd39cd623585b36d74785b21c1929181900390910190a15050565b601254600090640100000000900460ff166143695750338061436d565b5032805b506001600160a01b0381811660008181526005602090815260409182902080546001600160a01b0319169487169485179055815192835282019290925281517fbeebfeebc9d1af8057ca45af36b2171fea34cb5b251e394f0bc5fcabde119d7f929181900390910190a15050565b600b546001600160a01b03163314614428576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561449d576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415614512576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b600b5460408051634626402b60e01b81529051611409926001600160a01b031691634626402b916004808301926020929190829003018186803b15801561455857600080fd5b505afa15801561456c573d6000803e3d6000fd5b505050506040513d602081101561458257600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156145ca57600080fd5b505afa1580156145de573d6000803e3d6000fd5b505050506040513d60208110156145f457600080fd5b50516001600160a01b03841691906151d7565b600b546001600160a01b03163314614654576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156101000261ff0019909216919091179055565b600b546001600160a01b031633146146bb576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b0316614725576040805162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b604482015290519081900360640190fd5b33600090815260026020526040902054811061477b576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061479657fe5b90600052602060002090600502019050600083116147f1576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115614835576040805162461bcd60e51b815260206004820152601f6024820152600080516020615696833981519152604482015290519081900360640190fd5b6000614849600a546110af866110a96124ca565b825490915061485890856150a8565b8255600a5461486790856150a8565b600a5581541561489657614886600a546110af61283f84611f916124ca565b60028301554260038301556148a0565b6148a03384615105565b3360009081526003602052604090205480156148c1576148c1338287614f19565b600e54604080518481526000602082015280820188905290516001600160a01b03909216917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360600190a2600e5461494a906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d7565b600e546040805163364c781560e01b81526004810185905233602482015290516001600160a01b039092169163364c78159160448082019260009290919082900301818387803b158015613d4857600080fd5b600b546001600160a01b031633146149ea576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805460ff1916911515919091179055565b6001600160a01b0381166000908152600260205260408120805482805b82811015614a4c57838181548110614a2e57fe5b60009182526020909120600590910201549190910190600101614a1a565b50949350505050565b600b546001600160a01b03163314614aa2576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60015460095460408051632989754760e11b81526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b158015614af257600080fd5b505af1158015614b06573d6000803e3d6000fd5b5050600b54604080516370a0823160e01b81523060048201529051614bdb94506001600160a01b0392831693507f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015614b7e57600080fd5b505afa158015614b92573d6000803e3d6000fd5b505050506040513d6020811015614ba857600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d7565b565b6001600160a01b0382166000908152600260205260408120805483908110614c0157fe5b906000526020600020906005020160000154905092915050565b600e546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60046020526000908152604090205481565b6001600160a01b031660009081526002602052604090205490565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015614cd557600080fd5b505afa158015614ce9573d6000803e3d6000fd5b505050506040513d6020811015614cff57600080fd5b5051601154909150600090614d1d90612710906110af908590614fe8565b9250505090565b60036020526000908152604090205481565b600b546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580614dfe575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614dd057600080fd5b505afa158015614de4573d6000803e3d6000fd5b505050506040513d6020811015614dfa57600080fd5b5051155b614e395760405162461bcd60e51b81526004018080602001828103825260368152602001806157226036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d9d90849061538c565b6060614e9a848460008561543d565b90505b9392505050565b600082815260046020526040902054614ebd9082614f8e565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927fdb8549181d0331885cbb0e0d1e36bdd89e38e53990069f6f07a4090a15f74e5d92908290030190a2505050565b600082815260046020526040902054614f3290826150a8565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927f65b0f2fb4228364e2ac61c432687ae942c732095fc217265116bec6cc441683492908290030190a2505050565b600082820183811015614e9d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ff75750600061175f565b8282028284828161500457fe5b0414614e9d5760405162461bcd60e51b81526004018080602001828103825260218152602001806156d76021913960400191505060405180910390fd5b6000808211615097576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816150a057fe5b049392505050565b6000828211156150ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526002602052604090208054600019018281146151945781818154811061513657fe5b906000526020600020906005020182848154811061515057fe5b906000526020600020906005020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b8180548061519e57fe5b60008281526020812060056000199093019283020181815560018101829055600281018290556003810182905560040155905550505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d9d90849061538c565b6001600160a01b03821660009081526008602090815260408083203384529091528120805490919061525c9060016150a8565b90508083146152b45781818154811061527157fe5b906000526020600020906003020182848154811061528b57fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b818054806152be57fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080516001600160a01b03871681523392810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b0316630c3023b960e01b1790526112a19085905b60606153e1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614e8b9092919063ffffffff16565b805190915015610d9d5780806020019051602081101561540057600080fd5b5051610d9d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156f8602a913960400191505060405180910390fd5b60608247101561547e5760405162461bcd60e51b81526004018080602001828103825260268152602001806156706026913960400191505060405180910390fd5b61548785615599565b6154d8576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106155175780518252601f1990920191602091820191016154f8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615579576040519150601f19603f3d011682016040523d82523d6000602084013e61557e565b606091505b509150915061558e82828661559f565b979650505050505050565b3b151590565b606083156155ae575081614e9d565b8251156155be5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156156085781810151838201526020016155f0565b50505050905090810190601f1680156156355780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe676f7665726e6f72207265736572766573206172652063757272656e746c7920696e73756666696369656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c576974686472617720616d6f756e7420657863656564732062616c616e6365006f6e6c7920747275737465642073656e64657273286f7468657220706f6f6c7329536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63657468697264207061727479207374616b65207472616e73666572732064697361626c6564a2646970667358221220fb4948bfc61fb0dcbb4bd4bf79175bc78c48a82d48b21a2ad2bd86a3937e4d1f64736f6c634300060c0033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee0000000000000000000000000fcaf4045f05e32f321a339dcca0a90643bc7bf90000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000005
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee0000000000000000000000000fcaf4045f05e32f321a339dcca0a90643bc7bf90000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000005
-----Decoded View---------------
Arg [0] : _token (address): 0x970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : _dummyToken (address): 0x0fcaf4045f05e32f321a339dcca0a90643bc7bf9
Arg [2] : _masterchef (address): 0x6ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : _admin (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : _treasury (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : _poolID (uint256): 5
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : 0000000000000000000000000fcaf4045f05e32f321a339dcca0a90643bc7bf9
Arg [2] : 0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Deployed ByteCode Sourcemap
28128:39564:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49781:1063;;;;;;;;;;;;;;;;-1:-1:-1;49781:1063:0;;:::i;:::-;;42773:2137;;;;;;;;;;;;;;;;-1:-1:-1;42773:2137:0;;;;;;;;;;;-1:-1:-1;;;;;42773:2137:0;;:::i;65115:89::-;;;;;;;;;;;;;;;;-1:-1:-1;65115:89:0;;;;:::i;58666:266::-;;;;;;;;;;;;;;;;-1:-1:-1;58666:266:0;-1:-1:-1;;;;;58666:266:0;;:::i;64877:232::-;;;;;;;;;;;;;;;;-1:-1:-1;64877:232:0;;:::i;30373:43::-;;;:::i;:::-;;;;;;;;;;;;;;;;29704;;;;;;;;;;;;;;;;-1:-1:-1;29704:43:0;-1:-1:-1;;;;;29704:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;30620:37;;;:::i;65386:150::-;;;;;;;;;;;;;;;;-1:-1:-1;65386:150:0;;;;;;;;;:::i;29241:46::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29241:46:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39738:157;;;:::i;31320:31::-;;;:::i;61378:94::-;;;;;;;;;;;;;;;;-1:-1:-1;61378:94:0;;:::i;39524:145::-;;;:::i;30420:40::-;;;:::i;53451:156::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53451:156:0;;;;;;;;;;:::i;31283:33::-;;;:::i;30121:26::-;;;:::i;54315:1664::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54315:1664:0;;;;;;;;;;;;;;;;;;;;:::i;29564:45::-;;;;;;;;;;;;;;;;-1:-1:-1;29564:45:0;-1:-1:-1;;;;;29564:45:0;;:::i;40043:2318::-;;;;;;;;;;;;;;;;-1:-1:-1;40043:2318:0;;;;;;;:::i;38645:90::-;;;:::i;52980:462::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52980:462:0;;;;;;;;:::i;62980:114::-;;;;;;;;;;;;;;;;-1:-1:-1;62980:114:0;;;;:::i;65545:122::-;;;;;;;;;;;;;;;;-1:-1:-1;65545:122:0;-1:-1:-1;;;;;65545:122:0;;:::i;30211:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30211:23:0;;;;;;;;;;;;;;45225:1243;;;;;;;;;;;;;;;;-1:-1:-1;45225:1243:0;;;-1:-1:-1;;;;;45225:1243:0;;;;;;;;;;;;;;;:::i;30979:30::-;;;:::i;29038:34::-;;;:::i;60850:206::-;;;:::i;60288:154::-;;;:::i;64515:270::-;;;;;;;;;;;;;;;;-1:-1:-1;64515:270:0;;:::i;52343:579::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52343:579:0;;;;;;;;:::i;63777:389::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63777:389:0;;;;;;;;:::i;35374:984::-;;;;;;;;;;;;;;;;-1:-1:-1;35374:984:0;;;-1:-1:-1;;;;;35374:984:0;;;;;;;;;;:::i;30092:21::-;;;:::i;62161:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62161:269:0;;;;;;;;;;:::i;30548:26::-;;;:::i;30272:28::-;;;:::i;38382:124::-;;;;;;;;;;;;;;;;-1:-1:-1;38382:124:0;;:::i;62859:118::-;;;;;;;;;;;;;;;;-1:-1:-1;62859:118:0;;;;:::i;29186:46::-;;;:::i;64283:132::-;;;:::i;30719:42::-;;;:::i;47884:1638::-;;;;;;;;;;;;;;;;-1:-1:-1;47884:1638:0;;;;;;;;;;;-1:-1:-1;;;;;47884:1638:0;;:::i;28940:85::-;;;:::i;29459:47::-;;;;;;;;;;;;;;;;-1:-1:-1;29459:47:0;-1:-1:-1;;;;;29459:47:0;;:::i;36790:1581::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36790:1581:0;;;;;;;;;;;;;;;;;;:::i;34136:887::-;;;;;;;;;;;;;;;;-1:-1:-1;34136:887:0;;:::i;46690:1098::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46690:1098:0;;;;;;;;:::i;30818:37::-;;;:::i;50914:952::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50914:952:0;-1:-1:-1;50914:952:0;;:::i;60020:195::-;;;:::i;57737:814::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57737:814:0;;;;;;;;:::i;53616:325::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53616:325:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30893:35;;;:::i;61647:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61647:289:0;;;;;;;;;;:::i;51934:235::-;;;;;;;;;;;;;;;;-1:-1:-1;51934:235:0;-1:-1:-1;;;;;51934:235:0;;:::i;65903:329::-;;;;;;;;;;;;;;;;-1:-1:-1;65903:329:0;-1:-1:-1;;;;;65903:329:0;;:::i;61154:117::-;;;;;;;;;;;;;;;;-1:-1:-1;61154:117:0;;;;:::i;62670:100::-;;;;;;;;;;;;;;;;-1:-1:-1;62670:100:0;-1:-1:-1;;;;;62670:100:0;;:::i;56167:1352::-;;;;;;;;;;;;;;;;-1:-1:-1;56167:1352:0;;;;;;;:::i;63100:109::-;;;;;;;;;;;;;;;;-1:-1:-1;63100:109:0;;;;:::i;59195:334::-;;;;;;;;;;;;;;;;-1:-1:-1;59195:334:0;-1:-1:-1;;;;;59195:334:0;;:::i;63382:184::-;;;:::i;60544:148::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60544:148:0;;;;;;;;:::i;30332:34::-;;;:::i;29126:53::-;;;:::i;29376:50::-;;;;;;;;;;;;;;;;-1:-1:-1;29376:50:0;;:::i;59009:118::-;;;;;;;;;;;;;;;;-1:-1:-1;59009:118:0;-1:-1:-1;;;;;59009:118:0;;:::i;59679:264::-;;;:::i;29294:43::-;;;;;;;;;;;;;;;;-1:-1:-1;29294:43:0;-1:-1:-1;;;;;29294:43:0;;:::i;30154:20::-;;;:::i;29082:29::-;;;:::i;28890:::-;;;:::i;49781:1063::-;49866:11;;49846:15;;49866:11;;;;;:56;;-1:-1:-1;49912:10:0;;49866:56;;;-1:-1:-1;49890:9:0;;49866:56;-1:-1:-1;;;;;;49953:17:0;;49933;49953;;;:8;:17;;;;;;50035:23;;;50032:805;;50120:23;50146:27;50165:7;50146:18;:27::i;:::-;50120:53;-1:-1:-1;50182:19:0;;50179:617;;50277:15;;50274:516;;50332:14;50329:313;;50385:58;50406:7;50415:10;50427:15;50385:20;:58::i;:::-;50329:313;;;50509:57;50530:7;50539:9;50550:15;50509:20;:57::i;:::-;50575:58;50596:7;50605:10;50617:15;50575:20;:58::i;:::-;50274:516;;;50725:57;50746:7;50755:9;50766:15;50725:20;:57::i;:::-;-1:-1:-1;;;;;;50801:17:0;;;;;;:8;:17;;;;;:30;;;50032:805;49781:1063;;;:::o;42773:2137::-;42897:1;42887:7;:11;42879:43;;;;;-1:-1:-1;;;42879:43:0;;;;;;;;;;;;-1:-1:-1;;;42879:43:0;;;;;;;;;;;;;;;42955:10;42946:20;;;;:8;:20;;;;;:27;42935:38;;42927:65;;;;;-1:-1:-1;;;42927:65:0;;;;;;;;;;;;-1:-1:-1;;;42927:65:0;;;;;;;;;;;;;;;43040:10;43007:21;43031:20;;;:8;:20;;;;;:30;;43052:8;;43031:30;;;;;;;;;;;;;;;;43007:54;;43085:4;:11;;;43074:7;:22;;43066:66;;;;;-1:-1:-1;;;43066:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43066:66:0;;;;;;;;;;;;;;;43147:18;;;;;;;43143:88;;43188:11;;43177:22;;43169:59;;;;;-1:-1:-1;;;43169:59:0;;;;;;;;;;;;-1:-1:-1;;;43169:59:0;;;;;;;;;;;;;;;43275:22;;;;-1:-1:-1;;;;;43311:25:0;;43246:26;43311:25;;;:11;:25;;;;;;;;43308:734;;;43366:58;43412:11;43366:41;:18;43389:17;43366:22;:41::i;:::-;:45;;:58::i;:::-;43348:15;:76;43345:169;;;-1:-1:-1;43454:15:0;43345:169;43308:734;;;-1:-1:-1;;;;;43756:27:0;;;;;;:13;:27;;;;;;;;:90;;;;-1:-1:-1;43805:41:0;:18;43828:17;43805:22;:41::i;:::-;43787:15;:59;43756:90;:203;;;;-1:-1:-1;43901:58:0;43947:11;43901:41;:18;43924:17;43901:22;:41::i;:58::-;43883:15;:76;43756:203;43748:288;;;;;-1:-1:-1;;;43748:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44054:21;44078:43;44109:11;;44079:24;44095:7;44079:11;:9;:11::i;:::-;:15;;:24::i;:::-;44078:30;;:43::i;:::-;44146:11;;44054:67;;-1:-1:-1;44146:24:0;;44162:7;44146:15;:24::i;:::-;44132:38;;44195:11;;:24;;44211:7;44195:15;:24::i;:::-;44181:11;:38;44257:10;44228:17;44248:20;;;:8;:20;;;;;;44282:14;;44279:98;;44313:52;44334:10;44346:9;44357:7;44313:20;:52::i;:::-;44465:25;;;;;44385:106;;;-1:-1:-1;;;44385:106:0;;;;;;;;44433:10;44385:106;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44385:32:0;;;;;:106;;;;;-1:-1:-1;;44385:106:0;;;;;;;-1:-1:-1;44385:32:0;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44561:11:0;;:15;;-1:-1:-1;44557:263:0;;-1:-1:-1;44557:263:0;44621:45;44654:11;;44621:28;44637:11;:9;:11::i;:::-;44621;;;:15;:28::i;:45::-;44593:25;;;:73;44707:15;44681:23;;;:41;44557:263;;;44755:34;44768:10;44780:8;44755:12;:34::i;:::-;44845:57;;;;;;;;;;;;;;-1:-1:-1;;;;;44845:57:0;;;44853:10;;44845:57;;;;;;;;;;;42773:2137;;;;;;;:::o;65115:89::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65177:11:::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;65177:22:0;;::::1;::::0;;;::::1;::::0;;65115:89::o;58666:266::-;-1:-1:-1;;;;;58755:17:0;;58729:23;58755:17;;;:8;:17;;;;;58804:11;;58755:17;;58836:89;58857:10;58853:1;:14;58836:89;;;58889:24;58902:7;58911:1;58889:12;:24::i;:::-;58869:3;;58836:89;;;;58666:266;;;:::o;64877:232::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64951:12;64948:154:::1;;64996:5;::::0;65003:35:::1;::::0;;-1:-1:-1;;;65003:35:0;;65032:4:::1;65003:35;::::0;::::1;::::0;;;64972:67:::1;::::0;-1:-1:-1;;;;;64996:5:0;;::::1;::::0;65003:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;65003:35:0;-1:-1:-1;;;;;64972:10:0::1;:23;::::0;:67;:23:::1;:67::i;:::-;64948:154;;;65081:5;::::0;65057:39:::1;::::0;-1:-1:-1;;;;;65057:10:0::1;:23:::0;::::1;::::0;65081:5:::1;65088:7:::0;65057:23:::1;:39::i;:::-;64877:232:::0;:::o;30373:43::-;;;;:::o;29704:::-;;;;;;;;;;;;;;;:::o;30620:37::-;;;;;;:::o;65386:150::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65473:11:::1;:21:::0;;;;65499::::1;:32:::0;;-1:-1:-1;;65499:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65386:150::o;29241:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29241:46:0;;-1:-1:-1;29241:46:0;;;:::o;39738:157::-;39789:21;;;;39781:59;;;;;-1:-1:-1;;;39781:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39871:5;;;;;;;;;-1:-1:-1;;;;;39871:5:0;-1:-1:-1;;;;;39859:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39859:31:0;39845:11;:45;39738:157::o;31320:31::-;;;;:::o;61378:94::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;61446:7:::1;:18:::0;61378:94::o;39524:145::-;39584:10;;;;;;;;;-1:-1:-1;;;;;39584:10:0;-1:-1:-1;;;;;39572:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39572:31:0;39564:5;:39;;-1:-1:-1;;;;;;39564:39:0;-1:-1:-1;;;;;39564:39:0;;;;;;-1:-1:-1;39637:10:0;39625:36;;;-1:-1:-1;;;39625:36:0;;;;39637:10;;;;;39625:34;;:36;;;;;39572:31;;39625:36;;;;;;;39637:10;39625:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39625:36:0;39614:8;:47;;-1:-1:-1;;;;;;39614:47:0;-1:-1:-1;;;;;39614:47:0;;;;;;;;;39524:145::o;30420:40::-;;;;;;:::o;53451:156::-;-1:-1:-1;;;;;53560:23:0;;;53533:7;53560:23;;;:16;:23;;;;;;;;:32;;;;;;;;;:39;53451:156;;;;;:::o;31283:33::-;;;;:::o;30121:26::-;;;;:::o;54315:1664::-;54452:22;;54427:4;;54452:22;;;;;54444:71;;;;-1:-1:-1;;;54444:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54541:3;-1:-1:-1;;;;;54532:12:0;:5;-1:-1:-1;;;;;54532:12:0;;;54524:47;;;;;-1:-1:-1;;;54524:47:0;;;;;;;;;;;;-1:-1:-1;;;54524:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54601:15:0;;;;;;:8;:15;;;;;:22;54590:33;;54582:60;;;;;-1:-1:-1;;;54582:60:0;;;;;;;;;;;;-1:-1:-1;;;54582:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54677:15:0;;54653:21;54677:15;;;:8;:15;;;;;:25;;54693:8;;54677:25;;;;;;;;;;;;;;;;54653:49;;54712:15;54729:20;54751:22;54777:47;54793:5;54800:10;54812:11;54777:15;:47::i;:::-;54711:113;;;;;;55059:4;:11;;;55048:7;:22;55040:63;;;;;-1:-1:-1;;;55040:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55132:4;:22;;;55116:12;:38;55108:79;;;;;-1:-1:-1;;;55108:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55218:4;:25;;;55200:14;:43;55192:84;;;;;-1:-1:-1;;;55192:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55308:15:0;;55288:17;55308:15;;;:8;:15;;;;;;55337:14;;55334:93;;55368:47;55389:5;55396:9;55407:7;55368:20;:47::i;:::-;-1:-1:-1;;;;;;55443:13:0;;;;;;:8;:13;;;;;;55470:14;;55467:91;;55501:45;55522:3;55527:9;55538:7;55501:20;:45::i;:::-;55570:29;55583:5;55590:8;55570:12;:29::i;:::-;55645:41;55667:5;55674:11;55645:21;:41::i;:::-;55701:8;:13;55710:3;-1:-1:-1;;;;;55701:13:0;-1:-1:-1;;;;;55701:13:0;;;;;;;;;;;;55738:128;;;;;;;;55747:7;55738:128;;;;55756:12;55738:128;;;;55770:41;55799:11;;55770:24;55782:11;:9;:11::i;:::-;55770:7;;:11;:24::i;:41::-;55738:128;;;;55834:15;55738:128;;;;55851:14;55738:128;;;55701:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55899:52;55917:5;55924:3;55929:8;55939:11;55899:52;;;;-1:-1:-1;;;;;55899:52:0;;;;;;-1:-1:-1;;;;;55899:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55967:4:0;;54315:1664;-1:-1:-1;;;;;;;;;54315:1664:0:o;29564:45::-;;;;;;;;;;;;;;;:::o;40043:2318::-;40142:10;40133:20;;;;:8;:20;;;;;:27;40122:38;;40114:67;;;;;-1:-1:-1;;;40114:67:0;;;;;;;;;;;;-1:-1:-1;;;40114:67:0;;;;;;;;;;;;;;;40225:10;40192:21;40216:20;;;:8;:20;;;;;:30;;40237:8;;40216:30;;;;;;;;;;;;;;;;40192:54;;40275:1;40265:7;:11;40257:43;;;;;-1:-1:-1;;;40257:43:0;;;;;;;;;;;;-1:-1:-1;;;40257:43:0;;;;;;;;;;;;;;;40330:11;;40319:22;;;40311:66;;;;;-1:-1:-1;;;40311:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40311:66:0;;;;;;;;;;;;;;;40441:25;;;;40414:22;;;;:53;;:26;:53::i;:::-;40396:15;:71;40388:109;;;;;-1:-1:-1;;;40388:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40512:18;;;;;;;40508:88;;40553:11;;40542:22;;40534:59;;;;;-1:-1:-1;;;40534:59:0;;;;;;;;;;;;-1:-1:-1;;;40534:59:0;;;;;;;;;;;;;;;40608:21;40632:43;40663:11;;40633:24;40649:7;40633:11;:9;:11::i;40632:43::-;40700:11;;40608:67;;-1:-1:-1;40700:24:0;;40716:7;40700:15;:24::i;:::-;40686:38;;40749:11;;:24;;40765:7;40749:15;:24::i;:::-;40735:11;:38;40859:22;;;;40786:26;;40859:45;;40886:17;40859:26;:45::i;:::-;40841:15;:63;40837:924;;;40920:19;40942:93;40960:74;41030:3;40960:65;41020:4;40961:53;41008:5;40980:4;:22;;;40962:15;:40;40961:46;;:53;;;;:::i;40960:74::-;40950:4;;40942:17;:93::i;:::-;40920:115;-1:-1:-1;41071:41:0;41106:5;41071:30;:13;40920:115;41071:17;:30::i;:41::-;41146:8;;41050:62;;-1:-1:-1;41127:48:0;;-1:-1:-1;;;;;41127:5:0;:18;;;41146:8;41050:62;41127:18;:48::i;:::-;41207:37;:13;41225:18;41207:17;:37::i;:::-;41191:53;;40837:924;;;;41283:62;41333:11;41283:45;41310:17;41283:4;:22;;;:26;;:45;;;;:::i;:62::-;41265:15;:80;41262:499;;;41362:19;41384:96;41476:3;41384:87;41466:4;41384:77;41455:5;41384:66;41404:45;41431:17;41404:4;:22;;;:26;;:45;;;;:::i;:::-;41384:15;;:19;:66::i;:96::-;41362:118;;41512:4;41498:11;:18;41495:46;;;-1:-1:-1;41534:4:0;41495:46;41576:41;41611:5;41576:30;:13;41594:11;41576:17;:30::i;:41::-;41651:8;;41555:62;;-1:-1:-1;41632:48:0;;-1:-1:-1;;;;;41632:5:0;:18;;;41651:8;41555:62;41632:18;:48::i;:::-;41712:37;:13;41730:18;41712:17;:37::i;:::-;41696:53;;41262:499;;41777:11;;:15;41773:282;;41837:64;41889:11;;41837:47;41853:30;41869:13;41853:11;:9;:11::i;:::-;:15;;:30::i;:::-;41837:11;;;:15;:47::i;:64::-;41809:25;;;:92;41942:15;41916:23;;;:41;41773:282;;;41990:34;42003:10;42015:8;41990:12;:34::i;:::-;42098:10;42069:17;42089:20;;;:8;:20;;;;;;42123:14;;42120:98;;42154:52;42175:10;42187:9;42198:7;42154:20;:52::i;:::-;42229:64;;;;;;;;;;;;;;;;;;;;42238:10;;42229:64;;;;;;;;;;42308:45;-1:-1:-1;;;;;42308:5:0;:18;42327:10;42339:13;42308:18;:45::i;:::-;40043:2318;;;;;;:::o;38645:90::-;38696:10;;38717:6;;38684:43;;;-1:-1:-1;;;38684:43:0;;;;;;;;;38696:10;38684:43;;;;;;;;-1:-1:-1;;;;;38696:10:0;;;;38684:32;;:43;;;;;38696:10;38684:43;;;;;;38696:10;;38684:43;;;;;;;;;;;;;;;;;;;;;;;;;;52980:462;53116:10;53062:34;53099:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;53099:37:0;;;;;;;;;53173:17;;53099:37;;53062:34;53173:24;;53195:1;53173:21;:24::i;:::-;53147:50;;53236:15;53221:11;:30;53218:115;;53294:10;53305:15;53294:27;;;;;;;;;;;;;;;;;;53268:10;53279:11;53268:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;53218:115;53353:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;53353:16:0;;;;;;;;;;;;;;;;;;;;;;;;53383:54;;;53404:10;53383:54;;-1:-1:-1;;;;;53383:54:0;;;;;;;;;;;;;;;;;;;;;;;;;52980:462;;;;:::o;62980:114::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63058:16:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63058:28:0;;::::1;::::0;;;::::1;::::0;;62980:114::o;65545:122::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65626:19:::1;:33:::0;;-1:-1:-1;;;;;;65626:33:0::1;-1:-1:-1::0;;;;;65626:33:0;;;::::1;::::0;;;::::1;::::0;;65545:122::o;30211:23::-;;;-1:-1:-1;;;;;30211:23:0;;:::o;45225:1243::-;45390:10;45376:25;;;;:13;:25;;;;;;;;;:52;;-1:-1:-1;45417:10:0;45405:23;;;;:11;:23;;;;;;;;45376:52;45368:98;;;;-1:-1:-1;;;45368:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45608:12;45623:11;:9;:11::i;:::-;45608:26;-1:-1:-1;45645:58:0;-1:-1:-1;;;;;45645:5:0;:22;45668:10;45688:4;45695:7;45645:22;:58::i;:::-;45714:21;45754:11;;45769:1;45754:16;45750:157;;45803:36;45834:4;45804:24;45816:11;;45804:7;:11;;:24;;;;:::i;45803:36::-;45787:52;;45750:157;;;-1:-1:-1;45888:7:0;45750:157;45941:11;;:30;;45957:13;45941:15;:30::i;:::-;45927:11;:44;-1:-1:-1;;;;;45992:27:0;;;;;;:8;:27;;;;;;;;46043:113;;;;;;;;;;;;;;;;;;;;;;46124:15;46043:113;;;;;;;;;;;;45992:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46198:27;;;;;;46239:14;;46236:111;;46270:65;46291:17;46310:9;46321:13;46270:20;:65::i;:::-;46364:96;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46364:96:0;;;;;;;;;;;;;45225:1243;;;;;;;:::o;30979:30::-;;;;;;;;;:::o;29038:34::-;;;:::o;60850:206::-;60941:10;;60964:6;;60929:57;;;-1:-1:-1;;;60929:57:0;;;;;;;;;60980:4;60929:57;;;;;60892:7;;;;-1:-1:-1;;;;;60941:10:0;;;;60929:34;;:57;;;;;;;;;;;;;;;60941:10;60929:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60929:57:0;61005:30;;;-1:-1:-1;;;61005:30:0;;61029:4;61005:30;;;;;;60929:57;;-1:-1:-1;61005:42:0;;60929:57;;-1:-1:-1;;;;;61005:5:0;:15;;;;:30;;;;;60929:57;;61005:30;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61005:30:0;;:34;:42::i;:::-;60998:49;;;60850:206;:::o;60288:154::-;60343:7;60370:11;;60385:1;60370:16;:64;;60396:38;60422:11;;60396:21;60412:4;60396:11;:9;:11::i;:38::-;60370:64;;;60389:4;60370:64;60363:71;;60288:154;:::o;64515:270::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64588:20;64585:196:::1;;64629:10;::::0;64650:6:::1;::::0;64658:41:::1;::::0;;-1:-1:-1;;;64658:41:0;;-1:-1:-1;;;;;64629:10:0;;::::1;64658:41;::::0;::::1;::::0;;;;;64629:10;;64617:32:::1;::::0;64650:6;64658:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:20;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64658:41:0;64617:83:::1;::::0;;-1:-1:-1;;;;;;64617:83:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64617:83:0;;;;;;;-1:-1:-1;64617:83:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64585:196;;;64730:10;::::0;64751:6:::1;::::0;64718:57:::1;::::0;;-1:-1:-1;;;64718:57:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;64730:10:0;;::::1;::::0;64718:32:::1;::::0;:57;;;;;64730:10:::1;::::0;64718:57;;;;;;;;64730:10;;64718:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64515:270:::0;:::o;52343:579::-;52453:10;52420:21;52444:20;;;:8;:20;;;;;:30;;52465:8;;52444:30;;;;;;;;;;;;;;;;52420:54;;52536:11;;52487:45;52520:11;;52487:28;52503:11;:9;:11::i;:::-;52487;;;:15;:28::i;:45::-;:60;;52479:96;;;;;-1:-1:-1;;;52479:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52624:10;52584:20;52607:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;52607:37:0;;;;;;;;;;;:44;;52658:37;;;52706:77;;;;;;;;52720:11;;52706:77;;52733:22;;;;;;52706:77;;;;;;52757:25;;;;;52706:77;;;;;;52658:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52851:11;;52864:22;;52888:25;;52802:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52607:44;;52802:112;;;;;;;;;;52343:579;;;;:::o;63777:389::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63876:10:::1;:24:::0;;-1:-1:-1;;;;;;63876:24:0::1;-1:-1:-1::0;;;;;63876:24:0;;::::1;::::0;;;::::1;::::0;;;;63905:6:::1;:19:::0;;;63985:64:::1;::::0;;-1:-1:-1;;;63985:64:0;;64022:4:::1;63985:64;::::0;::::1;::::0;64037:10;;::::1;63985:64:::0;;;;;-1:-1:-1;;63992:10:0::1;63985:28:::0;;::::1;::::0;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;:28;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63985:64:0;;-1:-1:-1;64057:20:0;64054:108:::1;;64085:71;-1:-1:-1::0;;;;;64092:10:0::1;64085:30;64124:11:::0;-1:-1:-1;;64085:30:0::1;:71::i;35374:984::-:0;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;35511:11:::1;::::0;35500:22;::::1;;35492:53;;;::::0;;-1:-1:-1;;;35492:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35492:53:0;;;;;;;;;;;;;::::1;;35558:12;35573:11;:9;:11::i;:::-;35558:26:::0;-1:-1:-1;35595:58:0::1;-1:-1:-1::0;;;;;35595:5:0::1;:22;35618:10;35638:4;35645:7:::0;35595:22:::1;:58::i;:::-;35664:21;35704:11;;35719:1;35704:16;35700:157;;35753:36;35784:4;35754:24;35766:11;;35754:7;:11;;:24;;;;:::i;35753:36::-;35737:52;;35700:157;;;-1:-1:-1::0;35838:7:0;35700:157:::1;35891:11;::::0;:30:::1;::::0;35907:13;35891:15:::1;:30::i;:::-;35877:11;:44:::0;-1:-1:-1;;;;;35942:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;;;35986:85;;::::1;::::0;::::1;::::0;;;;;36010:15:::1;35986:85:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;35942:144;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;36122:20;;;;;;36156:14;;36153:104:::1;;36187:58;36208:10;36220:9;36231:13;36187:20;:58::i;:::-;36274:76;::::0;;;;;::::1;::::0;::::1;::::0;;;36334:15:::1;36274:76:::0;;;;;;-1:-1:-1;;;;;36274:76:0;::::1;::::0;36286:10:::1;::::0;36274:76:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;35374:984:0:o;30092:21::-;;;;:::o;62161:269::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62248:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;:30;;::::0;::::1;;;62245:178;;-1:-1:-1::0;;;;;62286:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;:29;;-1:-1:-1;;62286:29:0::1;::::0;::::1;;;::::0;;;62326:50:::1;;62358:16;:18:::0;;-1:-1:-1;;62358:18:0;;;;;62326:50:::1;;;62337:16;:18:::0;;::::1;::::0;::::1;::::0;;;62326:50:::1;-1:-1:-1::0;62389:28:0::1;::::0;;-1:-1:-1;;;;;62389:28:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;62245:178;62161:269:::0;;:::o;30548:26::-;;;;:::o;30272:28::-;;;-1:-1:-1;;;;;30272:28:0;;:::o;38382:124::-;38459:10;38450:20;;;;:8;:20;;;;;:30;;38441:57;;38450:20;38471:8;;38450:30;;;;;;;;;;;;;;;;:37;;;38489:8;38441;:57::i;62859:118::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;62939:18:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62939:30:0;;::::1;::::0;;;::::1;::::0;;62859:118::o;29186:46::-;;;:::o;64283:132::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64343:10:::1;::::0;64363:6:::1;::::0;64371:35:::1;::::0;;-1:-1:-1;;;64371:35:0;;64400:4:::1;64371:35;::::0;::::1;::::0;;;-1:-1:-1;;;;;64343:10:0;;::::1;::::0;64331:31:::1;::::0;64363:6;64371:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64371:35:0;64331:76:::1;::::0;;-1:-1:-1;;;;;;64331:76:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64331:76:0;;;;;;;-1:-1:-1;64331:76:0;;::::1;;::::0;::::1;;;;::::0;::::1;30719:42:::0;;;;;;;;;:::o;47884:1638::-;48012:18;;;;48004:49;;;;;-1:-1:-1;;;48004:49:0;;;;;;;;;;;;-1:-1:-1;;;48004:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48066:31:0;;48087:10;48066:31;;48058:66;;;;;-1:-1:-1;;;48058:66:0;;;;;;;;;;;;-1:-1:-1;;;48058:66:0;;;;;;;;;;;;;;;48163:10;48154:20;;;;:8;:20;;;;;:27;48143:38;;48135:65;;;;;-1:-1:-1;;;48135:65:0;;;;;;;;;;;;-1:-1:-1;;;48135:65:0;;;;;;;;;;;;;;;48244:10;48211:21;48235:20;;;:8;:20;;;;;:30;;48256:8;;48235:30;;;;;;;;;;;;;;;;48211:54;;48270:26;48299:41;48328:11;;48299:24;48311:11;:9;:11::i;:::-;48299:7;;:11;:24::i;:41::-;48270:70;;48381:11;;48359:18;:33;;48351:69;;;;;-1:-1:-1;;;48351:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48450:11;;48439:22;;;48431:66;;;;;-1:-1:-1;;;48431:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48431:66:0;;;;;;;;;;;;;;;48512:16;;;;;;;48508:86;;48551:11;;48540:22;;48532:59;;;;;-1:-1:-1;;;48532:59:0;;;;;;;;;;;;-1:-1:-1;;;48532:59:0;;;;;;;;;;;;;;;48628:11;;:24;;48644:7;48628:15;:24::i;:::-;48614:38;;48688:10;48614:11;48679:20;;;:8;:20;;;;;;48713:14;;48710:98;;48744:52;48765:10;48777:9;48788:7;48744:20;:52::i;:::-;-1:-1:-1;;;;;;48824:27:0;;;;;;:8;:27;;;;;;48865:14;;48862:105;;48896:59;48917:17;48936:9;48947:7;48896:20;:59::i;:::-;-1:-1:-1;;;;;48987:27:0;;;;;;:8;:27;;;;;;;;49038:105;;;;;;;;;;49056:22;;;;;49038:105;;;;;;;;;;;;49100:15;49038:105;;;;;;49117:25;;;;;49038:105;;;;;;48987:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49175:11;;:15;49171:263;;49235:45;49268:11;;49235:28;49251:11;:9;:11::i;49235:45::-;49207:25;;;:73;49321:15;49295:23;;;:41;49171:263;;;49369:34;49382:10;49394:8;49369:12;:34::i;:::-;49451:63;;;;;;;;;;;;;;-1:-1:-1;;;;;49451:63:0;;;49465:10;;49451:63;;;;;;;;;;;47884:1638;;;;;;:::o;28940:85::-;;;:::o;29459:47::-;;;;;;;;;;;;-1:-1:-1;;;;;29459:47:0;;:::o;36790:1581::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;36949:11;36941:42:::1;;;::::0;;-1:-1:-1;;;36941:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36941:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37002:24:0;::::1;;::::0;;;:8:::1;:24;::::0;;;;:31;:42;-1:-1:-1;36994:69:0::1;;;::::0;;-1:-1:-1;;;36994:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36994:69:0;;;;;;;;;;;;;::::1;;37101:5;::::0;-1:-1:-1;;;;;37101:5:0::1;37087:10;:19;37084:100;;-1:-1:-1::0;;;;;37118:28:0;::::1;37136:10;37118:28;37110:71;;;::::0;;-1:-1:-1;;;37110:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37196:12;37211:11;:9;:11::i;:::-;37196:26:::0;-1:-1:-1;37233:58:0::1;-1:-1:-1::0;;;;;37233:5:0::1;:22;37256:10;37276:4;37283:7:::0;37233:22:::1;:58::i;:::-;37302:21;37342:11;;37357:1;37342:16;37338:157;;37391:36;37422:4;37392:24;37404:11;;37392:7;:11;;:24;;;;:::i;37391:36::-;37375:52;;37338:157;;;-1:-1:-1::0;37476:7:0;37338:157:::1;-1:-1:-1::0;;;;;37529:24:0;::::1;37505:21;37529:24:::0;;;:8:::1;:24;::::0;;;;:34;;37554:8;;37529:34;::::1;;;;;;;;;;;;;;;37505:58;;37590:30;37606:13;37590:4;:11;;;:15;;:30;;;;:::i;:::-;37576:44:::0;;37645:11:::1;::::0;:30:::1;::::0;37661:13;37645:15:::1;:30::i;:::-;37631:11;:44:::0;37724:25:::1;::::0;::::1;::::0;37699:50;::::1;::::0;:123:::1;;-1:-1:-1::0;37777:22:0::1;::::0;::::1;::::0;:45:::1;::::0;37804:17:::1;37777:26;:45::i;:::-;37759:15;:63;37699:123;37696:192;;;37831:25;::::0;::::1;:50:::0;;;37696:192:::1;37930:45;37963:11;;37930:28;37946:11;:9;:11::i;:::-;37930::::0;;;:15:::1;:28::i;:45::-;37902:25;::::0;::::1;:73:::0;38012:15:::1;37986:23;::::0;;::::1;:41:::0;;;38032:22:::1;::::0;::::1;:40:::0;;;;-1:-1:-1;;;;;38107:24:0;::::1;-1:-1:-1::0;38107:24:0;;;::::1;::::0;;;;;;;;38145:14;;38142:108:::1;;38176:62;38197:14;38213:9;38224:13;38176:20;:62::i;:::-;38267:96;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;38347:15:::1;38267:96:::0;;;;;;-1:-1:-1;;;;;38267:96:0;::::1;::::0;38285:10:::1;::::0;38267:96:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;;;36790:1581:0:o;34136:887::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;34208:11;34200:42:::1;;;::::0;;-1:-1:-1;;;34200:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34200:42:0;;;;;;;;;;;;;::::1;;34256:12;34271:11;:9;:11::i;:::-;34256:26:::0;-1:-1:-1;34293:58:0::1;-1:-1:-1::0;;;;;34293:5:0::1;:22;34316:10;34336:4;34343:7:::0;34293:22:::1;:58::i;:::-;34362:21;34402:11;;34417:1;34402:16;34398:157;;34451:36;34482:4;34452:24;34464:11;;34452:7;:11;;:24;;;;:::i;34451:36::-;34435:52;;34398:157;;;-1:-1:-1::0;34536:7:0;34398:157:::1;34589:11;::::0;:30:::1;::::0;34605:13;34589:15:::1;:30::i;:::-;34575:11;:44:::0;34649:10:::1;34640:20;::::0;;;:8:::1;:20;::::0;;;;;;;34684:69;;::::1;::::0;::::1;::::0;;;;;34708:15:::1;34684:69:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;34640:128;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;34803:20;;;;;;34837:14;;34834:104:::1;;34868:58;34889:10;34901:9;34912:13;34868:20;:58::i;:::-;34955:60;::::0;;;;;::::1;::::0;::::1;::::0;;;34999:15:::1;34955:60:::0;;;;;;34963:10:::1;::::0;34955:60:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;34136:887:0:o;46690:1098::-;46787:10;46778:20;;;;:8;:20;;;;;:27;:38;-1:-1:-1;46770:67:0;;;;;-1:-1:-1;;;46770:67:0;;;;;;;;;;;;-1:-1:-1;;;46770:67:0;;;;;;;;;;;;;;;46891:10;46858:21;46882:20;;;:8;:20;;;;;:30;;46903:8;;46882:30;;;;;;;;;;;;;;;;46858:54;;46959:45;46986:17;46959:4;:22;;;:26;;:45;;;;:::i;:::-;46941:15;:63;46933:96;;;;;-1:-1:-1;;;46933:96:0;;;;;;;;;;;;-1:-1:-1;;;46933:96:0;;;;;;;;;;;;;;;47050:21;47074:47;47109:11;;47075:28;47091:4;:11;;;47075;:9;:11::i;47074:47::-;47179:5;;47167:42;;;-1:-1:-1;;;47167:42:0;;-1:-1:-1;;;;;47167:42:0;;;;;;;;;47050:71;;-1:-1:-1;47133:13:0;;47149:72;;47215:5;;47149:61;;47179:5;;;47167:31;;:42;;;;;;;;;;;;;;;47179:5;47167:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47167:42:0;47149:13;;:17;:61::i;:72::-;47266:5;;47242:30;;;-1:-1:-1;;;47242:30:0;;-1:-1:-1;;;;;47266:5:0;;;47242:30;;;;;;47133:88;;-1:-1:-1;47133:88:0;;47249:5;47242:23;;;;;;:30;;;;;;;;;;;;;;;:23;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47242:30:0;:39;;47234:96;;;;-1:-1:-1;;;47234:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47354:26:0;;47375:4;47354:26;47351:430;;;47409:5;;47397:77;;;-1:-1:-1;;;47397:77:0;;47435:10;47397:77;;;;-1:-1:-1;;;;;47397:77:0;;;;;;;;;;;;;;;;;;;;;47409:5;;;;;47397:37;;:77;;;;;47409:5;;47397:77;;;;;;;47409:5;;47397:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47351:430;;;47559:11;;47537:55;;47572:8;47582:9;47537:21;:55::i;:::-;47641:5;;;;;;;;;-1:-1:-1;;;;;47641:5:0;-1:-1:-1;;;;;47629:37:0;;47667:10;47679:9;47690:5;47744:1;47705:9;-1:-1:-1;;;;;47697:32:0;;47730:10;47697:44;;;;;;;;;;;;;-1:-1:-1;;;;;47697:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47697:44:0;47629:117;;;-1:-1:-1;;;;;;47629:117:0;;;;;;;-1:-1:-1;;;;;47629:117:0;;;;;;;;;;;;;;;;;;;;;;47697:48;;47629:117;;;;;;;;;;;-1:-1:-1;;47629:117:0;;;;;;;-1:-1:-1;47629:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46690:1098;;;;;:::o;30818:37::-;;;;;;;;;:::o;50914:952::-;51015:9;51011:848;51030:24;;;51011:848;;;51105:10;51071:12;:30;51084:13;;51098:1;51084:16;;;;;;;-1:-1:-1;;;;;51084:16:0;;;;;;;;;;;51071:30;;;;;;;;;;;;-1:-1:-1;51071:30:0;;;:44;;;;51068:786;;-1:-1:-1;51068:786:0;;51124:17;51144:8;:26;51153:13;;51167:1;51153:16;;;;;;;;;;;;;-1:-1:-1;;;;;51153:16:0;-1:-1:-1;;;;;51144:26:0;-1:-1:-1;;;;;51144:26:0;;;;;;;;;;;;;51124:46;;51247:9;51233:10;:23;51230:618;;51271:23;51297:36;51316:13;;51330:1;51316:16;;;;;;;;;;;;;-1:-1:-1;;;;;51316:16:0;51297:18;:36::i;:::-;51271:62;-1:-1:-1;51344:19:0;;51341:453;;51377:15;;51374:412;;51408:14;51405:280;;51435:67;51456:13;;51470:1;51456:16;;;;;;;;;;;;;-1:-1:-1;;;;;51456:16:0;51474:10;51486:15;51435:20;:67::i;:::-;51405:280;;;51530:66;51551:13;;51565:1;51551:16;;;;;;;;;;;;;-1:-1:-1;;;;;51551:16:0;51569:9;51580:15;51530:20;:66::i;:::-;51607:67;51628:13;;51642:1;51628:16;;;;;;51607:67;51374:412;;;51710:66;51731:13;;51745:1;51731:16;;;;;;51710:66;51830:10;51801:8;:26;51810:13;;51824:1;51810:16;;;;;;;;;;;;;-1:-1:-1;;;;;51810:16:0;-1:-1:-1;;;;;51801:26:0;-1:-1:-1;;;;;51801:26:0;;;;;;;;;;;;:39;;;;51230:618;;51068:786;;51056:3;;51011:848;;60020:195;60136:10;;60159:6;;60124:57;;;-1:-1:-1;;;60124:57:0;;;;;;;;;60175:4;60124:57;;;;;60087:7;;;;-1:-1:-1;;;;;60136:10:0;;;;60124:34;;:57;;;;;;;;;;;;;;;60136:10;60124:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60124:57:0;;-1:-1:-1;;60020:195:0;:::o;57737:814::-;57820:13;;-1:-1:-1;;;;;57820:13:0;57812:63;;;;;-1:-1:-1;;;57812:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57905:17:0;;;;;;:8;:17;;;;;:24;57894:35;;57886:64;;;;;-1:-1:-1;;;57886:64:0;;;;;;;;;;;;-1:-1:-1;;;57886:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57985:17:0;;57961:21;57985:17;;;:8;:17;;;;;:27;;58003:8;;57985:27;;;;;;;;;;;;;;;;57961:51;;58039:1;58025:4;:11;;;:15;58017:38;;;;;-1:-1:-1;;;58017:38:0;;;;;;;;;;;;-1:-1:-1;;;58017:38:0;;;;;;;;;;;;;;;58076:21;58100:47;58135:11;;58101:28;58117:4;:11;;;58101;:9;:11::i;58100:47::-;58188:11;;58172;;58076:71;;-1:-1:-1;58172:28:0;;:11;:15;:28::i;:::-;58158:11;:42;58229:1;58215:15;;;58364:13;;;58414:22;;;58438:25;;;;;58356:108;;;-1:-1:-1;;;58356:108:0;;;;;;;;-1:-1:-1;;;;;58356:108:0;;;;;;;;;;;;;;;;;;;;;;58364:13;;;;;58356:33;;:108;;;;;;;;;;;58229:1;58364:13;58356:108;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58522:11:0;;58482:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;58482:61:0;;;-1:-1:-1;58495:10:0;;-1:-1:-1;58482:61:0;;;;;;;;;;57737:814;;;;:::o;53616:325::-;-1:-1:-1;;;;;53788:23:0;;;53715:7;53788:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;:45;;53715:7;;;;;;53788:32;53821:11;;53788:45;;;;;;;;;;;;;;;;;;;53852:17;;53871:28;;;;53901:31;;;;;53852:17;;53871:28;;-1:-1:-1;53901:31:0;-1:-1:-1;53616:325:0;-1:-1:-1;;;;;53616:325:0:o;30893:35::-;;;;;;;;;:::o;61647:289::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;61738:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;:34;;::::0;::::1;;;61735:194;;-1:-1:-1::0;;;;;61780:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;:33;;-1:-1:-1;;61780:33:0::1;::::0;::::1;;;::::0;;;61824:54:::1;;61858:18;:20:::0;;-1:-1:-1;;61858:20:0;;;;;61824:54:::1;;;61835:18;:20:::0;;::::1;::::0;::::1;::::0;;;61824:54:::1;-1:-1:-1::0;61891:32:0::1;::::0;;-1:-1:-1;;;;;61891:32:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;61647:289:::0;;:::o;51934:235::-;52014:11;;51994:15;;52014:11;;;;;:52;;-1:-1:-1;52056:10:0;;52014:52;;;-1:-1:-1;52036:9:0;;52014:52;-1:-1:-1;;;;;;52077:21:0;;;;;;;:12;:21;;;;;;;;;:33;;-1:-1:-1;;;;;;52077:33:0;;;;;;;;;52130:31;;;;;;;;;;;;;;;;;;;;;;;;51934:235;;:::o;65903:329::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;66012:5:::1;-1:-1:-1::0;;;;;65987:31:0::1;:13;-1:-1:-1::0;;;;;65987:31:0::1;;;65979:55;;;::::0;;-1:-1:-1;;;65979:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65979:55:0;;;;;;;;;;;;;::::1;;66072:10;-1:-1:-1::0;;;;;66047:36:0::1;:13;-1:-1:-1::0;;;;;66047:36:0::1;;;66039:60;;;::::0;;-1:-1:-1;;;66039:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66039:60:0;;;;;;;;;;;;;::::1;;66155:5;::::0;66143:35:::1;::::0;;-1:-1:-1;;;66143:35:0;;;;66108:119:::1;::::0;-1:-1:-1;;;;;66155:5:0::1;::::0;66143:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;66155:5;66143:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66143:35:0;66180:46:::1;::::0;;-1:-1:-1;;;66180:46:0;;66220:4:::1;66180:46;::::0;::::1;::::0;;;-1:-1:-1;;;;;66180:31:0;::::1;::::0;::::1;::::0;:46;;;;;66143:35:::1;::::0;66180:46;;;;;;;:31;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66180:46:0;-1:-1:-1;;;;;66108:34:0;::::1;::::0;:119;:34:::1;:119::i;61154:117::-:0;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;61233:22:::1;:33:::0;;;::::1;;;;-1:-1:-1::0;;61233:33:0;;::::1;::::0;;;::::1;::::0;;61154:117::o;62670:100::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;62738:13:::1;:24:::0;;-1:-1:-1;;;;;;62738:24:0::1;-1:-1:-1::0;;;;;62738:24:0;;;::::1;::::0;;;::::1;::::0;;62670:100::o;56167:1352::-;56250:19;;-1:-1:-1;;;;;56250:19:0;56242:54;;;;;-1:-1:-1;;;56242:54:0;;;;;;;;;;;;-1:-1:-1;;;56242:54:0;;;;;;;;;;;;;;;56335:10;56326:20;;;;:8;:20;;;;;:27;56315:38;;56307:67;;;;;-1:-1:-1;;;56307:67:0;;;;;;;;;;;;-1:-1:-1;;;56307:67:0;;;;;;;;;;;;;;;56418:10;56385:21;56409:20;;;:8;:20;;;;;:30;;56430:8;;56409:30;;;;;;;;;;;;;;;;56385:54;;56468:1;56458:7;:11;56450:43;;;;;-1:-1:-1;;;56450:43:0;;;;;;;;;;;;-1:-1:-1;;;56450:43:0;;;;;;;;;;;;;;;56523:11;;56512:22;;;56504:66;;;;;-1:-1:-1;;;56504:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56504:66:0;;;;;;;;;;;;;;;56583:21;56607:43;56638:11;;56608:24;56624:7;56608:11;:9;:11::i;56607:43::-;56675:11;;56583:67;;-1:-1:-1;56675:24:0;;56691:7;56675:15;:24::i;:::-;56661:38;;56724:11;;:24;;56740:7;56724:15;:24::i;:::-;56710:11;:38;56765:11;;:15;56761:282;;56825:64;56877:11;;56825:47;56841:30;56857:13;56841:11;:9;:11::i;56825:64::-;56797:25;;;:92;56930:15;56904:23;;;:41;56761:282;;;56978:34;56991:10;57003:8;56978:12;:34::i;:::-;57078:10;57049:17;57069:20;;;:8;:20;;;;;;57103:14;;57100:98;;57134:52;57155:10;57167:9;57178:7;57134:20;:52::i;:::-;57218:19;;57209:56;;;;;;57218:19;57209:56;;;;;;;;;;;;-1:-1:-1;;;;;57218:19:0;;;;57209:56;;;;;;;;;57297:19;;57278:54;;-1:-1:-1;;;;;57278:5:0;:18;;;57297:19;57318:13;57278:18;:54::i;:::-;57345:19;;57337:65;;;-1:-1:-1;;;57337:65:0;;;;;;;;57391:10;57337:65;;;;;;-1:-1:-1;;;;;57345:19:0;;;;57337:38;;:65;;;;;57345:19;;57337:65;;;;;;;;57345:19;;57337:65;;;;;;;;;;63100:109;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63175:18:::1;:29:::0;;-1:-1:-1;;63175:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63100:109::o;59195:334::-;-1:-1:-1;;;;;59307:15:0;;59259:7;59307:15;;;:8;:15;;;;;59358:13;;59259:7;;59410:85;59431:14;59427:1;:18;59410:85;;;59473:6;59480:1;59473:9;;;;;;;;;;;;;;;;;;;;;:16;59458:31;;;;;59447:3;;59410:85;;;-1:-1:-1;59510:11:0;59195:334;-1:-1:-1;;;;59195:334:0:o;63382:184::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63453:10:::1;::::0;63483:6:::1;::::0;63441:49:::1;::::0;;-1:-1:-1;;;63441:49:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;63453:10:0;;::::1;::::0;63441:41:::1;::::0;:49;;;;;63453:10:::1;::::0;63441:49;;;;;;;;63453:10;;63441:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63520:5:0::1;::::0;63527:30:::1;::::0;;-1:-1:-1;;;63527:30:0;;63551:4:::1;63527:30;::::0;::::1;::::0;;;63501:57:::1;::::0;-1:-1:-1;;;;;;63520:5:0;;::::1;::::0;-1:-1:-1;63527:5:0::1;:15:::0;;::::1;::::0;::::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:15;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63527:30:0;-1:-1:-1;;;;;63501:5:0::1;:18;::::0;:57;:18:::1;:57::i;:::-;63382:184::o:0;60544:148::-;-1:-1:-1;;;;;60650:17:0;;60623:7;60650:17;;;:8;:17;;;;;:27;;60668:8;;60650:27;;;;;;;;;;;;;;;;:34;;;60643:41;;60544:148;;;;:::o;30332:34::-;;;-1:-1:-1;;;;;30332:34:0;;:::o;29126:53::-;;;:::o;29376:50::-;;;;;;;;;;;;;:::o;59009:118::-;-1:-1:-1;;;;;59097:15:0;59070:7;59097:15;;;:8;:15;;;;;:22;;59009:118::o;59679:264::-;59790:10;;59813:6;;59778:57;;;-1:-1:-1;;;59778:57:0;;;;;;;;;59829:4;59778:57;;;;;59741:7;;;;-1:-1:-1;;;;;59790:10:0;;;;59778:34;;:57;;;;;;;;;;;;;;;59790:10;59778:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59778:57:0;59882:7;;59778:57;;-1:-1:-1;59846:22:0;;59871:30;;59895:5;;59871:19;;59778:57;;59871:10;:19::i;:30::-;59846:55;-1:-1:-1;;;59679:264:0;:::o;29294:43::-;;;;;;;;;;;;;:::o;30154:20::-;;;-1:-1:-1;;;;;30154:20:0;;:::o;29082:29::-;;;-1:-1:-1;;;;;29082:29:0;;:::o;28890:::-;;;:::o;23935:670::-;24353:10;;;24352:62;;-1:-1:-1;24369:39:0;;;-1:-1:-1;;;24369:39:0;;24393:4;24369:39;;;;-1:-1:-1;;;;;24369:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24369:39:0;:44;24352:62;24330:166;;;;-1:-1:-1;;;24330:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24534:62;;;-1:-1:-1;;;;;24534:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24534:62:0;-1:-1:-1;;;24534:62:0;;;24507:90;;24527:5;;24507:19;:90::i;18025:229::-;18162:12;18194:52;18216:6;18224:4;18230:1;18233:12;18194:21;:52::i;:::-;18187:59;;18025:229;;;;;;:::o;66835:232::-;66963:27;;;;:15;:27;;;;;;:37;;66995:4;66963:31;:37::i;:::-;66933:27;;;;:15;:27;;;;;;;;;:67;;;;67026:33;;;;;;;;;;;;;-1:-1:-1;;;;;67026:33:0;;;;;;;;;;;;66835:232;;;:::o;67073:235::-;67201:27;;;;:15;:27;;;;;;:37;;67233:4;67201:31;:37::i;:::-;67171:27;;;;:15;:27;;;;;;;;;:67;;;;67264:36;;;;;;;;;;;;;-1:-1:-1;;;;;67264:36:0;;;;;;;;;;;;67073:235;;;:::o;6539:179::-;6597:7;6629:5;;;6653:6;;;;6645:46;;;;;-1:-1:-1;;;6645:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7418:220;7476:7;7500:6;7496:20;;-1:-1:-1;7515:1:0;7508:8;;7496:20;7539:5;;;7543:1;7539;:5;:1;7563:5;;;;;:10;7555:56;;;;-1:-1:-1;;;7555:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:153;8174:7;8206:1;8202;:5;8194:44;;;;;-1:-1:-1;;;8194:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8260:1;8256;:5;;;;;;;8116:153;-1:-1:-1;;;8116:153:0:o;7001:158::-;7059:7;7092:1;7087;:6;;7079:49;;;;;-1:-1:-1;;;7079:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7146:5:0;;;7001:158::o;67364:325::-;-1:-1:-1;;;;;67468:17:0;;67440:25;67468:17;;;:8;:17;;;;;67518:13;;-1:-1:-1;;67518:17:0;67559:23;;;67556:93;;67618:6;67625:11;67618:19;;;;;;;;;;;;;;;;;;67599:6;67606:8;67599:16;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67556:93;67669:6;:12;;;;;;;;;;;;;;;-1:-1:-1;;67669:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;67364:325:0:o;23199:211::-;23343:58;;;-1:-1:-1;;;;;23343:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23343:58:0;-1:-1:-1;;;23343:58:0;;;23316:86;;23336:5;;23316:19;:86::i;66293:456::-;-1:-1:-1;;;;;66410:23:0;;66373:34;66410:23;;;:16;:23;;;;;;;;66434:10;66410:35;;;;;;;66482:17;;66410:35;;66373:34;66482:24;;66504:1;66482:21;:24::i;:::-;66456:50;;66545:15;66530:11;:30;66527:115;;66603:10;66614:15;66603:27;;;;;;;;;;;;;;;;;;66577:10;66588:11;66577:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;66527:115;66662:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;66662:16:0;;;;;;;;;;;;;;;;;;;;;;;;66692:52;;;-1:-1:-1;;;;;66692:52:0;;;;66720:10;66692:52;;;;;;;;;;;;;;;;;;;;;;;66293:456;;;;:::o;23418:248::-;23589:68;;;-1:-1:-1;;;;;23589:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23589:68:0;-1:-1:-1;;;23589:68:0;;;23562:96;;23582:5;;25710:774;26134:23;26160:69;26188:4;26160:69;;;;;;;;;;;;;;;;;26168:5;-1:-1:-1;;;;;26160:27:0;;;:69;;;;;:::i;:::-;26244:17;;26134:95;;-1:-1:-1;26244:21:0;26240:237;;26399:10;26388:30;;;;;;;;;;;;;;;-1:-1:-1;26388:30:0;26380:85;;;;-1:-1:-1;;;26380:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19145:571;19315:12;19373:5;19348:21;:30;;19340:81;;;;-1:-1:-1;;;19340:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19440:18;19451:6;19440:10;:18::i;:::-;19432:60;;;;;-1:-1:-1;;;19432:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19566:12;19580:23;19607:6;-1:-1:-1;;;;;19607:11:0;19626:5;19633:4;19607:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19607:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19565:73;;;;19656:52;19674:7;19683:10;19695:12;19656:17;:52::i;:::-;19649:59;19145:571;-1:-1:-1;;;;;;;19145:571:0:o;15085:444::-;15465:20;15513:8;;;15085:444::o;21794:777::-;21944:12;21973:7;21969:595;;;-1:-1:-1;22004:10:0;21997:17;;21969:595;22118:17;;:21;22114:439;;22381:10;22375:17;22442:15;22429:10;22425:2;22421:19;22414:44;22329:148;22524:12;22517:20;;-1:-1:-1;;;22517:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://fb4948bfc61fb0dcbb4bd4bf79175bc78c48a82d48b21a2ad2bd86a3937e4d1f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.