Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
StakeV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-05-24 */ /** *Submitted for verification at polygonscan.com on 2023-05-24 */ // Sources flattened with hardhat v2.11.2 https://hardhat.org // File contracts/v2/IStakeFee.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IStakeFee { enum FeeType { Stake, Withdraw, Claim, AddBooster, RemoveBooster } function getFees( address pool, address account, FeeType _type ) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/security/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ 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) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC20/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/v2/StakeV2.sol // pragma solidity ^0.8.4; contract StakeV2 is ReentrancyGuard, Pausable, Ownable, IERC721Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ IERC20 public immutable rewardsToken; address[] public collectionAddresses; mapping(address => uint256) public collectionRatio; mapping(address => bool) public isAllowedCollection; mapping(address => uint256) public totalStaked; mapping(address => mapping(address => uint256)) public collectionToUserToBalances; mapping(address => uint256) public rewardPerTokenStored; // sum of R/L from 0 to now mapping(address => uint256) public lastUpdateTime; uint256 public periodFinish = 0; uint256 public rewardsDuration = 7 days; uint256 public rewardRate = 0; mapping(address => mapping(address => uint256)) public collectionToUserToRewardPerTokenPaid; // R/L from o to last update mapping(address => mapping(address => uint256)) public collectionToUserToRewards; mapping(address => mapping(uint256 => address)) public nftToUser; // fee IStakeFee public stakeFee; address public chargePayee; // booster address public booster; mapping(address => uint256) public userToBoosterBalance; uint256 public boosterRatio = 2000; // 20%, must divide by 1e4 mapping(address => uint256) public B; // user booster balance * user nft balance /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address[] memory _collections, uint256[] memory _ratios, address _booster, uint256 _boosterRatio, IStakeFee _stakeFee ) Ownable() { rewardsToken = IERC20(_rewardsToken); collectionAddresses = _collections; chargePayee = msg.sender; for (uint256 i = 0; i < _collections.length; i++) { collectionRatio[_collections[i]] = _ratios[i]; isAllowedCollection[_collections[i]] = true; } booster = _booster; boosterRatio = _boosterRatio; stakeFee = _stakeFee; } /* ========== VIEWS ========== */ function balanceOf(address collection, address account) external view returns (uint256) { return collectionToUserToBalances[collection][account]; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < periodFinish ? block.timestamp : periodFinish; } function rewardPerToken(address collection) public view returns (uint256) { if (totalStaked[collection] == 0) { return rewardPerTokenStored[collection]; } uint256 top = rewardRate.mul(collectionRatio[collection]).mul(1e4); uint256 bot = ( (totalStaked[collection].mul(1e4)).add( B[collection].mul(boosterRatio) ) ).mul(100); return rewardPerTokenStored[collection].add( lastTimeRewardApplicable() .sub(lastUpdateTime[collection]) .mul(1e18) .mul(top) .div(bot) ); } function earned(address collection, address account) public view returns (uint256) { return collectionToUserToBalances[collection][account] .mul(1e4 + userToBoosterBalance[account].mul(boosterRatio)) .mul( rewardPerToken(collection).sub( collectionToUserToRewardPerTokenPaid[collection][ account ] ) ) .div(1e18) .div(1e4) .add(collectionToUserToRewards[collection][account]); } function getRewardForDuration() external view returns (uint256) { return rewardRate.mul(rewardsDuration); } /* ========== FEE FUNCTIONS ========== */ function setChargePayee(address _payee) public onlyOwner { chargePayee = _payee; } function setStakeFee(IStakeFee _stakeFee) public onlyOwner { stakeFee = _stakeFee; } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(address collection, uint256[] memory ids) external payable nonReentrant whenNotPaused updateReward(collection, msg.sender) { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Stake ) * ids.length, "stake fee is not enough" ); require(ids.length > 0, "Cannot stake 0 nft"); require(isAllowedCollection[collection], "Collection is not allowed"); totalStaked[collection] = totalStaked[collection].add(ids.length); collectionToUserToBalances[collection][ msg.sender ] = collectionToUserToBalances[collection][msg.sender].add(ids.length); B[collection] = B[collection].add( ids.length.mul(userToBoosterBalance[msg.sender]) ); for (uint256 i = 0; i < ids.length; i++) { IERC721(collection).safeTransferFrom( msg.sender, address(this), ids[i] ); nftToUser[collection][ids[i]] = msg.sender; } payable(chargePayee).transfer(msg.value); emit Staked(msg.sender, collection, ids.length); } function withdraw(address collection, uint256[] memory ids) public payable nonReentrant updateReward(collection, msg.sender) { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Withdraw ) * ids.length, "withdraw fee is not enough" ); require(ids.length > 0, "Cannot withdraw 0 nft"); totalStaked[collection] = totalStaked[collection].sub(ids.length); collectionToUserToBalances[collection][ msg.sender ] = collectionToUserToBalances[collection][msg.sender].sub(ids.length); B[collection] = B[collection].sub( ids.length.mul(userToBoosterBalance[msg.sender]) ); for (uint256 i = 0; i < ids.length; i++) { require(nftToUser[collection][ids[i]] == msg.sender, "not owner"); IERC721(collection).safeTransferFrom( address(this), msg.sender, ids[i] ); } payable(chargePayee).transfer(msg.value); emit Withdrawn(msg.sender, collection, ids.length); } function getReward() public payable nonReentrant { require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.Claim ), "claim fee is not enough" ); for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], msg.sender); uint256 reward = collectionToUserToRewards[collectionAddresses[i]][ msg.sender ]; if (reward > 0) { rewardsToken.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); collectionToUserToRewards[collectionAddresses[i]][ msg.sender ] = 0; } } payable(chargePayee).transfer(msg.value); } function addBooster(uint256 id) public payable nonReentrant { require(booster != address(0), "booster is not set"); require(userToBoosterBalance[msg.sender] < 3, "booster limit reached"); require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.AddBooster ), "add booster fee is not enough" ); IERC721(booster).safeTransferFrom(msg.sender, address(this), id); nftToUser[booster][id] = msg.sender; userToBoosterBalance[msg.sender] = userToBoosterBalance[msg.sender].add( 1 ); for (uint256 i = 0; i < collectionAddresses.length; i++) { B[collectionAddresses[i]] = B[collectionAddresses[i]].add( collectionToUserToBalances[collectionAddresses[i]][msg.sender] ); _updateReward(collectionAddresses[i], msg.sender); } } function removeBooster(uint256 id) public payable nonReentrant { require(booster != address(0), "booster is not set"); require(userToBoosterBalance[msg.sender] > 0, "no booster to remove"); require(nftToUser[booster][id] == msg.sender, "not owner"); require( msg.value == stakeFee.getFees( address(this), msg.sender, IStakeFee.FeeType.RemoveBooster ), "remove booster fee is not enough" ); IERC721(booster).safeTransferFrom(address(this), msg.sender, id); userToBoosterBalance[msg.sender] = userToBoosterBalance[msg.sender].sub( 1 ); for (uint256 i = 0; i < collectionAddresses.length; i++) { B[collectionAddresses[i]] = B[collectionAddresses[i]].sub( collectionToUserToBalances[collectionAddresses[i]][msg.sender] ); _updateReward(collectionAddresses[i], msg.sender); } } /* ========== RESTRICTED FUNCTIONS ========== */ function notifyRewardAmount(uint256 reward) external onlyOwner { for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], address(0)); } if (block.timestamp >= periodFinish) { rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(rewardsDuration); } uint256 balance = rewardsToken.balanceOf(address(this)); require( rewardRate <= balance.div(rewardsDuration), "Provided reward too high" ); for (uint256 i = 0; i < collectionAddresses.length; i++) { lastUpdateTime[collectionAddresses[i]] = block.timestamp; } periodFinish = block.timestamp.add(rewardsDuration); emit RewardAdded(reward); } function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > periodFinish, "Previous rewards period must be complete before changing the duration for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function enableBooster(address _booster) external onlyOwner { require(booster == address(0), "booster already set"); booster = _booster; } function setBoosterRatio(uint256 _ratio) external onlyOwner { require(_ratio < 3300, "ratio must be less than 33%"); boosterRatio = _ratio; } /* ========== MODIFIERS ========== */ modifier updateReward(address collection, address account) { _updateReward(collection, account); _; } function _updateReward(address collection, address account) internal { rewardPerTokenStored[collection] = rewardPerToken(collection); lastUpdateTime[collection] = lastTimeRewardApplicable(); if (account != address(0)) { collectionToUserToRewards[collection][account] = earned( collection, account ); collectionToUserToRewardPerTokenPaid[collection][ account ] = rewardPerTokenStored[collection]; } } function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) external pure returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked( address indexed user, address indexed collection, uint256 amount ); event Withdrawn( address indexed user, address indexed collection, uint256 amount ); event RewardPaid(address indexed user, uint256 reward); event RewardsDurationUpdated(uint256 newDuration); }
[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address[]","name":"_collections","type":"address[]"},{"internalType":"uint256[]","name":"_ratios","type":"uint256[]"},{"internalType":"address","name":"_booster","type":"address"},{"internalType":"uint256","name":"_boosterRatio","type":"uint256"},{"internalType":"contract IStakeFee","name":"_stakeFee","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"B","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"addBooster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boosterRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargePayee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_booster","type":"address"}],"name":"enableBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftToUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"removeBooster","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ratio","type":"uint256"}],"name":"setBoosterRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payee","type":"address"}],"name":"setChargePayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStakeFee","name":"_stakeFee","type":"address"}],"name":"setStakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakeFee","outputs":[{"internalType":"contract IStakeFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userToBoosterBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a0604052600060095562093a80600a556000600b556107d06013553480156200002857600080fd5b5060405162005e6638038062005e6683398181016040528101906200004e919062000788565b60016000819055506000600160006101000a81548160ff0219169083151502179055506200009162000085620002cb60201b60201c565b620002d360201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508460029080519060200190620000dd92919062000396565b5033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8551811015620002355784818151811062000142576200014162000862565b5b60200260200101516003600088848151811062000164576200016362000862565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160046000888481518110620001c657620001c562000862565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200022c90620008c0565b91505062000122565b5082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160138190555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050506200090d565b600033905090565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000412579160200282015b82811115620004115782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620003b7565b5b50905062000421919062000425565b5090565b5b808211156200044057600081600090555060010162000426565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004858262000458565b9050919050565b620004978162000478565b8114620004a357600080fd5b50565b600081519050620004b7816200048c565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050d82620004c2565b810181811067ffffffffffffffff821117156200052f576200052e620004d3565b5b80604052505050565b60006200054462000444565b905062000552828262000502565b919050565b600067ffffffffffffffff821115620005755762000574620004d3565b5b602082029050602081019050919050565b600080fd5b6000620005a26200059c8462000557565b62000538565b90508083825260208201905060208402830185811115620005c857620005c762000586565b5b835b81811015620005f55780620005e08882620004a6565b845260208401935050602081019050620005ca565b5050509392505050565b600082601f830112620006175762000616620004bd565b5b8151620006298482602086016200058b565b91505092915050565b600067ffffffffffffffff82111562000650576200064f620004d3565b5b602082029050602081019050919050565b6000819050919050565b620006768162000661565b81146200068257600080fd5b50565b60008151905062000696816200066b565b92915050565b6000620006b3620006ad8462000632565b62000538565b90508083825260208201905060208402830185811115620006d957620006d862000586565b5b835b81811015620007065780620006f1888262000685565b845260208401935050602081019050620006db565b5050509392505050565b600082601f830112620007285762000727620004bd565b5b81516200073a8482602086016200069c565b91505092915050565b6000620007508262000478565b9050919050565b620007628162000743565b81146200076e57600080fd5b50565b600081519050620007828162000757565b92915050565b60008060008060008060c08789031215620007a857620007a76200044e565b5b6000620007b889828a01620004a6565b965050602087015167ffffffffffffffff811115620007dc57620007db62000453565b5b620007ea89828a01620005ff565b955050604087015167ffffffffffffffff8111156200080e576200080d62000453565b5b6200081c89828a0162000710565b94505060606200082f89828a01620004a6565b93505060806200084289828a0162000685565b92505060a06200085589828a0162000771565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620008cd8262000661565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000902576200090162000891565b5b600182019050919050565b60805161552f62000937600039600081816114ea0152818161192f0152612b03015261552f6000f3fe60806040526004361061025b5760003560e01c80638293744b11610144578063d5d39064116100b6578063f2fde38b1161007a578063f2fde38b146108ff578063f60a038d14610928578063f7888aec14610951578063f7db8ded1461098e578063fc5ba1a4146109cb578063ffd189a7146109f65761025b565b8063d5d3906414610808578063ebe2b12b14610831578063f055cbf51461085c578063f122977714610899578063f1c4db6d146108d65761025b565b80639ce43f90116101085780639ce43f90146106f3578063abae977f14610730578063c6def0761461076d578063c9a3911e14610798578063cc1a378f146107b4578063d1af0c7d146107dd5761025b565b80638293744b1461061b5780638456cb59146106375780638da5cb5b1461064e5780639159b475146106795780639bfd8d61146106b65761025b565b8063386a9525116101dd5780635c975abb116101a15780635c975abb1461051d578063715018a6146105485780637a78b6b71461055f5780637b0a47ee146105885780637f087d49146105b357806380faa57d146105f05761025b565b8063386a95251461046b5780633c6b16ab146104965780633d18b912146104bf5780633f4ba83a146104c95780635207129b146104e05761025b565b80631c1f78eb116102245780631c1f78eb1461037f578063211dc32d146103aa578063221864ba146103e7578063222c9777146104035780632ce9aead1461042e5761025b565b8062c5c5ce1461026057806310accedb1461028b578063134102d6146102c8578063150b7a02146103055780631604b58e14610342575b600080fd5b34801561026c57600080fd5b50610275610a12565b6040516102829190613f6c565b60405180910390f35b34801561029757600080fd5b506102b260048036038101906102ad9190613ff9565b610a18565b6040516102bf9190613f6c565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190613ff9565b610a30565b6040516102fc9190613f6c565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190614198565b610a48565b6040516103399190614256565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613ff9565b610a5c565b604051610376919061428c565b60405180910390f35b34801561038b57600080fd5b50610394610a7c565b6040516103a19190613f6c565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906142a7565b610a9a565b6040516103de9190613f6c565b60405180910390f35b61040160048036038101906103fc91906142e7565b610cf7565b005b34801561040f57600080fd5b506104186113a2565b6040516104259190614373565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613ff9565b6113c8565b6040516104629190613f6c565b60405180910390f35b34801561047757600080fd5b506104806113e0565b60405161048d9190613f6c565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906142e7565b6113e6565b005b6104c76116d9565b005b3480156104d557600080fd5b506104de611b0a565b005b3480156104ec57600080fd5b506105076004803603810190610502919061438e565b611b1c565b60405161051491906143dd565b60405180910390f35b34801561052957600080fd5b50610532611b5e565b60405161053f919061428c565b60405180910390f35b34801561055457600080fd5b5061055d611b75565b005b34801561056b57600080fd5b5061058660048036038101906105819190614436565b611b89565b005b34801561059457600080fd5b5061059d611bd5565b6040516105aa9190613f6c565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613ff9565b611bdb565b6040516105e79190613f6c565b60405180910390f35b3480156105fc57600080fd5b50610605611bf3565b6040516106129190613f6c565b60405180910390f35b6106356004803603810190610630919061452b565b611c0d565b005b34801561064357600080fd5b5061064c6122a3565b005b34801561065a57600080fd5b506106636122b5565b60405161067091906143dd565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b91906142a7565b6122dd565b6040516106ad9190613f6c565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d89190613ff9565b612302565b6040516106ea9190613f6c565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190613ff9565b61231a565b6040516107279190613f6c565b60405180910390f35b34801561073c57600080fd5b50610757600480360381019061075291906142e7565b612332565b60405161076491906143dd565b60405180910390f35b34801561077957600080fd5b50610782612371565b60405161078f91906143dd565b60405180910390f35b6107b260048036038101906107ad919061452b565b612397565b005b3480156107c057600080fd5b506107db60048036038101906107d691906142e7565b612a72565b005b3480156107e957600080fd5b506107f2612b01565b6040516107ff91906145a8565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613ff9565b612b25565b005b34801561083d57600080fd5b50610846612c02565b6040516108539190613f6c565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e91906142a7565b612c08565b6040516108909190613f6c565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb9190613ff9565b612c2d565b6040516108cd9190613f6c565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f891906142e7565b612eea565b005b34801561090b57600080fd5b5061092660048036038101906109219190613ff9565b612f40565b005b34801561093457600080fd5b5061094f600480360381019061094a9190613ff9565b612fc3565b005b34801561095d57600080fd5b50610978600480360381019061097391906142a7565b61300f565b6040516109859190613f6c565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b091906142a7565b613096565b6040516109c29190613f6c565b60405180910390f35b3480156109d757600080fd5b506109e06130bb565b6040516109ed91906143dd565b60405180910390f35b610a106004803603810190610a0b91906142e7565b6130e1565b005b60135481565b60126020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b600063150b7a0260e01b9050949350505050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000610a95600a54600b5461373d90919063ffffffff16565b905090565b6000610cef600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ce1612710610cd3670de0b6b3a7640000610cc5610bc8600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bba8c612c2d565b61375390919063ffffffff16565b610cb7610c1f601354601260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b612710610c2c91906145f2565b600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b61373d90919063ffffffff16565b61376990919063ffffffff16565b61376990919063ffffffff16565b61377f90919063ffffffff16565b905092915050565b600260005403610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390614683565b60405180910390fd5b6002600081905550600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc906146ef565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e9061475b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906147c7565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360046040518463ffffffff1660e01b8152600401610fb79392919061485e565b602060405180830381865afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff891906148aa565b3414611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614923565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b815260040161109893929190614943565b600060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b5050505061111d6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b600280549050811015611396576112ba600660006002848154811061118b5761118a61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460146000600285815481106112465761124561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b60146000600284815481106112d2576112d161497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611383600282815481106113525761135161497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b808061138e906149a9565b915050611163565b50600160008190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915090505481565b600a5481565b6113ee6139af565b60005b60028054905081101561145a57611447600282815481106114155761141461497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000613795565b8080611452906149a9565b9150506113f1565b50600954421061148457611479600a548261376990919063ffffffff16565b600b819055506114e6565b600061149b4260095461375390919063ffffffff16565b905060006114b4600b548361373d90919063ffffffff16565b90506114dd600a546114cf838661377f90919063ffffffff16565b61376990919063ffffffff16565b600b8190555050505b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161154191906143dd565b602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158291906148aa565b9050611599600a548261376990919063ffffffff16565b600b5411156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490614a3d565b60405180910390fd5b60005b600280549050811015611682574260086000600284815481106116065761160561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061167a906149a9565b9150506115e0565b50611698600a544261377f90919063ffffffff16565b6009819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d826040516116cd9190613f6c565b60405180910390a15050565b60026000540361171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614683565b60405180910390fd5b6002600081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360026040518463ffffffff1660e01b81526004016117869392919061485e565b602060405180830381865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c791906148aa565b3414611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90614aa9565b60405180910390fd5b60005b600280549050811015611a96576118606002828154811061182f5761182e61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b6000600d60006002848154811061187a5761187961497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611a825761197333827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613a2d9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516119b99190613f6c565b60405180910390a26000600d6000600285815481106119db576119da61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b508080611a8e906149a9565b91505061180b565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611aff573d6000803e3d6000fd5b506001600081905550565b611b126139af565b611b1a613ab3565b565b600e6020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff16905090565b611b7d6139af565b611b876000613b16565b565b611b916139af565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b60146020528060005260406000206000915090505481565b60006009544210611c0657600954611c08565b425b905090565b600260005403611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614683565b60405180910390fd5b60026000819055508133611c668282613795565b8251600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360016040518463ffffffff1660e01b8152600401611cc89392919061485e565b602060405180830381865afa158015611ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0991906148aa565b611d139190614ac9565b3414611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90614b57565b60405180910390fd5b6000835111611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614bc3565b60405180910390fd5b611deb8351600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ebe8351600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe2611f94601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054855161373d90919063ffffffff16565b601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461375390919063ffffffff16565b601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b83518110156121c5573373ffffffffffffffffffffffffffffffffffffffff16600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086848151811061209c5761209b61497a565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906147c7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166342842e0e303387858151811061215a5761215961497a565b5b60200260200101516040518463ffffffff1660e01b815260040161218093929190614943565b600060405180830381600087803b15801561219a57600080fd5b505af11580156121ae573d6000803e3d6000fd5b5050505080806121bd906149a9565b915050612028565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561222e573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb855160405161228d9190613f6c565b60405180910390a3505060016000819055505050565b6122ab6139af565b6122b3613bd9565b565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c602052816000526040600020602052806000526040600020600091509150505481565b60056020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b6002818154811061234257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600054036123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d390614683565b60405180910390fd5b60026000819055506123ec613c3b565b81336123f88282613795565b8251600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360006040518463ffffffff1660e01b815260040161245a9392919061485e565b602060405180830381865afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b91906148aa565b6124a59190614ac9565b34146124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90614c2f565b60405180910390fd5b600083511161252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614c9b565b60405180910390fd5b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614d07565b60405180910390fd5b6126098351600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126dc8351600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506128006127b2601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054855161373d90919063ffffffff16565b601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8351811015612994578473ffffffffffffffffffffffffffffffffffffffff166342842e0e33308785815181106128805761287f61497a565b5b60200260200101516040518463ffffffff1660e01b81526004016128a693929190614943565b600060405180830381600087803b1580156128c057600080fd5b505af11580156128d4573d6000803e3d6000fd5b5050505033600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086848151811061292d5761292c61497a565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061298c906149a9565b915050612846565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156129fd573d6000803e3d6000fd5b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd78551604051612a5c9190613f6c565b60405180910390a3505060016000819055505050565b612a7a6139af565b6009544211612abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab590614dbf565b60405180910390fd5b80600a819055507ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d3600a54604051612af69190613f6c565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b612b2d6139af565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590614e2b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b6006602052816000526040600020602052806000526040600020600091509150505481565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612cbc57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612ee5565b6000612d26612710612d18600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5461373d90919063ffffffff16565b61373d90919063ffffffff16565b90506000612df66064612de8612d86601354601460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b612dda612710600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461373d90919063ffffffff16565b61377f90919063ffffffff16565b61373d90919063ffffffff16565b9050612ee0612e9282612e8485612e76670de0b6b3a7640000612e68600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e5a611bf3565b61375390919063ffffffff16565b61373d90919063ffffffff16565b61373d90919063ffffffff16565b61376990919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b925050505b919050565b612ef26139af565b610ce48110612f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2d90614e97565b60405180910390fd5b8060138190555050565b612f486139af565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae90614f29565b60405180910390fd5b612fc081613b16565b50565b612fcb6139af565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d602052816000526040600020602052806000526040600020600091509150505481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260005403613126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311d90614683565b60405180910390fd5b6002600081905550600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b6906146ef565b60405180910390fd5b6003601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323890614f95565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d70612b303360036040518463ffffffff1660e01b81526004016132a19392919061485e565b602060405180830381865afa1580156132be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e291906148aa565b3414613323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331a90615001565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b815260040161338293929190614943565b600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b5050505033600e6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506134b86001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b6002805490508110156137315761365560066000600284815481106135265761352561497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460146000600285815481106135e1576135e061497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461377f90919063ffffffff16565b601460006002848154811061366d5761366c61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061371e600282815481106136ed576136ec61497a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633613795565b8080613729906149a9565b9150506134fe565b50600160008190555050565b6000818361374b9190614ac9565b905092915050565b600081836137619190615021565b905092915050565b600081836137779190615084565b905092915050565b6000818361378d91906145f2565b905092915050565b61379e82612c2d565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137e9611bf3565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146139ab5761386a8282610a9a565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b6139b7613c85565b73ffffffffffffffffffffffffffffffffffffffff166139d56122b5565b73ffffffffffffffffffffffffffffffffffffffff1614613a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2290615101565b60405180910390fd5b565b613aae8363a9059cbb60e01b8484604051602401613a4c929190615121565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c8d565b505050565b613abb613d54565b6000600160006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613aff613c85565b604051613b0c91906143dd565b60405180910390a1565b600060018054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613be1613c3b565b60018060006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c24613c85565b604051613c3191906143dd565b60405180910390a1565b613c43611b5e565b15613c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7a90615196565b60405180910390fd5b565b600033905090565b6000613cef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d9d9092919063ffffffff16565b9050600081511115613d4f5780806020019051810190613d0f91906151e2565b613d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4590615281565b60405180910390fd5b5b505050565b613d5c611b5e565b613d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d92906152ed565b60405180910390fd5b565b6060613dac8484600085613db5565b90509392505050565b606082471015613dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df19061537f565b60405180910390fd5b613e0385613ec9565b613e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e39906153eb565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e6b919061547c565b60006040518083038185875af1925050503d8060008114613ea8576040519150601f19603f3d011682016040523d82523d6000602084013e613ead565b606091505b5091509150613ebd828286613eec565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613efc57829050613f4c565b600083511115613f0f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f4391906154d7565b60405180910390fd5b9392505050565b6000819050919050565b613f6681613f53565b82525050565b6000602082019050613f816000830184613f5d565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fc682613f9b565b9050919050565b613fd681613fbb565b8114613fe157600080fd5b50565b600081359050613ff381613fcd565b92915050565b60006020828403121561400f5761400e613f91565b5b600061401d84828501613fe4565b91505092915050565b61402f81613f53565b811461403a57600080fd5b50565b60008135905061404c81614026565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140a58261405c565b810181811067ffffffffffffffff821117156140c4576140c361406d565b5b80604052505050565b60006140d7613f87565b90506140e3828261409c565b919050565b600067ffffffffffffffff8211156141035761410261406d565b5b61410c8261405c565b9050602081019050919050565b82818337600083830152505050565b600061413b614136846140e8565b6140cd565b90508281526020810184848401111561415757614156614057565b5b614162848285614119565b509392505050565b600082601f83011261417f5761417e614052565b5b813561418f848260208601614128565b91505092915050565b600080600080608085870312156141b2576141b1613f91565b5b60006141c087828801613fe4565b94505060206141d187828801613fe4565b93505060406141e28782880161403d565b925050606085013567ffffffffffffffff81111561420357614202613f96565b5b61420f8782880161416a565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6142508161421b565b82525050565b600060208201905061426b6000830184614247565b92915050565b60008115159050919050565b61428681614271565b82525050565b60006020820190506142a1600083018461427d565b92915050565b600080604083850312156142be576142bd613f91565b5b60006142cc85828601613fe4565b92505060206142dd85828601613fe4565b9150509250929050565b6000602082840312156142fd576142fc613f91565b5b600061430b8482850161403d565b91505092915050565b6000819050919050565b600061433961433461432f84613f9b565b614314565b613f9b565b9050919050565b600061434b8261431e565b9050919050565b600061435d82614340565b9050919050565b61436d81614352565b82525050565b60006020820190506143886000830184614364565b92915050565b600080604083850312156143a5576143a4613f91565b5b60006143b385828601613fe4565b92505060206143c48582860161403d565b9150509250929050565b6143d781613fbb565b82525050565b60006020820190506143f260008301846143ce565b92915050565b600061440382613fbb565b9050919050565b614413816143f8565b811461441e57600080fd5b50565b6000813590506144308161440a565b92915050565b60006020828403121561444c5761444b613f91565b5b600061445a84828501614421565b91505092915050565b600067ffffffffffffffff82111561447e5761447d61406d565b5b602082029050602081019050919050565b600080fd5b60006144a76144a284614463565b6140cd565b905080838252602082019050602084028301858111156144ca576144c961448f565b5b835b818110156144f357806144df888261403d565b8452602084019350506020810190506144cc565b5050509392505050565b600082601f83011261451257614511614052565b5b8135614522848260208601614494565b91505092915050565b6000806040838503121561454257614541613f91565b5b600061455085828601613fe4565b925050602083013567ffffffffffffffff81111561457157614570613f96565b5b61457d858286016144fd565b9150509250929050565b600061459282614340565b9050919050565b6145a281614587565b82525050565b60006020820190506145bd6000830184614599565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006145fd82613f53565b915061460883613f53565b92508282019050808211156146205761461f6145c3565b5b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061466d601f83614626565b915061467882614637565b602082019050919050565b6000602082019050818103600083015261469c81614660565b9050919050565b7f626f6f73746572206973206e6f74207365740000000000000000000000000000600082015250565b60006146d9601283614626565b91506146e4826146a3565b602082019050919050565b60006020820190508181036000830152614708816146cc565b9050919050565b7f6e6f20626f6f7374657220746f2072656d6f7665000000000000000000000000600082015250565b6000614745601483614626565b91506147508261470f565b602082019050919050565b6000602082019050818103600083015261477481614738565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006147b1600983614626565b91506147bc8261477b565b602082019050919050565b600060208201905081810360008301526147e0816147a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60058110614827576148266147e7565b5b50565b600081905061483882614816565b919050565b60006148488261482a565b9050919050565b6148588161483d565b82525050565b600060608201905061487360008301866143ce565b61488060208301856143ce565b61488d604083018461484f565b949350505050565b6000815190506148a481614026565b92915050565b6000602082840312156148c0576148bf613f91565b5b60006148ce84828501614895565b91505092915050565b7f72656d6f766520626f6f7374657220666565206973206e6f7420656e6f756768600082015250565b600061490d602083614626565b9150614918826148d7565b602082019050919050565b6000602082019050818103600083015261493c81614900565b9050919050565b600060608201905061495860008301866143ce565b61496560208301856143ce565b6149726040830184613f5d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149b482613f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149e6576149e56145c3565b5b600182019050919050565b7f50726f76696465642072657761726420746f6f20686967680000000000000000600082015250565b6000614a27601883614626565b9150614a32826149f1565b602082019050919050565b60006020820190508181036000830152614a5681614a1a565b9050919050565b7f636c61696d20666565206973206e6f7420656e6f756768000000000000000000600082015250565b6000614a93601783614626565b9150614a9e82614a5d565b602082019050919050565b60006020820190508181036000830152614ac281614a86565b9050919050565b6000614ad482613f53565b9150614adf83613f53565b9250828202614aed81613f53565b91508282048414831517614b0457614b036145c3565b5b5092915050565b7f776974686472617720666565206973206e6f7420656e6f756768000000000000600082015250565b6000614b41601a83614626565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f43616e6e6f742077697468647261772030206e66740000000000000000000000600082015250565b6000614bad601583614626565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b7f7374616b6520666565206973206e6f7420656e6f756768000000000000000000600082015250565b6000614c19601783614626565b9150614c2482614be3565b602082019050919050565b60006020820190508181036000830152614c4881614c0c565b9050919050565b7f43616e6e6f74207374616b652030206e66740000000000000000000000000000600082015250565b6000614c85601283614626565b9150614c9082614c4f565b602082019050919050565b60006020820190508181036000830152614cb481614c78565b9050919050565b7f436f6c6c656374696f6e206973206e6f7420616c6c6f77656400000000000000600082015250565b6000614cf1601983614626565b9150614cfc82614cbb565b602082019050919050565b60006020820190508181036000830152614d2081614ce4565b9050919050565b7f50726576696f7573207265776172647320706572696f64206d7573742062652060008201527f636f6d706c657465206265666f7265206368616e67696e67207468652064757260208201527f6174696f6e20666f7220746865206e657720706572696f640000000000000000604082015250565b6000614da9605883614626565b9150614db482614d27565b606082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f626f6f7374657220616c72656164792073657400000000000000000000000000600082015250565b6000614e15601383614626565b9150614e2082614ddf565b602082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f726174696f206d757374206265206c657373207468616e203333250000000000600082015250565b6000614e81601b83614626565b9150614e8c82614e4b565b602082019050919050565b60006020820190508181036000830152614eb081614e74565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f13602683614626565b9150614f1e82614eb7565b604082019050919050565b60006020820190508181036000830152614f4281614f06565b9050919050565b7f626f6f73746572206c696d697420726561636865640000000000000000000000600082015250565b6000614f7f601583614626565b9150614f8a82614f49565b602082019050919050565b60006020820190508181036000830152614fae81614f72565b9050919050565b7f61646420626f6f7374657220666565206973206e6f7420656e6f756768000000600082015250565b6000614feb601d83614626565b9150614ff682614fb5565b602082019050919050565b6000602082019050818103600083015261501a81614fde565b9050919050565b600061502c82613f53565b915061503783613f53565b925082820390508181111561504f5761504e6145c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061508f82613f53565b915061509a83613f53565b9250826150aa576150a9615055565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150eb602083614626565b91506150f6826150b5565b602082019050919050565b6000602082019050818103600083015261511a816150de565b9050919050565b600060408201905061513660008301856143ce565b6151436020830184613f5d565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000615180601083614626565b915061518b8261514a565b602082019050919050565b600060208201905081810360008301526151af81615173565b9050919050565b6151bf81614271565b81146151ca57600080fd5b50565b6000815190506151dc816151b6565b92915050565b6000602082840312156151f8576151f7613f91565b5b6000615206848285016151cd565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061526b602a83614626565b91506152768261520f565b604082019050919050565b6000602082019050818103600083015261529a8161525e565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006152d7601483614626565b91506152e2826152a1565b602082019050919050565b60006020820190508181036000830152615306816152ca565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615369602683614626565b91506153748261530d565b604082019050919050565b600060208201905081810360008301526153988161535c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006153d5601d83614626565b91506153e08261539f565b602082019050919050565b60006020820190508181036000830152615404816153c8565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561543f578082015181840152602081019050615424565b60008484015250505050565b60006154568261540b565b6154608185615416565b9350615470818560208601615421565b80840191505092915050565b6000615488828461544b565b915081905092915050565b600081519050919050565b60006154a982615493565b6154b38185614626565b93506154c3818560208601615421565b6154cc8161405c565b840191505092915050565b600060208201905081810360008301526154f1818461549e565b90509291505056fea2646970667358221220a93e160243fb03a4998a1dee55a3c67867ffd8155d224e382f17739f8ab07c1f64736f6c634300081100330000000000000000000000009d5991f523f3af7c14e91ca6063c8e08f3c97fbb00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000065e25cb1bbc8e0b0b355bfb2b42a1a96a4cad7b300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009d5991f523f3af7c14e91ca6063c8e08f3c97fbb00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000065e25cb1bbc8e0b0b355bfb2b42a1a96a4cad7b300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x9d5991f523f3af7c14e91ca6063c8e08f3c97fbb
Arg [1] : _collections (address[]): 0x65e25cb1bbc8e0b0b355bfb2b42a1a96a4cad7b3
Arg [2] : _ratios (uint256[]): 100
Arg [3] : _booster (address): 0x0000000000000000000000000000000000000000
Arg [4] : _boosterRatio (uint256): 0
Arg [5] : _stakeFee (address): 0x548c431dbf2165a770dbf7c57cacae8bfdb820b6
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000009d5991f523f3af7c14e91ca6063c8e08f3c97fbb
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000548c431dbf2165a770dbf7c57cacae8bfdb820b6
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 00000000000000000000000065e25cb1bbc8e0b0b355bfb2b42a1a96a4cad7b3
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed ByteCode Sourcemap
41929:13449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43243:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43181:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42213:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54698:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42270:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45895:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45227:660;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50992:1065;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43069:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42570:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42666:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52121:986;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49014:930;;;:::i;:::-;;53554:67;;;;;;;;;;;;;:::i;:::-;;42984:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8589:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3320:103;;;;;;;;;;;;;:::i;:::-;;46175:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42712:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43311:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44345:155;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47708:1298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53483:63;;;;;;;;;;;;;:::i;:::-;;2672:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42750:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42328:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42480:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42170:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43152:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46335:1365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53115:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42127:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53629:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42628:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42383:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44508:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53798:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3578:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46071:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44144:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42886:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43101:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49952:1032;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43243:34;;;;:::o;43181:55::-;;;;;;;;;;;;;;;;;:::o;42213:50::-;;;;;;;;;;;;;;;;;:::o;54698:235::-;54858:6;54884:41;;;54877:48;;54698:235;;;;;;:::o;42270:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;45895:121::-;45950:7;45977:31;45992:15;;45977:10;;:14;;:31;;;;:::i;:::-;45970:38;;45895:121;:::o;45227:660::-;45328:7;45373:506;45832:25;:37;45858:10;45832:37;;;;;;;;;;;;;;;:46;45870:7;45832:46;;;;;;;;;;;;;;;;45373:436;45805:3;45373:409;45777:4;45373:381;45542:193;45599:36;:48;45636:10;45599:48;;;;;;;;;;;;;;;:113;45678:7;45599:113;;;;;;;;;;;;;;;;45542:26;45557:10;45542:14;:26::i;:::-;:30;;:193;;;;:::i;:::-;45373:124;45449:47;45483:12;;45449:20;:29;45470:7;45449:29;;;;;;;;;;;;;;;;:33;;:47;;;;:::i;:::-;45443:3;:53;;;;:::i;:::-;45373:26;:38;45400:10;45373:38;;;;;;;;;;;;;;;:47;45412:7;45373:47;;;;;;;;;;;;;;;;:69;;:124;;;;:::i;:::-;:146;;:381;;;;:::i;:::-;:403;;:409;;;;:::i;:::-;:431;;:436;;;;:::i;:::-;:458;;:506;;;;:::i;:::-;45353:526;;45227:660;;;;:::o;50992:1065::-;5960:1;6558:7;;:19;6550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5960:1;6691:7;:18;;;;51093:1:::1;51074:21;;:7;;;;;;;;;;;:21;;::::0;51066:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;51172:1;51137:20;:32;51158:10;51137:32;;;;;;;;;;;;;;;;:36;51129:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51243:10;51217:36;;:9;:18;51227:7;;;;;;;;;;;51217:18;;;;;;;;;;;;;;;:22;51236:2;51217:22;;;;;;;;;;;;;;;;;;;;;:36;;;51209:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51330:8;;;;;;;;;;;:16;;;51377:4;51405:10;51438:31;51330:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51300:9;:188;51278:270;;;;;;;;;;;;:::i;:::-;;;;;;;;;51569:7;;;;;;;;;;;51561:33;;;51603:4;51610:10;51622:2;51561:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51671:63;51722:1;51671:20;:32;51692:10;51671:32;;;;;;;;;;;;;;;;:36;;:63;;;;:::i;:::-;51636:20;:32;51657:10;51636:32;;;;;;;;;;;;;;;:98;;;;51752:9;51747:303;51771:19;:26;;;;51767:1;:30;51747:303;;;51847:125;51895:26;:50;51922:19;51942:1;51922:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51895:50;;;;;;;;;;;;;;;:62;51946:10;51895:62;;;;;;;;;;;;;;;;51847:1;:25;51849:19;51869:1;51849:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51847:25;;;;;;;;;;;;;;;;:29;;:125;;;;:::i;:::-;51819:1;:25;51821:19;51841:1;51821:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51819:25;;;;;;;;;;;;;;;:153;;;;51989:49;52003:19;52023:1;52003:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52027:10;51989:13;:49::i;:::-;51799:3;;;;;:::i;:::-;;;;51747:303;;;;5916:1:::0;6870:7;:22;;;;50992:1065;:::o;43069:25::-;;;;;;;;;;;;;:::o;42570:49::-;;;;;;;;;;;;;;;;;:::o;42666:39::-;;;;:::o;52121:986::-;2558:13;:11;:13::i;:::-;52200:9:::1;52195:133;52219:19;:26;;;;52215:1;:30;52195:133;;;52267:49;52281:19;52301:1;52281:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52313:1;52267:13;:49::i;:::-;52247:3;;;;;:::i;:::-;;;;52195:133;;;;52361:12;;52342:15;:31;52338:318;;52403:27;52414:15;;52403:6;:10;;:27;;;;:::i;:::-;52390:10;:40;;;;52338:318;;;52463:17;52483:33;52500:15;52483:12;;:16;;:33;;;;:::i;:::-;52463:53;;52531:16;52550:25;52564:10;;52550:9;:13;;:25;;;;:::i;:::-;52531:44;;52603:41;52628:15;;52603:20;52614:8;52603:6;:10;;:20;;;;:::i;:::-;:24;;:41;;;;:::i;:::-;52590:10;:54;;;;52448:208;;52338:318;52668:15;52686:12;:22;;;52717:4;52686:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52668:55;;52770:28;52782:15;;52770:7;:11;;:28;;;;:::i;:::-;52756:10;;:42;;52734:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;52868:9;52863:140;52887:19;:26;;;;52883:1;:30;52863:140;;;52976:15;52935:14;:38;52950:19;52970:1;52950:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52935:38;;;;;;;;;;;;;;;:56;;;;52915:3;;;;;:::i;:::-;;;;52863:140;;;;53028:36;53048:15;;53028;:19;;:36;;;;:::i;:::-;53013:12;:51;;;;53080:19;53092:6;53080:19;;;;;;:::i;:::-;;;;;;;;52184:923;52121:986:::0;:::o;49014:930::-;5960:1;6558:7;;:19;6550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5960:1;6691:7;:18;;;;49126:8:::1;;;;;;;;;;;:16;;;49173:4;49201:10;49234:23;49126:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49096:9;:180;49074:253;;;;;;;;;;;;:::i;:::-;;;;;;;;;49343:9;49338:548;49362:19;:26;;;;49358:1;:30;49338:548;;;49410:49;49424:19;49444:1;49424:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49448:10;49410:13;:49::i;:::-;49474:14;49491:25;:49;49517:19;49537:1;49517:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49491:49;;;;;;;;;;;;;;;:93;49559:10;49491:93;;;;;;;;;;;;;;;;49474:110;;49614:1;49605:6;:10;49601:274;;;49636:45;49662:10;49674:6;49636:12;:25;;;;:45;;;;;:::i;:::-;49716:10;49705:30;;;49728:6;49705:30;;;;;;:::i;:::-;;;;;;;;49858:1;49754:25;:49;49780:19;49800:1;49780:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49754:49;;;;;;;;;;;;;;;:101;49826:10;49754:101;;;;;;;;;;;;;;;:105;;;;49601:274;49395:491;49390:3;;;;;:::i;:::-;;;;49338:548;;;;49904:11;;;;;;;;;;;49896:29;;:40;49926:9;49896:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5916:1:::0;6870:7;:22;;;;49014:930::o;53554:67::-;2558:13;:11;:13::i;:::-;53603:10:::1;:8;:10::i;:::-;53554:67::o:0;42984:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8589:86::-;8636:4;8660:7;;;;;;;;;;;8653:14;;8589:86;:::o;3320:103::-;2558:13;:11;:13::i;:::-;3385:30:::1;3412:1;3385:18;:30::i;:::-;3320:103::o:0;46175:98::-;2558:13;:11;:13::i;:::-;46256:9:::1;46245:8;;:20;;;;;;;;;;;;;;;;;;46175:98:::0;:::o;42712:29::-;;;;:::o;43311:36::-;;;;;;;;;;;;;;;;;:::o;44345:155::-;44402:7;44447:12;;44429:15;:30;:63;;44480:12;;44429:63;;;44462:15;44429:63;44422:70;;44345:155;:::o;47708:1298::-;5960:1;6558:7;;:19;6550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5960:1;6691:7;:18;;;;47845:10:::1;47857;54085:34;54099:10;54111:7;54085:13;:34::i;:::-;48114:3:::2;:10;47937:8;;;;;;;;;;;:16;;;47984:4;48012:10;48045:26;47937:153;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:187;;;;:::i;:::-;47907:9;:217;47885:293;;;;;;;;;;;;:::i;:::-;;;;;;;;;48210:1;48197:3;:10;:14;48189:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48276:39;48304:3;:10;48276:11;:23;48288:10;48276:23;;;;;;;;;;;;;;;;:27;;:39;;;;:::i;:::-;48250:11;:23;48262:10;48250:23;;;;;;;;;;;;;;;:65;;;;48403:66;48458:3;:10;48403:26;:38;48430:10;48403:38;;;;;;;;;;;;;;;:50;48442:10;48403:50;;;;;;;;;;;;;;;;:54;;:66;;;;:::i;:::-;48326:26;:38;48353:10;48326:38;;;;;;;;;;;;;;;:74;48379:10;48326:74;;;;;;;;;;;;;;;:143;;;;48498:91;48530:48;48545:20;:32;48566:10;48545:32;;;;;;;;;;;;;;;;48530:3;:10;:14;;:48;;;;:::i;:::-;48498:1;:13;48500:10;48498:13;;;;;;;;;;;;;;;;:17;;:91;;;;:::i;:::-;48482:1;:13;48484:10;48482:13;;;;;;;;;;;;;;;:107;;;;48607:9;48602:285;48626:3;:10;48622:1;:14;48602:285;;;48699:10;48666:43;;:9;:21;48676:10;48666:21;;;;;;;;;;;;;;;:29;48688:3;48692:1;48688:6;;;;;;;;:::i;:::-;;;;;;;;48666:29;;;;;;;;;;;;;;;;;;;;;:43;;;48658:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48746:10;48738:36;;;48801:4;48825:10;48854:3;48858:1;48854:6;;;;;;;;:::i;:::-;;;;;;;;48738:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;48638:3;;;;;:::i;:::-;;;;48602:285;;;;48905:11;;;;;;;;;;;48897:29;;:40;48927:9;48897:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;48975:10;48953:45;;48963:10;48953:45;;;48987:3;:10;48953:45;;;;;;:::i;:::-;;;;;;;;6722:1:::1;;5916::::0;6870:7;:22;;;;47708:1298;;:::o;53483:63::-;2558:13;:11;:13::i;:::-;53530:8:::1;:6;:8::i;:::-;53483:63::o:0;2672:87::-;2718:7;2745:6;;;;;;;;;;2738:13;;2672:87;:::o;42750:100::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42328:46::-;;;;;;;;;;;;;;;;;:::o;42480:55::-;;;;;;;;;;;;;;;;;:::o;42170:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43152:22::-;;;;;;;;;;;;;:::o;46335:1365::-;5960:1;6558:7;;:19;6550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5960:1;6691:7;:18;;;;8194:19:::1;:17;:19::i;:::-;46494:10:::2;46506;54085:34;54099:10;54111:7;54085:13;:34::i;:::-;46760:3:::3;:10;46586:8;;;;;;;;;;;:16;;;46633:4;46661:10;46694:23;46586:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:184;;;;:::i;:::-;46556:9;:214;46534:287;;;;;;;;;;;;:::i;:::-;;;;;;;;;46853:1;46840:3;:10;:14;46832:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;46896:19;:31;46916:10;46896:31;;;;;;;;;;;;;;;;;;;;;;;;;46888:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46996:39;47024:3;:10;46996:11;:23;47008:10;46996:23;;;;;;;;;;;;;;;;:27;;:39;;;;:::i;:::-;46970:11;:23;46982:10;46970:23;;;;;;;;;;;;;;;:65;;;;47123:66;47178:3;:10;47123:26;:38;47150:10;47123:38;;;;;;;;;;;;;;;:50;47162:10;47123:50;;;;;;;;;;;;;;;;:54;;:66;;;;:::i;:::-;47046:26;:38;47073:10;47046:38;;;;;;;;;;;;;;;:74;47099:10;47046:74;;;;;;;;;;;;;;;:143;;;;47218:91;47250:48;47265:20;:32;47286:10;47265:32;;;;;;;;;;;;;;;;47250:3;:10;:14;;:48;;;;:::i;:::-;47218:1;:13;47220:10;47218:13;;;;;;;;;;;;;;;;:17;;:91;;;;:::i;:::-;47202:1;:13;47204:10;47202:13;;;;;;;;;;;;;;;:107;;;;47327:9;47322:262;47346:3;:10;47342:1;:14;47322:262;;;47386:10;47378:36;;;47433:10;47470:4;47494:3;47498:1;47494:6;;;;;;;;:::i;:::-;;;;;;;;47378:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;47562:10;47530:9;:21;47540:10;47530:21;;;;;;;;;;;;;;;:29;47552:3;47556:1;47552:6;;;;;;;;:::i;:::-;;;;;;;;47530:29;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;47358:3;;;;;:::i;:::-;;;;47322:262;;;;47602:11;;;;;;;;;;;47594:29;;:40;47624:9;47594:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;47669:10;47650:42;;47657:10;47650:42;;;47681:3;:10;47650:42;;;;;;:::i;:::-;;;;;;;;8224:1:::2;;5916::::0;6870:7;:22;;;;46335:1365;;:::o;53115:360::-;2558:13;:11;:13::i;:::-;53239:12:::1;;53221:15;:30;53199:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;53396:16;53378:15;:34;;;;53428:39;53451:15;;53428:39;;;;;;:::i;:::-;;;;;;;;53115:360:::0;:::o;42127:36::-;;;:::o;53629:161::-;2558:13;:11;:13::i;:::-;53727:1:::1;53708:21;;:7;;;;;;;;;;;:21;;;53700:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53774:8;53764:7;;:18;;;;;;;;;;;;;;;;;;53629:161:::0;:::o;42628:31::-;;;;:::o;42383:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44508:711::-;44573:7;44624:1;44597:11;:23;44609:10;44597:23;;;;;;;;;;;;;;;;:28;44593:100;;44649:20;:32;44670:10;44649:32;;;;;;;;;;;;;;;;44642:39;;;;44593:100;44705:11;44719:52;44767:3;44719:43;44734:15;:27;44750:10;44734:27;;;;;;;;;;;;;;;;44719:10;;:14;;:43;;;;:::i;:::-;:47;;:52;;;;:::i;:::-;44705:66;;44782:11;44796:138;44930:3;44811:103;44868:31;44886:12;;44868:1;:13;44870:10;44868:13;;;;;;;;;;;;;;;;:17;;:31;;;;:::i;:::-;44812:32;44840:3;44812:11;:23;44824:10;44812:23;;;;;;;;;;;;;;;;:27;;:32;;;;:::i;:::-;44811:38;;:103;;;;:::i;:::-;44796:133;;:138;;;;:::i;:::-;44782:152;;44967:244;45022:174;45192:3;45022:143;45161:3;45022:112;45129:4;45022:80;45075:14;:26;45090:10;45075:26;;;;;;;;;;;;;;;;45022;:24;:26::i;:::-;:52;;:80;;;;:::i;:::-;:106;;:112;;;;:::i;:::-;:138;;:143;;;;:::i;:::-;:169;;:174;;;;:::i;:::-;44967:20;:32;44988:10;44967:32;;;;;;;;;;;;;;;;:36;;:244;;;;:::i;:::-;44947:264;;;;44508:711;;;;:::o;53798:164::-;2558:13;:11;:13::i;:::-;53886:4:::1;53877:6;:13;53869:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53948:6;53933:12;:21;;;;53798:164:::0;:::o;3578:201::-;2558:13;:11;:13::i;:::-;3687:1:::1;3667:22;;:8;:22;;::::0;3659:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3743:28;3762:8;3743:18;:28::i;:::-;3578:201:::0;:::o;46071:96::-;2558:13;:11;:13::i;:::-;46153:6:::1;46139:11;;:20;;;;;;;;;;;;;;;;;;46071:96:::0;:::o;44144:193::-;44250:7;44282:26;:38;44309:10;44282:38;;;;;;;;;;;;;;;:47;44321:7;44282:47;;;;;;;;;;;;;;;;44275:54;;44144:193;;;;:::o;42886:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43101:26::-;;;;;;;;;;;;;:::o;49952:1032::-;5960:1;6558:7;;:19;6550:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5960:1;6691:7;:18;;;;50050:1:::1;50031:21;;:7;;;;;;;;;;;:21;;::::0;50023:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50129:1;50094:20;:32;50115:10;50094:32;;;;;;;;;;;;;;;;:36;50086:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50219:8;;;;;;;;;;;:16;;;50266:4;50294:10;50327:28;50219:155;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50189:9;:185;50167:264;;;;;;;;;;;;:::i;:::-;;;;;;;;;50452:7;;;;;;;;;;;50444:33;;;50478:10;50498:4;50505:2;50444:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50544:10;50519:9;:18;50529:7;;;;;;;;;;;50519:18;;;;;;;;;;;;;;;:22;50538:2;50519:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;50602:63;50653:1;50602:20;:32;50623:10;50602:32;;;;;;;;;;;;;;;;:36;;:63;;;;:::i;:::-;50567:20;:32;50588:10;50567:32;;;;;;;;;;;;;;;:98;;;;50681:9;50676:301;50700:19;:26;;;;50696:1;:30;50676:301;;;50776:125;50824:26;:50;50851:19;50871:1;50851:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50824:50;;;;;;;;;;;;;;;:62;50875:10;50824:62;;;;;;;;;;;;;;;;50776:1;:25;50778:19;50798:1;50778:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50776:25;;;;;;;;;;;;;;;;:29;;:125;;;;:::i;:::-;50748:1;:25;50750:19;50770:1;50750:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50748:25;;;;;;;;;;;;;;;:153;;;;50916:49;50930:19;50950:1;50930:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50954:10;50916:13;:49::i;:::-;50728:3;;;;;:::i;:::-;;;;50676:301;;;;5916:1:::0;6870:7;:22;;;;49952:1032;:::o;13196:98::-;13254:7;13285:1;13281;:5;;;;:::i;:::-;13274:12;;13196:98;;;;:::o;12839:::-;12897:7;12928:1;12924;:5;;;;:::i;:::-;12917:12;;12839:98;;;;:::o;13595:::-;13653:7;13684:1;13680;:5;;;;:::i;:::-;13673:12;;13595:98;;;;:::o;12458:::-;12516:7;12547:1;12543;:5;;;;:::i;:::-;12536:12;;12458:98;;;;:::o;54147:543::-;54262:26;54277:10;54262:14;:26::i;:::-;54227:20;:32;54248:10;54227:32;;;;;;;;;;;;;;;:61;;;;54328:26;:24;:26::i;:::-;54299:14;:26;54314:10;54299:26;;;;;;;;;;;;;;;:55;;;;54388:1;54369:21;;:7;:21;;;54365:318;;54456:76;54481:10;54510:7;54456:6;:76::i;:::-;54407:25;:37;54433:10;54407:37;;;;;;;;;;;;;;;:46;54445:7;54407:46;;;;;;;;;;;;;;;:125;;;;54639:20;:32;54660:10;54639:32;;;;;;;;;;;;;;;;54547:36;:48;54584:10;54547:48;;;;;;;;;;;;;;;:89;54614:7;54547:89;;;;;;;;;;;;;;;:124;;;;54365:318;54147:543;;:::o;2837:132::-;2912:12;:10;:12::i;:::-;2901:23;;:7;:5;:7::i;:::-;:23;;;2893:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2837:132::o;38052:211::-;38169:86;38189:5;38219:23;;;38244:2;38248:5;38196:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38169:19;:86::i;:::-;38052:211;;;:::o;9444:120::-;8453:16;:14;:16::i;:::-;9513:5:::1;9503:7;;:15;;;;;;;;;;;;;;;;;;9534:22;9543:12;:10;:12::i;:::-;9534:22;;;;;;:::i;:::-;;;;;;;;9444:120::o:0;3939:191::-;4013:16;4032:6;;;;;;;;;;4013:25;;4058:8;4049:6;;:17;;;;;;;;;;;;;;;;;;4113:8;4082:40;;4103:8;4082:40;;;;;;;;;;;;4002:128;3939:191;:::o;9185:118::-;8194:19;:17;:19::i;:::-;9255:4:::1;9245:7:::0;::::1;:14;;;;;;;;;;;;;;;;;;9275:20;9282:12;:10;:12::i;:::-;9275:20;;;;;;:::i;:::-;;;;;;;;9185:118::o:0;8748:108::-;8819:8;:6;:8::i;:::-;8818:9;8810:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;8748:108::o;1214:98::-;1267:7;1294:10;1287:17;;1214:98;:::o;41119:716::-;41543:23;41569:69;41597:4;41569:69;;;;;;;;;;;;;;;;;41577:5;41569:27;;;;:69;;;;;:::i;:::-;41543:95;;41673:1;41653:10;:17;:21;41649:179;;;41750:10;41739:30;;;;;;;;;;;;:::i;:::-;41731:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41649:179;41189:646;41119:716;;:::o;8933:108::-;9000:8;:6;:8::i;:::-;8992:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;8933:108::o;32754:229::-;32891:12;32923:52;32945:6;32953:4;32959:1;32962:12;32923:21;:52::i;:::-;32916:59;;32754:229;;;;;:::o;33874:510::-;34044:12;34102:5;34077:21;:30;;34069:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34169:18;34180:6;34169:10;:18::i;:::-;34161:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;34235:12;34249:23;34276:6;:11;;34295:5;34302:4;34276:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34234:73;;;;34325:51;34342:7;34351:10;34363:12;34325:16;:51::i;:::-;34318:58;;;;33874:510;;;;;;:::o;30009:326::-;30069:4;30326:1;30304:7;:19;;;:23;30297:30;;30009:326;;;:::o;36560:762::-;36710:12;36739:7;36735:580;;;36770:10;36763:17;;;;36735:580;36904:1;36884:10;:17;:21;36880:424;;;37132:10;37126:17;37193:15;37180:10;37176:2;37172:19;37165:44;36880:424;37275:12;37268:20;;;;;;;;;;;:::i;:::-;;;;;;;;36560:762;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:117::-;1993:1;1990;1983:12;2007:117;2116:1;2113;2106:12;2130:102;2171:6;2222:2;2218:7;2213:2;2206:5;2202:14;2198:28;2188:38;;2130:102;;;:::o;2238:180::-;2286:77;2283:1;2276:88;2383:4;2380:1;2373:15;2407:4;2404:1;2397:15;2424:281;2507:27;2529:4;2507:27;:::i;:::-;2499:6;2495:40;2637:6;2625:10;2622:22;2601:18;2589:10;2586:34;2583:62;2580:88;;;2648:18;;:::i;:::-;2580:88;2688:10;2684:2;2677:22;2467:238;2424:281;;:::o;2711:129::-;2745:6;2772:20;;:::i;:::-;2762:30;;2801:33;2829:4;2821:6;2801:33;:::i;:::-;2711:129;;;:::o;2846:307::-;2907:4;2997:18;2989:6;2986:30;2983:56;;;3019:18;;:::i;:::-;2983:56;3057:29;3079:6;3057:29;:::i;:::-;3049:37;;3141:4;3135;3131:15;3123:23;;2846:307;;;:::o;3159:146::-;3256:6;3251:3;3246;3233:30;3297:1;3288:6;3283:3;3279:16;3272:27;3159:146;;;:::o;3311:423::-;3388:5;3413:65;3429:48;3470:6;3429:48;:::i;:::-;3413:65;:::i;:::-;3404:74;;3501:6;3494:5;3487:21;3539:4;3532:5;3528:16;3577:3;3568:6;3563:3;3559:16;3556:25;3553:112;;;3584:79;;:::i;:::-;3553:112;3674:54;3721:6;3716:3;3711;3674:54;:::i;:::-;3394:340;3311:423;;;;;:::o;3753:338::-;3808:5;3857:3;3850:4;3842:6;3838:17;3834:27;3824:122;;3865:79;;:::i;:::-;3824:122;3982:6;3969:20;4007:78;4081:3;4073:6;4066:4;4058:6;4054:17;4007:78;:::i;:::-;3998:87;;3814:277;3753:338;;;;:::o;4097:943::-;4192:6;4200;4208;4216;4265:3;4253:9;4244:7;4240:23;4236:33;4233:120;;;4272:79;;:::i;:::-;4233:120;4392:1;4417:53;4462:7;4453:6;4442:9;4438:22;4417:53;:::i;:::-;4407:63;;4363:117;4519:2;4545:53;4590:7;4581:6;4570:9;4566:22;4545:53;:::i;:::-;4535:63;;4490:118;4647:2;4673:53;4718:7;4709:6;4698:9;4694:22;4673:53;:::i;:::-;4663:63;;4618:118;4803:2;4792:9;4788:18;4775:32;4834:18;4826:6;4823:30;4820:117;;;4856:79;;:::i;:::-;4820:117;4961:62;5015:7;5006:6;4995:9;4991:22;4961:62;:::i;:::-;4951:72;;4746:287;4097:943;;;;;;;:::o;5046:149::-;5082:7;5122:66;5115:5;5111:78;5100:89;;5046:149;;;:::o;5201:115::-;5286:23;5303:5;5286:23;:::i;:::-;5281:3;5274:36;5201:115;;:::o;5322:218::-;5413:4;5451:2;5440:9;5436:18;5428:26;;5464:69;5530:1;5519:9;5515:17;5506:6;5464:69;:::i;:::-;5322:218;;;;:::o;5546:90::-;5580:7;5623:5;5616:13;5609:21;5598:32;;5546:90;;;:::o;5642:109::-;5723:21;5738:5;5723:21;:::i;:::-;5718:3;5711:34;5642:109;;:::o;5757:210::-;5844:4;5882:2;5871:9;5867:18;5859:26;;5895:65;5957:1;5946:9;5942:17;5933:6;5895:65;:::i;:::-;5757:210;;;;:::o;5973:474::-;6041:6;6049;6098:2;6086:9;6077:7;6073:23;6069:32;6066:119;;;6104:79;;:::i;:::-;6066:119;6224:1;6249:53;6294:7;6285:6;6274:9;6270:22;6249:53;:::i;:::-;6239:63;;6195:117;6351:2;6377:53;6422:7;6413:6;6402:9;6398:22;6377:53;:::i;:::-;6367:63;;6322:118;5973:474;;;;;:::o;6453:329::-;6512:6;6561:2;6549:9;6540:7;6536:23;6532:32;6529:119;;;6567:79;;:::i;:::-;6529:119;6687:1;6712:53;6757:7;6748:6;6737:9;6733:22;6712:53;:::i;:::-;6702:63;;6658:117;6453:329;;;;:::o;6788:60::-;6816:3;6837:5;6830:12;;6788:60;;;:::o;6854:142::-;6904:9;6937:53;6955:34;6964:24;6982:5;6964:24;:::i;:::-;6955:34;:::i;:::-;6937:53;:::i;:::-;6924:66;;6854:142;;;:::o;7002:126::-;7052:9;7085:37;7116:5;7085:37;:::i;:::-;7072:50;;7002:126;;;:::o;7134:142::-;7200:9;7233:37;7264:5;7233:37;:::i;:::-;7220:50;;7134:142;;;:::o;7282:163::-;7385:53;7432:5;7385:53;:::i;:::-;7380:3;7373:66;7282:163;;:::o;7451:254::-;7560:4;7598:2;7587:9;7583:18;7575:26;;7611:87;7695:1;7684:9;7680:17;7671:6;7611:87;:::i;:::-;7451:254;;;;:::o;7711:474::-;7779:6;7787;7836:2;7824:9;7815:7;7811:23;7807:32;7804:119;;;7842:79;;:::i;:::-;7804:119;7962:1;7987:53;8032:7;8023:6;8012:9;8008:22;7987:53;:::i;:::-;7977:63;;7933:117;8089:2;8115:53;8160:7;8151:6;8140:9;8136:22;8115:53;:::i;:::-;8105:63;;8060:118;7711:474;;;;;:::o;8191:118::-;8278:24;8296:5;8278:24;:::i;:::-;8273:3;8266:37;8191:118;;:::o;8315:222::-;8408:4;8446:2;8435:9;8431:18;8423:26;;8459:71;8527:1;8516:9;8512:17;8503:6;8459:71;:::i;:::-;8315:222;;;;:::o;8543:112::-;8596:7;8625:24;8643:5;8625:24;:::i;:::-;8614:35;;8543:112;;;:::o;8661:154::-;8750:40;8784:5;8750:40;:::i;:::-;8743:5;8740:51;8730:79;;8805:1;8802;8795:12;8730:79;8661:154;:::o;8821:171::-;8883:5;8921:6;8908:20;8899:29;;8937:49;8980:5;8937:49;:::i;:::-;8821:171;;;;:::o;8998:361::-;9073:6;9122:2;9110:9;9101:7;9097:23;9093:32;9090:119;;;9128:79;;:::i;:::-;9090:119;9248:1;9273:69;9334:7;9325:6;9314:9;9310:22;9273:69;:::i;:::-;9263:79;;9219:133;8998:361;;;;:::o;9365:311::-;9442:4;9532:18;9524:6;9521:30;9518:56;;;9554:18;;:::i;:::-;9518:56;9604:4;9596:6;9592:17;9584:25;;9664:4;9658;9654:15;9646:23;;9365:311;;;:::o;9682:117::-;9791:1;9788;9781:12;9822:710;9918:5;9943:81;9959:64;10016:6;9959:64;:::i;:::-;9943:81;:::i;:::-;9934:90;;10044:5;10073:6;10066:5;10059:21;10107:4;10100:5;10096:16;10089:23;;10160:4;10152:6;10148:17;10140:6;10136:30;10189:3;10181:6;10178:15;10175:122;;;10208:79;;:::i;:::-;10175:122;10323:6;10306:220;10340:6;10335:3;10332:15;10306:220;;;10415:3;10444:37;10477:3;10465:10;10444:37;:::i;:::-;10439:3;10432:50;10511:4;10506:3;10502:14;10495:21;;10382:144;10366:4;10361:3;10357:14;10350:21;;10306:220;;;10310:21;9924:608;;9822:710;;;;;:::o;10555:370::-;10626:5;10675:3;10668:4;10660:6;10656:17;10652:27;10642:122;;10683:79;;:::i;:::-;10642:122;10800:6;10787:20;10825:94;10915:3;10907:6;10900:4;10892:6;10888:17;10825:94;:::i;:::-;10816:103;;10632:293;10555:370;;;;:::o;10931:684::-;11024:6;11032;11081:2;11069:9;11060:7;11056:23;11052:32;11049:119;;;11087:79;;:::i;:::-;11049:119;11207:1;11232:53;11277:7;11268:6;11257:9;11253:22;11232:53;:::i;:::-;11222:63;;11178:117;11362:2;11351:9;11347:18;11334:32;11393:18;11385:6;11382:30;11379:117;;;11415:79;;:::i;:::-;11379:117;11520:78;11590:7;11581:6;11570:9;11566:22;11520:78;:::i;:::-;11510:88;;11305:303;10931:684;;;;;:::o;11621:140::-;11685:9;11718:37;11749:5;11718:37;:::i;:::-;11705:50;;11621:140;;;:::o;11767:159::-;11868:51;11913:5;11868:51;:::i;:::-;11863:3;11856:64;11767:159;;:::o;11932:250::-;12039:4;12077:2;12066:9;12062:18;12054:26;;12090:85;12172:1;12161:9;12157:17;12148:6;12090:85;:::i;:::-;11932:250;;;;:::o;12188:180::-;12236:77;12233:1;12226:88;12333:4;12330:1;12323:15;12357:4;12354:1;12347:15;12374:191;12414:3;12433:20;12451:1;12433:20;:::i;:::-;12428:25;;12467:20;12485:1;12467:20;:::i;:::-;12462:25;;12510:1;12507;12503:9;12496:16;;12531:3;12528:1;12525:10;12522:36;;;12538:18;;:::i;:::-;12522:36;12374:191;;;;:::o;12571:169::-;12655:11;12689:6;12684:3;12677:19;12729:4;12724:3;12720:14;12705:29;;12571:169;;;;:::o;12746:181::-;12886:33;12882:1;12874:6;12870:14;12863:57;12746:181;:::o;12933:366::-;13075:3;13096:67;13160:2;13155:3;13096:67;:::i;:::-;13089:74;;13172:93;13261:3;13172:93;:::i;:::-;13290:2;13285:3;13281:12;13274:19;;12933:366;;;:::o;13305:419::-;13471:4;13509:2;13498:9;13494:18;13486:26;;13558:9;13552:4;13548:20;13544:1;13533:9;13529:17;13522:47;13586:131;13712:4;13586:131;:::i;:::-;13578:139;;13305:419;;;:::o;13730:168::-;13870:20;13866:1;13858:6;13854:14;13847:44;13730:168;:::o;13904:366::-;14046:3;14067:67;14131:2;14126:3;14067:67;:::i;:::-;14060:74;;14143:93;14232:3;14143:93;:::i;:::-;14261:2;14256:3;14252:12;14245:19;;13904:366;;;:::o;14276:419::-;14442:4;14480:2;14469:9;14465:18;14457:26;;14529:9;14523:4;14519:20;14515:1;14504:9;14500:17;14493:47;14557:131;14683:4;14557:131;:::i;:::-;14549:139;;14276:419;;;:::o;14701:170::-;14841:22;14837:1;14829:6;14825:14;14818:46;14701:170;:::o;14877:366::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;14877:366;;;:::o;15249:419::-;15415:4;15453:2;15442:9;15438:18;15430:26;;15502:9;15496:4;15492:20;15488:1;15477:9;15473:17;15466:47;15530:131;15656:4;15530:131;:::i;:::-;15522:139;;15249:419;;;:::o;15674:159::-;15814:11;15810:1;15802:6;15798:14;15791:35;15674:159;:::o;15839:365::-;15981:3;16002:66;16066:1;16061:3;16002:66;:::i;:::-;15995:73;;16077:93;16166:3;16077:93;:::i;:::-;16195:2;16190:3;16186:12;16179:19;;15839:365;;;:::o;16210:419::-;16376:4;16414:2;16403:9;16399:18;16391:26;;16463:9;16457:4;16453:20;16449:1;16438:9;16434:17;16427:47;16491:131;16617:4;16491:131;:::i;:::-;16483:139;;16210:419;;;:::o;16635:180::-;16683:77;16680:1;16673:88;16780:4;16777:1;16770:15;16804:4;16801:1;16794:15;16821:114;16903:1;16896:5;16893:12;16883:46;;16909:18;;:::i;:::-;16883:46;16821:114;:::o;16941:129::-;16987:7;17016:5;17005:16;;17022:42;17058:5;17022:42;:::i;:::-;16941:129;;;:::o;17076:::-;17133:9;17166:33;17193:5;17166:33;:::i;:::-;17153:46;;17076:129;;;:::o;17211:145::-;17305:44;17343:5;17305:44;:::i;:::-;17300:3;17293:57;17211:145;;:::o;17362:456::-;17518:4;17556:2;17545:9;17541:18;17533:26;;17569:71;17637:1;17626:9;17622:17;17613:6;17569:71;:::i;:::-;17650:72;17718:2;17707:9;17703:18;17694:6;17650:72;:::i;:::-;17732:79;17807:2;17796:9;17792:18;17783:6;17732:79;:::i;:::-;17362:456;;;;;;:::o;17824:143::-;17881:5;17912:6;17906:13;17897:22;;17928:33;17955:5;17928:33;:::i;:::-;17824:143;;;;:::o;17973:351::-;18043:6;18092:2;18080:9;18071:7;18067:23;18063:32;18060:119;;;18098:79;;:::i;:::-;18060:119;18218:1;18243:64;18299:7;18290:6;18279:9;18275:22;18243:64;:::i;:::-;18233:74;;18189:128;17973:351;;;;:::o;18330:182::-;18470:34;18466:1;18458:6;18454:14;18447:58;18330:182;:::o;18518:366::-;18660:3;18681:67;18745:2;18740:3;18681:67;:::i;:::-;18674:74;;18757:93;18846:3;18757:93;:::i;:::-;18875:2;18870:3;18866:12;18859:19;;18518:366;;;:::o;18890:419::-;19056:4;19094:2;19083:9;19079:18;19071:26;;19143:9;19137:4;19133:20;19129:1;19118:9;19114:17;19107:47;19171:131;19297:4;19171:131;:::i;:::-;19163:139;;18890:419;;;:::o;19315:442::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19515:71;19583:1;19572:9;19568:17;19559:6;19515:71;:::i;:::-;19596:72;19664:2;19653:9;19649:18;19640:6;19596:72;:::i;:::-;19678;19746:2;19735:9;19731:18;19722:6;19678:72;:::i;:::-;19315:442;;;;;;:::o;19763:180::-;19811:77;19808:1;19801:88;19908:4;19905:1;19898:15;19932:4;19929:1;19922:15;19949:233;19988:3;20011:24;20029:5;20011:24;:::i;:::-;20002:33;;20057:66;20050:5;20047:77;20044:103;;20127:18;;:::i;:::-;20044:103;20174:1;20167:5;20163:13;20156:20;;19949:233;;;:::o;20188:174::-;20328:26;20324:1;20316:6;20312:14;20305:50;20188:174;:::o;20368:366::-;20510:3;20531:67;20595:2;20590:3;20531:67;:::i;:::-;20524:74;;20607:93;20696:3;20607:93;:::i;:::-;20725:2;20720:3;20716:12;20709:19;;20368:366;;;:::o;20740:419::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20740:419;;;:::o;21165:173::-;21305:25;21301:1;21293:6;21289:14;21282:49;21165:173;:::o;21344:366::-;21486:3;21507:67;21571:2;21566:3;21507:67;:::i;:::-;21500:74;;21583:93;21672:3;21583:93;:::i;:::-;21701:2;21696:3;21692:12;21685:19;;21344:366;;;:::o;21716:419::-;21882:4;21920:2;21909:9;21905:18;21897:26;;21969:9;21963:4;21959:20;21955:1;21944:9;21940:17;21933:47;21997:131;22123:4;21997:131;:::i;:::-;21989:139;;21716:419;;;:::o;22141:410::-;22181:7;22204:20;22222:1;22204:20;:::i;:::-;22199:25;;22238:20;22256:1;22238:20;:::i;:::-;22233:25;;22293:1;22290;22286:9;22315:30;22333:11;22315:30;:::i;:::-;22304:41;;22494:1;22485:7;22481:15;22478:1;22475:22;22455:1;22448:9;22428:83;22405:139;;22524:18;;:::i;:::-;22405:139;22189:362;22141:410;;;;:::o;22557:176::-;22697:28;22693:1;22685:6;22681:14;22674:52;22557:176;:::o;22739:366::-;22881:3;22902:67;22966:2;22961:3;22902:67;:::i;:::-;22895:74;;22978:93;23067:3;22978:93;:::i;:::-;23096:2;23091:3;23087:12;23080:19;;22739:366;;;:::o;23111:419::-;23277:4;23315:2;23304:9;23300:18;23292:26;;23364:9;23358:4;23354:20;23350:1;23339:9;23335:17;23328:47;23392:131;23518:4;23392:131;:::i;:::-;23384:139;;23111:419;;;:::o;23536:171::-;23676:23;23672:1;23664:6;23660:14;23653:47;23536:171;:::o;23713:366::-;23855:3;23876:67;23940:2;23935:3;23876:67;:::i;:::-;23869:74;;23952:93;24041:3;23952:93;:::i;:::-;24070:2;24065:3;24061:12;24054:19;;23713:366;;;:::o;24085:419::-;24251:4;24289:2;24278:9;24274:18;24266:26;;24338:9;24332:4;24328:20;24324:1;24313:9;24309:17;24302:47;24366:131;24492:4;24366:131;:::i;:::-;24358:139;;24085:419;;;:::o;24510:173::-;24650:25;24646:1;24638:6;24634:14;24627:49;24510:173;:::o;24689:366::-;24831:3;24852:67;24916:2;24911:3;24852:67;:::i;:::-;24845:74;;24928:93;25017:3;24928:93;:::i;:::-;25046:2;25041:3;25037:12;25030:19;;24689:366;;;:::o;25061:419::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25061:419;;;:::o;25486:168::-;25626:20;25622:1;25614:6;25610:14;25603:44;25486:168;:::o;25660:366::-;25802:3;25823:67;25887:2;25882:3;25823:67;:::i;:::-;25816:74;;25899:93;25988:3;25899:93;:::i;:::-;26017:2;26012:3;26008:12;26001:19;;25660:366;;;:::o;26032:419::-;26198:4;26236:2;26225:9;26221:18;26213:26;;26285:9;26279:4;26275:20;26271:1;26260:9;26256:17;26249:47;26313:131;26439:4;26313:131;:::i;:::-;26305:139;;26032:419;;;:::o;26457:175::-;26597:27;26593:1;26585:6;26581:14;26574:51;26457:175;:::o;26638:366::-;26780:3;26801:67;26865:2;26860:3;26801:67;:::i;:::-;26794:74;;26877:93;26966:3;26877:93;:::i;:::-;26995:2;26990:3;26986:12;26979:19;;26638:366;;;:::o;27010:419::-;27176:4;27214:2;27203:9;27199:18;27191:26;;27263:9;27257:4;27253:20;27249:1;27238:9;27234:17;27227:47;27291:131;27417:4;27291:131;:::i;:::-;27283:139;;27010:419;;;:::o;27435:312::-;27575:34;27571:1;27563:6;27559:14;27552:58;27644:34;27639:2;27631:6;27627:15;27620:59;27713:26;27708:2;27700:6;27696:15;27689:51;27435:312;:::o;27753:366::-;27895:3;27916:67;27980:2;27975:3;27916:67;:::i;:::-;27909:74;;27992:93;28081:3;27992:93;:::i;:::-;28110:2;28105:3;28101:12;28094:19;;27753:366;;;:::o;28125:419::-;28291:4;28329:2;28318:9;28314:18;28306:26;;28378:9;28372:4;28368:20;28364:1;28353:9;28349:17;28342:47;28406:131;28532:4;28406:131;:::i;:::-;28398:139;;28125:419;;;:::o;28550:169::-;28690:21;28686:1;28678:6;28674:14;28667:45;28550:169;:::o;28725:366::-;28867:3;28888:67;28952:2;28947:3;28888:67;:::i;:::-;28881:74;;28964:93;29053:3;28964:93;:::i;:::-;29082:2;29077:3;29073:12;29066:19;;28725:366;;;:::o;29097:419::-;29263:4;29301:2;29290:9;29286:18;29278:26;;29350:9;29344:4;29340:20;29336:1;29325:9;29321:17;29314:47;29378:131;29504:4;29378:131;:::i;:::-;29370:139;;29097:419;;;:::o;29522:177::-;29662:29;29658:1;29650:6;29646:14;29639:53;29522:177;:::o;29705:366::-;29847:3;29868:67;29932:2;29927:3;29868:67;:::i;:::-;29861:74;;29944:93;30033:3;29944:93;:::i;:::-;30062:2;30057:3;30053:12;30046:19;;29705:366;;;:::o;30077:419::-;30243:4;30281:2;30270:9;30266:18;30258:26;;30330:9;30324:4;30320:20;30316:1;30305:9;30301:17;30294:47;30358:131;30484:4;30358:131;:::i;:::-;30350:139;;30077:419;;;:::o;30502:225::-;30642:34;30638:1;30630:6;30626:14;30619:58;30711:8;30706:2;30698:6;30694:15;30687:33;30502:225;:::o;30733:366::-;30875:3;30896:67;30960:2;30955:3;30896:67;:::i;:::-;30889:74;;30972:93;31061:3;30972:93;:::i;:::-;31090:2;31085:3;31081:12;31074:19;;30733:366;;;:::o;31105:419::-;31271:4;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31105:419;;;:::o;31530:171::-;31670:23;31666:1;31658:6;31654:14;31647:47;31530:171;:::o;31707:366::-;31849:3;31870:67;31934:2;31929:3;31870:67;:::i;:::-;31863:74;;31946:93;32035:3;31946:93;:::i;:::-;32064:2;32059:3;32055:12;32048:19;;31707:366;;;:::o;32079:419::-;32245:4;32283:2;32272:9;32268:18;32260:26;;32332:9;32326:4;32322:20;32318:1;32307:9;32303:17;32296:47;32360:131;32486:4;32360:131;:::i;:::-;32352:139;;32079:419;;;:::o;32504:179::-;32644:31;32640:1;32632:6;32628:14;32621:55;32504:179;:::o;32689:366::-;32831:3;32852:67;32916:2;32911:3;32852:67;:::i;:::-;32845:74;;32928:93;33017:3;32928:93;:::i;:::-;33046:2;33041:3;33037:12;33030:19;;32689:366;;;:::o;33061:419::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33314:9;33308:4;33304:20;33300:1;33289:9;33285:17;33278:47;33342:131;33468:4;33342:131;:::i;:::-;33334:139;;33061:419;;;:::o;33486:194::-;33526:4;33546:20;33564:1;33546:20;:::i;:::-;33541:25;;33580:20;33598:1;33580:20;:::i;:::-;33575:25;;33624:1;33621;33617:9;33609:17;;33648:1;33642:4;33639:11;33636:37;;;33653:18;;:::i;:::-;33636:37;33486:194;;;;:::o;33686:180::-;33734:77;33731:1;33724:88;33831:4;33828:1;33821:15;33855:4;33852:1;33845:15;33872:185;33912:1;33929:20;33947:1;33929:20;:::i;:::-;33924:25;;33963:20;33981:1;33963:20;:::i;:::-;33958:25;;34002:1;33992:35;;34007:18;;:::i;:::-;33992:35;34049:1;34046;34042:9;34037:14;;33872:185;;;;:::o;34063:182::-;34203:34;34199:1;34191:6;34187:14;34180:58;34063:182;:::o;34251:366::-;34393:3;34414:67;34478:2;34473:3;34414:67;:::i;:::-;34407:74;;34490:93;34579:3;34490:93;:::i;:::-;34608:2;34603:3;34599:12;34592:19;;34251:366;;;:::o;34623:419::-;34789:4;34827:2;34816:9;34812:18;34804:26;;34876:9;34870:4;34866:20;34862:1;34851:9;34847:17;34840:47;34904:131;35030:4;34904:131;:::i;:::-;34896:139;;34623:419;;;:::o;35048:332::-;35169:4;35207:2;35196:9;35192:18;35184:26;;35220:71;35288:1;35277:9;35273:17;35264:6;35220:71;:::i;:::-;35301:72;35369:2;35358:9;35354:18;35345:6;35301:72;:::i;:::-;35048:332;;;;;:::o;35386:166::-;35526:18;35522:1;35514:6;35510:14;35503:42;35386:166;:::o;35558:366::-;35700:3;35721:67;35785:2;35780:3;35721:67;:::i;:::-;35714:74;;35797:93;35886:3;35797:93;:::i;:::-;35915:2;35910:3;35906:12;35899:19;;35558:366;;;:::o;35930:419::-;36096:4;36134:2;36123:9;36119:18;36111:26;;36183:9;36177:4;36173:20;36169:1;36158:9;36154:17;36147:47;36211:131;36337:4;36211:131;:::i;:::-;36203:139;;35930:419;;;:::o;36355:116::-;36425:21;36440:5;36425:21;:::i;:::-;36418:5;36415:32;36405:60;;36461:1;36458;36451:12;36405:60;36355:116;:::o;36477:137::-;36531:5;36562:6;36556:13;36547:22;;36578:30;36602:5;36578:30;:::i;:::-;36477:137;;;;:::o;36620:345::-;36687:6;36736:2;36724:9;36715:7;36711:23;36707:32;36704:119;;;36742:79;;:::i;:::-;36704:119;36862:1;36887:61;36940:7;36931:6;36920:9;36916:22;36887:61;:::i;:::-;36877:71;;36833:125;36620:345;;;;:::o;36971:229::-;37111:34;37107:1;37099:6;37095:14;37088:58;37180:12;37175:2;37167:6;37163:15;37156:37;36971:229;:::o;37206:366::-;37348:3;37369:67;37433:2;37428:3;37369:67;:::i;:::-;37362:74;;37445:93;37534:3;37445:93;:::i;:::-;37563:2;37558:3;37554:12;37547:19;;37206:366;;;:::o;37578:419::-;37744:4;37782:2;37771:9;37767:18;37759:26;;37831:9;37825:4;37821:20;37817:1;37806:9;37802:17;37795:47;37859:131;37985:4;37859:131;:::i;:::-;37851:139;;37578:419;;;:::o;38003:170::-;38143:22;38139:1;38131:6;38127:14;38120:46;38003:170;:::o;38179:366::-;38321:3;38342:67;38406:2;38401:3;38342:67;:::i;:::-;38335:74;;38418:93;38507:3;38418:93;:::i;:::-;38536:2;38531:3;38527:12;38520:19;;38179:366;;;:::o;38551:419::-;38717:4;38755:2;38744:9;38740:18;38732:26;;38804:9;38798:4;38794:20;38790:1;38779:9;38775:17;38768:47;38832:131;38958:4;38832:131;:::i;:::-;38824:139;;38551:419;;;:::o;38976:225::-;39116:34;39112:1;39104:6;39100:14;39093:58;39185:8;39180:2;39172:6;39168:15;39161:33;38976:225;:::o;39207:366::-;39349:3;39370:67;39434:2;39429:3;39370:67;:::i;:::-;39363:74;;39446:93;39535:3;39446:93;:::i;:::-;39564:2;39559:3;39555:12;39548:19;;39207:366;;;:::o;39579:419::-;39745:4;39783:2;39772:9;39768:18;39760:26;;39832:9;39826:4;39822:20;39818:1;39807:9;39803:17;39796:47;39860:131;39986:4;39860:131;:::i;:::-;39852:139;;39579:419;;;:::o;40004:179::-;40144:31;40140:1;40132:6;40128:14;40121:55;40004:179;:::o;40189:366::-;40331:3;40352:67;40416:2;40411:3;40352:67;:::i;:::-;40345:74;;40428:93;40517:3;40428:93;:::i;:::-;40546:2;40541:3;40537:12;40530:19;;40189:366;;;:::o;40561:419::-;40727:4;40765:2;40754:9;40750:18;40742:26;;40814:9;40808:4;40804:20;40800:1;40789:9;40785:17;40778:47;40842:131;40968:4;40842:131;:::i;:::-;40834:139;;40561:419;;;:::o;40986:98::-;41037:6;41071:5;41065:12;41055:22;;40986:98;;;:::o;41090:147::-;41191:11;41228:3;41213:18;;41090:147;;;;:::o;41243:246::-;41324:1;41334:113;41348:6;41345:1;41342:13;41334:113;;;41433:1;41428:3;41424:11;41418:18;41414:1;41409:3;41405:11;41398:39;41370:2;41367:1;41363:10;41358:15;;41334:113;;;41481:1;41472:6;41467:3;41463:16;41456:27;41305:184;41243:246;;;:::o;41495:386::-;41599:3;41627:38;41659:5;41627:38;:::i;:::-;41681:88;41762:6;41757:3;41681:88;:::i;:::-;41674:95;;41778:65;41836:6;41831:3;41824:4;41817:5;41813:16;41778:65;:::i;:::-;41868:6;41863:3;41859:16;41852:23;;41603:278;41495:386;;;;:::o;41887:271::-;42017:3;42039:93;42128:3;42119:6;42039:93;:::i;:::-;42032:100;;42149:3;42142:10;;41887:271;;;;:::o;42164:99::-;42216:6;42250:5;42244:12;42234:22;;42164:99;;;:::o;42269:377::-;42357:3;42385:39;42418:5;42385:39;:::i;:::-;42440:71;42504:6;42499:3;42440:71;:::i;:::-;42433:78;;42520:65;42578:6;42573:3;42566:4;42559:5;42555:16;42520:65;:::i;:::-;42610:29;42632:6;42610:29;:::i;:::-;42605:3;42601:39;42594:46;;42361:285;42269:377;;;;:::o;42652:313::-;42765:4;42803:2;42792:9;42788:18;42780:26;;42852:9;42846:4;42842:20;42838:1;42827:9;42823:17;42816:47;42880:78;42953:4;42944:6;42880:78;:::i;:::-;42872:86;;42652:313;;;;:::o
Swarm Source
ipfs://a93e160243fb03a4998a1dee55a3c67867ffd8155d224e382f17739f8ab07c1f
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.