More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 11,371 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Harvest All Rewa... | 11087338 | 397 days ago | IN | 0 CRO | 2.37046425 | ||||
Harvest All Rewa... | 11050077 | 400 days ago | IN | 0 CRO | 2.25335965 | ||||
Harvest All Rewa... | 7301118 | 645 days ago | IN | 0 CRO | 2.25463506 | ||||
Deposit | 7237484 | 649 days ago | IN | 0 CRO | 0.39032575 | ||||
Harvest All Rewa... | 7194741 | 652 days ago | IN | 0 CRO | 2.25694294 | ||||
Deposit | 7130154 | 656 days ago | IN | 0 CRO | 0.84071017 | ||||
Harvest All Rewa... | 7083064 | 659 days ago | IN | 0 CRO | 2.2728281 | ||||
Harvest | 7014017 | 663 days ago | IN | 0 CRO | 1.50088968 | ||||
Harvest | 7013934 | 663 days ago | IN | 0 CRO | 2.18820811 | ||||
Harvest | 7013689 | 663 days ago | IN | 0 CRO | 1.88322019 | ||||
Harvest All Rewa... | 6990844 | 665 days ago | IN | 0 CRO | 2.60642154 | ||||
Harvest All Rewa... | 6987771 | 665 days ago | IN | 0 CRO | 2.60649824 | ||||
Harvest All Rewa... | 6976303 | 666 days ago | IN | 0 CRO | 2.30189484 | ||||
Harvest All Rewa... | 6966889 | 666 days ago | IN | 0 CRO | 2.77157242 | ||||
Deposit | 6945720 | 668 days ago | IN | 0 CRO | 0.3914187 | ||||
Harvest All Rewa... | 6931050 | 669 days ago | IN | 0 CRO | 2.46750657 | ||||
Withdraw | 6922080 | 669 days ago | IN | 0 CRO | 0.46211867 | ||||
Harvest | 6921973 | 669 days ago | IN | 0 CRO | 1.68012434 | ||||
Harvest All Rewa... | 6904274 | 671 days ago | IN | 0 CRO | 1.0983549 | ||||
Harvest | 6903785 | 671 days ago | IN | 0 CRO | 1.25142658 | ||||
Withdraw | 6903776 | 671 days ago | IN | 0 CRO | 0.4621993 | ||||
Harvest | 6903769 | 671 days ago | IN | 0 CRO | 2.16694273 | ||||
Withdraw | 6903756 | 671 days ago | IN | 0 CRO | 0.46214162 | ||||
Deposit | 6897997 | 671 days ago | IN | 0 CRO | 0.39165525 | ||||
Harvest All Rewa... | 6896814 | 671 days ago | IN | 0 CRO | 2.58218064 |
Loading...
Loading
Contract Name:
SaharaDaoChef
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-06-10 */ // SPDX-License-Identifier: MIT // 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 v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/interfaces/ISaharaDaoStaking.sol pragma solidity 0.8.4; interface ISaharaDaoStaking { function addReward(address rewardsToken, address distributor) external; function mint(address user, uint256 amount) external; function notifyRewardAmount(address rewardsToken, uint256 reward) external; } // File contracts/interfaces/IRewarder.sol pragma solidity 0.8.4; interface IRewarder { function onReward( uint256 pid, address user, address recipient, uint256 rewardAmount, uint256 newLpAmount ) external; function pendingTokens( uint256 pid, address user, uint256 rewardAmount ) external view returns (IERC20[] memory, uint256[] memory); } // 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 v4.4.1 (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`, 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 be 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File contracts/interfaces/INFTController.sol pragma solidity 0.8.4; interface INFTController { function getBoostRate(address token, uint256 tokenId) external view returns (uint256 boostRate); function isWhitelistedNFT(address token) external view returns (bool); } // File contracts/farms/SaharaDaoChef.sol pragma solidity 0.8.4; contract SaharaDaoChef is Ownable { using SafeERC20 for IERC20; struct UserInfo { uint256 amount; int256 rewardDebt; } struct PoolInfo { uint256 accRewardPerShare; uint256 lastRewardTime; uint256 allocPoint; } struct NFTSlot { address[3] tokenAddress; uint256[3] tokenId; } ISaharaDaoStaking public rewardMinter; /// @notice Info of each MCV2 pool. PoolInfo[] public poolInfo; /// @notice Address of the LP token for each MCV2 pool. IERC20[] public lpToken; /// @notice Address of each `IRewarder` contract in MCV2. IRewarder[] public rewarder; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; uint256 public rewardPerSecond; uint256 private constant ACC_REWARD_PRECISION = 1e12; uint256 private constant MAX_REWARD_PER_SECOND = 10e18; // 10 token per second mapping(address => mapping(uint256 => NFTSlot)) private _depositedNFT; INFTController public controller = INFTController(address(0)); uint256 public nftBoostRate = 100; /* ========== PUBLIC FUNCTIONS ========== */ /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolInfo.length; } /// @notice View function to see pending reward on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending reward for a given user. function pendingReward(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accRewardPerShare = pool.accRewardPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 time = block.timestamp - pool.lastRewardTime; uint256 rewardAmount = (time * rewardPerSecond * pool.allocPoint) / totalAllocPoint; accRewardPerShare += (rewardAmount * ACC_REWARD_PRECISION) / lpSupply; } pending = uint256(int256((user.amount * accRewardPerShare) / ACC_REWARD_PRECISION) - user.rewardDebt); } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.timestamp > pool.lastRewardTime) { uint256 lpSupply = lpToken[pid].balanceOf(address(this)); if (lpSupply > 0) { uint256 time = block.timestamp - pool.lastRewardTime; uint256 rewardAmount = (time * rewardPerSecond * pool.allocPoint) / totalAllocPoint; pool.accRewardPerShare += (rewardAmount * ACC_REWARD_PRECISION) / lpSupply; } pool.lastRewardTime = block.timestamp; poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accRewardPerShare); } } /// @notice Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 len = poolInfo.length; for (uint256 i = 0; i < len; ++i) { updatePool(i); } } /// @notice Deposit LP tokens to MCV2 for reward allocation. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to deposit. /// @param to The receiver of `amount` deposit benefit. function deposit( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects user.amount += amount; user.rewardDebt += int256((amount * pool.accRewardPerShare) / ACC_REWARD_PRECISION); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, to, to, 0, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, pid, amount, to); } /// @notice Withdraw LP tokens from MCV2. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens. function withdraw( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // Effects user.rewardDebt -= int256((amount * pool.accRewardPerShare) / ACC_REWARD_PRECISION); user.amount -= amount; // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, 0, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); } /// @notice Harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedReward = int256((user.amount * pool.accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = uint256(accumulatedReward - user.rewardDebt); // Effects user.rewardDebt = accumulatedReward; // Interactions if (_pendingReward != 0) { rewardMinter.mint(to, _pendingReward); uint256 boost = (_pendingReward * getBoost(msg.sender, pid)) / nftBoostRate; if (boost > 0) rewardMinter.mint(to, boost); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, _pendingReward, user.amount); } emit Harvest(msg.sender, pid, _pendingReward); } /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens and rewards. function withdrawAndHarvest( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedReward = int256((user.amount * pool.accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = uint256(accumulatedReward - user.rewardDebt); // Effects user.rewardDebt = accumulatedReward - int256((amount * pool.accRewardPerShare) / ACC_REWARD_PRECISION); user.amount -= amount; // Interactions if (_pendingReward != 0) { rewardMinter.mint(to, _pendingReward); uint256 boost = (_pendingReward * getBoost(msg.sender, pid)) / nftBoostRate; if (boost > 0) rewardMinter.mint(to, boost); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, _pendingReward, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingReward); } /// @notice Withdraw without caring about rewards. EMERGENCY ONLY. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of the LP tokens. function emergencyWithdraw(uint256 pid, address to) public { UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, 0, 0); } // Note: transfer can fail or succeed if `amount` is zero. lpToken[pid].safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, pid, amount, to); } function harvestAllRewards(address to) external { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { harvest(pid, to); } } /* ========== INTERNAL FUNCTIONS ========== */ function checkPoolDuplicate(IERC20 _lpToken) internal view { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(lpToken[pid] != _lpToken, "add: existing pool?"); } } /* ========== RESTRICTED FUNCTIONS ========== */ /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Address of the rewarder delegate. function add( uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder ) public onlyOwner { checkPoolDuplicate(_lpToken); massUpdatePools(); totalAllocPoint += allocPoint; lpToken.push(_lpToken); rewarder.push(_rewarder); poolInfo.push(PoolInfo({allocPoint: allocPoint, lastRewardTime: block.timestamp, accRewardPerShare: 0})); emit LogPoolAddition(lpToken.length - 1, allocPoint, _lpToken, _rewarder); } /// @notice Update the given pool's reward allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarder Address of the rewarder delegate. /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored. function set( uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite ) public onlyOwner { massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (overwrite) { rewarder[_pid] = _rewarder; } emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite); } /// @notice Sets the reward per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of reward to be distributed per second. function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner { require(_rewardPerSecond <= MAX_REWARD_PER_SECOND, "SaharaDaoChef::setRewardPerSecond: > MAX_REWARD_PER_SECOND"); massUpdatePools(); rewardPerSecond = _rewardPerSecond; emit LogRewardPerSecond(_rewardPerSecond); } /// @notice Set the address of rewardMinter. Can only be called ONCE by the owner. /// @param _rewardMinter Address of MultiFeeDistribution contract function setRewardMinter(ISaharaDaoStaking _rewardMinter) external { require(address(rewardMinter) == address(0), "SaharaDaoChef::setRewardMinter: Cannot redefine rewardMinter"); rewardMinter = _rewardMinter; } function getBoost(address _account, uint256 _pid) public view returns (uint256) { if (address(controller) == address(0)) return 0; NFTSlot memory slot = _depositedNFT[_account][_pid]; uint256 boost = 0; for (uint256 i = 0; i < 3; i++) { boost += controller.getBoostRate(slot.tokenAddress[i], slot.tokenId[i]); } return boost; // boosts from 0% onwards } function getSlots(address _account, uint256 _pid) public view returns ( address, address, address ) { NFTSlot memory slot = _depositedNFT[_account][_pid]; return (slot.tokenAddress[0], slot.tokenAddress[1], slot.tokenAddress[2]); } function getTokenIds(address _account, uint256 _pid) public view returns ( uint256, uint256, uint256 ) { NFTSlot memory slot = _depositedNFT[_account][_pid]; return (slot.tokenId[0], slot.tokenId[1], slot.tokenId[2]); } function depositNFT( address _nft, uint256 _tokenId, uint256 _slotIndex, uint256 _pid ) public { require(controller.isWhitelistedNFT(_nft), "only approved NFTs"); require(IERC721(_nft).ownerOf(_tokenId) == msg.sender, "User does not have the specified NFT"); UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount == 0, "Not allowed to deposit"); IERC721(_nft).transferFrom(msg.sender, address(this), _tokenId); NFTSlot memory slot = _depositedNFT[msg.sender][_pid]; require(slot.tokenAddress[_slotIndex] == address(0), "Already deposited this slot"); slot.tokenAddress[_slotIndex] = _nft; slot.tokenId[_slotIndex] = _tokenId; _depositedNFT[msg.sender][_pid] = slot; emit DepositNFT(_nft, _tokenId, _pid); } function withdrawNFT(uint256 _slotIndex, uint256 _pid) public { NFTSlot storage slot = _depositedNFT[msg.sender][_pid]; address _nft = slot.tokenAddress[_slotIndex]; uint256 _tokenId = slot.tokenId[_slotIndex]; require(_nft != address(0), "NFT does not exist"); IERC721(_nft).transferFrom(address(this), msg.sender, _tokenId); slot.tokenAddress[_slotIndex] = address(0); emit WithdrawNFT(_nft, _slotIndex, _pid); } function setNftController(address _controller) public onlyOwner { controller = INFTController(_controller); emit UpdateNFTController(msg.sender, _controller); } function setNftBoostRate(uint256 _rate) public onlyOwner { require(_rate >= 100, "boost must be within range"); nftBoostRate = _rate; emit UpdateNFTBoostRate(msg.sender, _rate); } /* =============== EVENTS ==================== */ event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder); event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite); event LogUpdatePool(uint256 indexed pid, uint256 lastRewardTime, uint256 lpSupply, uint256 accRewardPerShare); event LogRewardPerSecond(uint256 rewardPerSecond); event DepositNFT(address _nft, uint256 _tokenId, uint256 _pid); event WithdrawNFT(address _nft, uint256 _tokenId, uint256 _pid); event UpdateNFTController(address indexed user, address controller); event UpdateNFTBoostRate(address indexed user, uint256 controller); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"DepositNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"controller","type":"uint256"}],"name":"UpdateNFTBoostRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"controller","type":"address"}],"name":"UpdateNFTController","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"WithdrawNFT","type":"event"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract INFTController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_slotIndex","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"depositNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getSlots","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"harvestAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftBoostRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardMinter","outputs":[{"internalType":"contract ISaharaDaoStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarder","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setNftBoostRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setNftController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISaharaDaoStaking","name":"_rewardMinter","type":"address"}],"name":"setRewardMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"}],"internalType":"struct SaharaDaoChef.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slotIndex","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600655600980546001600160a01b03191690556064600a5534801561002a57600080fd5b5061003433610039565b610089565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d0780620000996000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806388bba42f1161011a578063ab7de098116100ad578063e0283faf1161007c578063e0283faf146104a1578063e5438097146104aa578063f2fde38b146104bd578063f77c4791146104d0578063fbe6cf6a146104e357600080fd5b8063ab7de09814610455578063b779e98714610468578063c346253d1461047b578063d1abb9071461048e57600080fd5b806393f1a40b116100e957806393f1a40b146103d557806398969e821461041c5780639b8e55631461042f578063a7a0b84a1461044257600080fd5b806388bba42f146103955780638da5cb5b146103a85780638dbdbe6d146103b95780638f10369a146103cc57600080fd5b80633b1e3eb811610192578063630b5ba111610161578063630b5ba11461034757806366da58151461034f578063715018a61461036257806378ed5d1f1461036a57600080fd5b80633b1e3eb8146102d957806345b373d3146102ec57806351eb05a6146102ff578063570d2f201461033457600080fd5b806317caf6f1116101ce57806317caf6f11461029757806318fccc76146102a05780632f940c70146102b35780633a0196af146102c657600080fd5b80630695dc5614610200578063081e3eda146102425780630ad58d2f146102545780631526fe2714610269575b600080fd5b61021361020e3660046128f8565b6104f6565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b6002545b604051908152602001610239565b610267610262366004612a3a565b6105bc565b005b61027c610277366004612979565b610775565b60408051938452602084019290925290820152606001610239565b61024660065481565b6102676102ae3660046129a9565b6107a8565b6102676102c13660046129a9565b6109f4565b6102676102d4366004612a19565b610b3f565b6102676102e7366004612979565b610cf0565b6102466102fa3660046128f8565b610da9565b61031261030d366004612979565b610f77565b6040805182518152602080840151908201529181015190820152606001610239565b61027c6103423660046128f8565b6111bb565b610267611276565b61026761035d366004612979565b6112a2565b61026761138d565b61037d610378366004612979565b6113c3565b6040516001600160a01b039091168152602001610239565b6102676103a3366004612a67565b6113ed565b6000546001600160a01b031661037d565b6102676103c7366004612a3a565b611594565b61024660075481565b6104076103e33660046129a9565b60056020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610239565b61024661042a3660046129a9565b611745565b60015461037d906001600160a01b031681565b6102676104503660046128c0565b611921565b6102676104633660046129d8565b6119c2565b610267610476366004612923565b611b80565b61037d610489366004612979565b611ffb565b61026761049c366004612a3a565b61200b565b610246600a5481565b6102676104b83660046128c0565b61230b565b6102676104cb3660046128c0565b612385565b60095461037d906001600160a01b031681565b6102676104f13660046128c0565b612420565b6001600160a01b0382166000908152600860209081526040808320848452909152808220815160a08101835283928392839291829081018260038282826020028201915b81546001600160a01b0316815260019091019060200180831161053a5750505091835250506040805160608101918290526020909201919060038481019182845b81548152602001906001019080831161057b5750505091909252505081518051602082015193945092915060025b6020020151935093509350509250925092565b60006105c784610f77565b6000858152600560209081526040808320338452909152902081519192509064e8d4a51000906105f79086612bdc565b6106019190612bbc565b8160010160008282546106149190612bfb565b909155505080548490829060009061062d908490612c3a565b9250508190555060006004868154811061065757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156106dd5781546040516344af0fa760e01b81526001600160a01b038316916344af0fa7916106aa918a9133918a9160009190600401612b34565b600060405180830381600087803b1580156106c457600080fd5b505af11580156106d8573d6000803e3d6000fd5b505050505b61071f84866003898154811061070357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316919061244d565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328860405161076591815260200190565b60405180910390a4505050505050565b6002818154811061078557600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60006107b383610f77565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a51000916107e591612bdc565b6107ef9190612bbc565b905060008260010154826108039190612bfb565b600184018390559050801561090c576001546040516340c10f1960e01b81526001600160a01b03878116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506000600a546108873389610da9565b6108919084612bdc565b61089b9190612bbc565b9050801561090a576001546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050505b505b60006004878154811061092f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156109b45783546040516344af0fa760e01b81526001600160a01b038316916344af0fa791610981918b9133918c91899190600401612b34565b600060405180830381600087803b15801561099b57600080fd5b505af11580156109af573d6000803e3d6000fd5b505050505b604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a350505050505050565b60008281526005602090815260408083203384529091528120805482825560018201839055600480549293919286908110610a3f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690508015610ac4576040516344af0fa760e01b81526001600160a01b038216906344af0fa790610a91908890339089906000908190600401612b34565b600060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050505b610aea84836003888154811061070357634e487b7160e01b600052603260045260246000fd5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610b3091815260200190565b60405180910390a45050505050565b336000908152600860209081526040808320848452909152812090818460038110610b7a57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03169050600060038084019086908110610bad57634e487b7160e01b600052603260045260246000fd5b015490506001600160a01b038216610c015760405162461bcd60e51b815260206004820152601260248201527113919508191bd95cc81b9bdd08195e1a5cdd60721b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b505050506000836000018660038110610c8c57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b039283161790556040805191841682526020820187905281018590527f72669f1abc5c863b907b781db14a7bab022278d6436116140679c6bca956ba0c9060600160405180910390a15050505050565b6000546001600160a01b03163314610d1a5760405162461bcd60e51b8152600401610bf890612aff565b6064811015610d6b5760405162461bcd60e51b815260206004820152601a60248201527f626f6f7374206d7573742062652077697468696e2072616e67650000000000006044820152606401610bf8565b600a81905560405181815233907f7e10cb5e85e8940bf0ce60fffe269453dc77c2580950f4fecea7e42b5bb61a7b906020015b60405180910390a250565b6009546000906001600160a01b0316610dc457506000610f71565b6001600160a01b0383166000908152600860209081526040808320858452909152808220815160a08101835291829081018260038282826020028201915b81546001600160a01b03168152600190910190602001808311610e025750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311610e435750505050508152505090506000805b6003811015610f6c5760095483516001600160a01b039091169063a45d5039908360038110610ea457634e487b7160e01b600052603260045260246000fd5b602002015185602001518460038110610ecd57634e487b7160e01b600052603260045260246000fd5b60200201516040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b158015610f1657600080fd5b505afa158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e9190612991565b610f589083612ba4565b915080610f6481612c7d565b915050610e65565b509150505b92915050565b610f9b60405180606001604052806000815260200160008152602001600081525090565b60028281548110610fbc57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516060810182526003909302909101805483526001810154938301849052600201549082015291504211156111b65760006003838154811061101c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561106857600080fd5b505afa15801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190612991565b905080156111195760008260200151426110ba9190612c3a565b905060006006548460400151600754846110d49190612bdc565b6110de9190612bdc565b6110e89190612bbc565b9050826110fa64e8d4a5100083612bdc565b6111049190612bbc565b84518590611113908390612ba4565b90525050505b426020830152600280548391908590811061114457634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516003929092020190815582820151600182015560409283015160029091015583810151845183519182529181018490529182015283907fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d29060600160405180910390a2505b919050565b6001600160a01b0382166000908152600860209081526040808320848452909152808220815160a08101835283928392839291829081018260038282826020028201915b81546001600160a01b031681526001909101906020018083116111ff5750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311611240575050509190925250505060208181015180519181015192935090919060026105a9565b60025460005b8181101561129e5761128d81610f77565b5061129781612c7d565b905061127c565b5050565b6000546001600160a01b031633146112cc5760405162461bcd60e51b8152600401610bf890612aff565b678ac7230489e8000081111561134a5760405162461bcd60e51b815260206004820152603a60248201527f53616861726144616f436865663a3a7365745265776172645065725365636f6e60448201527f643a203e204d41585f5245574152445f5045525f5345434f4e440000000000006064820152608401610bf8565b611352611276565b60078190556040518181527fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a2789060200160405180910390a150565b6000546001600160a01b031633146113b75760405162461bcd60e51b8152600401610bf890612aff565b6113c160006124b0565b565b600381815481106113d357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146114175760405162461bcd60e51b8152600401610bf890612aff565b61141f611276565b826002858154811061144157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201546006546114609190612c3a565b61146a9190612ba4565b600681905550826002858154811061149257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002018190555080156114fe5781600485815481106114cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8061153e576004848154811061152457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611540565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516115869291909182521515602082015260400190565b60405180910390a350505050565b600061159f84610f77565b60008581526005602090815260408083206001600160a01b03871684529091528120805492935091859183916115d6908490612ba4565b9091555050815164e8d4a51000906115ee9086612bdc565b6115f89190612bbc565b81600101600082825461160b9190612b63565b9250508190555060006004868154811061163557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156116bb5781546040516344af0fa760e01b81526001600160a01b038316916344af0fa791611688918a918991829160009190600401612b34565b600060405180830381600087803b1580156116a257600080fd5b505af11580156116b6573d6000803e3d6000fd5b505050505b6116ff33308760038a815481106116e257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316929190612500565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478860405161076591815260200190565b6000806002848154811061176957634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516060810182526003948502909201805483526001810154838501526002015482820152888552600583528085206001600160a01b038916865290925290832081518354929550909390929091889081106117e157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561182d57600080fd5b505afa158015611841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118659190612991565b905083602001514211801561187957508015155b156118e95760008460200151426118909190612c3a565b905060006006548660400151600754846118aa9190612bdc565b6118b49190612bdc565b6118be9190612bbc565b9050826118d064e8d4a5100083612bdc565b6118da9190612bbc565b6118e49085612ba4565b935050505b6001830154835464e8d4a5100090611902908590612bdc565b61190c9190612bbc565b6119169190612bfb565b979650505050505050565b6001546001600160a01b0316156119a05760405162461bcd60e51b815260206004820152603c60248201527f53616861726144616f436865663a3a7365745265776172644d696e7465723a2060448201527f43616e6e6f74207265646566696e65207265776172644d696e746572000000006064820152608401610bf8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119ec5760405162461bcd60e51b8152600401610bf890612aff565b6119f58261253e565b6119fd611276565b8260066000828254611a0f9190612ba4565b909155505060038054600181810183557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b038087166001600160a01b03199283168117909355600480548086019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805491871691909216811790915560408051606081018252600080825242602083019081529282018a8152600280548089018255925291519087027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf830155517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09091015592549091611b4891612c3a565b6040518681527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a4505050565b6009546040516302716e6760e31b81526001600160a01b0386811660048301529091169063138b73389060240160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd919061295d565b611c3e5760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920617070726f766564204e46547360701b6044820152606401610bf8565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e9060240160206040518083038186803b158015611c8057600080fd5b505afa158015611c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb891906128dc565b6001600160a01b031614611d1a5760405162461bcd60e51b8152602060048201526024808201527f5573657220646f6573206e6f74206861766520746865207370656369666965646044820152630813919560e21b6064820152608401610bf8565b60008181526005602090815260408083203384529091529020805415611d7b5760405162461bcd60e51b8152602060048201526016602482015275139bdd08185b1b1bddd959081d1bc819195c1bdcda5d60521b6044820152606401610bf8565b6040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b038616906323b872dd90606401600060405180830381600087803b158015611dc957600080fd5b505af1158015611ddd573d6000803e3d6000fd5b5050336000908152600860209081526040808320878452909152808220815160a081018084529395509350918391820190839060039082845b81546001600160a01b03168152600190910190602001808311611e165750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311611e5757505050505081525050905060006001600160a01b031681600001518560038110611ea457634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b031614611eff5760405162461bcd60e51b815260206004820152601b60248201527f416c7265616479206465706f7369746564207468697320736c6f7400000000006044820152606401610bf8565b805186908560038110611f2257634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091015281015185908560038110611f5b57634e487b7160e01b600052603260045260246000fd5b60209081029190910191909152336000908152600882526040808220868352909252208151829190611f909082906003612825565b506020820151611fa6906003808401919061287d565b5050604080516001600160a01b0389168152602081018890529081018590527f2c6e00d05c9537687e3346c6bb423b06c873979206b8d425ddbb4f9b436e0582915060600160405180910390a1505050505050565b600481815481106113d357600080fd5b600061201684610f77565b6000858152600560209081526040808320338452909152812082518154939450909264e8d4a510009161204891612bdc565b6120529190612bbc565b905060008260010154826120669190612bfb565b845190915064e8d4a510009061207c9088612bdc565b6120869190612bbc565b6120909083612bfb565b60018401558254869084906000906120a9908490612c3a565b909155505080156121ae576001546040516340c10f1960e01b81526001600160a01b03878116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561210257600080fd5b505af1158015612116573d6000803e3d6000fd5b505050506000600a54612129338a610da9565b6121339084612bdc565b61213d9190612bbc565b905080156121ac576001546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561219357600080fd5b505af11580156121a7573d6000803e3d6000fd5b505050505b505b6000600488815481106121d157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156122565783546040516344af0fa760e01b81526001600160a01b038316916344af0fa791612223918c9133918c91899190600401612b34565b600060405180830381600087803b15801561223d57600080fd5b505af1158015612251573d6000803e3d6000fd5b505050505b61227c868860038b8154811061070357634e487b7160e01b600052603260045260246000fd5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516122c291815260200190565b60405180910390a4604051828152889033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a35050505050505050565b6000546001600160a01b031633146123355760405162461bcd60e51b8152600401610bf890612aff565b600980546001600160a01b0319166001600160a01b03831690811790915560405190815233907ffc9ae9e2d54c8ba3ae37c8a337ab3650824f22456385a15a268e231f4849437090602001610d9e565b6000546001600160a01b031633146123af5760405162461bcd60e51b8152600401610bf890612aff565b6001600160a01b0381166124145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf8565b61241d816124b0565b50565b60025460005b818110156124485761243881846107a8565b61244181612c7d565b9050612426565b505050565b6040516001600160a01b03831660248201526044810182905261244890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125e0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526125389085906323b872dd60e01b90608401612479565b50505050565b60025460005b8181101561244857826001600160a01b03166003828154811061257757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156125d05760405162461bcd60e51b81526020600482015260136024820152726164643a206578697374696e6720706f6f6c3f60681b6044820152606401610bf8565b6125d981612c7d565b9050612544565b6000612635826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126b29092919063ffffffff16565b8051909150156124485780806020019051810190612653919061295d565b6124485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf8565b60606126c184846000856126cb565b90505b9392505050565b60608247101561272c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf8565b6001600160a01b0385163b6127835760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf8565b600080866001600160a01b0316858760405161279f9190612ab0565b60006040518083038185875af1925050503d80600081146127dc576040519150601f19603f3d011682016040523d82523d6000602084013e6127e1565b606091505b5091509150611916828286606083156127fb5750816126c4565b82511561280b5782518084602001fd5b8160405162461bcd60e51b8152600401610bf89190612acc565b826003810192821561286d579160200282015b8281111561286d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612838565b506128799291506128ab565b5090565b826003810192821561286d579160200282015b8281111561286d578251825591602001919060010190612890565b5b8082111561287957600081556001016128ac565b6000602082840312156128d1578081fd5b81356126c481612cae565b6000602082840312156128ed578081fd5b81516126c481612cae565b6000806040838503121561290a578081fd5b823561291581612cae565b946020939093013593505050565b60008060008060808587031215612938578182fd5b843561294381612cae565b966020860135965060408601359560600135945092505050565b60006020828403121561296e578081fd5b81516126c481612cc3565b60006020828403121561298a578081fd5b5035919050565b6000602082840312156129a2578081fd5b5051919050565b600080604083850312156129bb578182fd5b8235915060208301356129cd81612cae565b809150509250929050565b6000806000606084860312156129ec578283fd5b8335925060208401356129fe81612cae565b91506040840135612a0e81612cae565b809150509250925092565b60008060408385031215612a2b578182fd5b50508035926020909101359150565b600080600060608486031215612a4e578283fd5b83359250602084013591506040840135612a0e81612cae565b60008060008060808587031215612a7c578384fd5b84359350602085013592506040850135612a9581612cae565b91506060850135612aa581612cc3565b939692955090935050565b60008251612ac2818460208701612c51565b9190910192915050565b6020815260008251806020840152612aeb816040850160208701612c51565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b600080821280156001600160ff1b0384900385131615612b8557612b85612c98565b600160ff1b8390038412811615612b9e57612b9e612c98565b50500190565b60008219821115612bb757612bb7612c98565b500190565b600082612bd757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612bf657612bf6612c98565b500290565b60008083128015600160ff1b850184121615612c1957612c19612c98565b6001600160ff1b0384018313811615612c3457612c34612c98565b50500390565b600082821015612c4c57612c4c612c98565b500390565b60005b83811015612c6c578181015183820152602001612c54565b838111156125385750506000910152565b6000600019821415612c9157612c91612c98565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461241d57600080fd5b801515811461241d57600080fdfea2646970667358221220c0d7c16877e981c00c3caf98ebb62e6a79e3df9a9899ba702a44ce791575c40064736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806388bba42f1161011a578063ab7de098116100ad578063e0283faf1161007c578063e0283faf146104a1578063e5438097146104aa578063f2fde38b146104bd578063f77c4791146104d0578063fbe6cf6a146104e357600080fd5b8063ab7de09814610455578063b779e98714610468578063c346253d1461047b578063d1abb9071461048e57600080fd5b806393f1a40b116100e957806393f1a40b146103d557806398969e821461041c5780639b8e55631461042f578063a7a0b84a1461044257600080fd5b806388bba42f146103955780638da5cb5b146103a85780638dbdbe6d146103b95780638f10369a146103cc57600080fd5b80633b1e3eb811610192578063630b5ba111610161578063630b5ba11461034757806366da58151461034f578063715018a61461036257806378ed5d1f1461036a57600080fd5b80633b1e3eb8146102d957806345b373d3146102ec57806351eb05a6146102ff578063570d2f201461033457600080fd5b806317caf6f1116101ce57806317caf6f11461029757806318fccc76146102a05780632f940c70146102b35780633a0196af146102c657600080fd5b80630695dc5614610200578063081e3eda146102425780630ad58d2f146102545780631526fe2714610269575b600080fd5b61021361020e3660046128f8565b6104f6565b604080516001600160a01b03948516815292841660208401529216918101919091526060015b60405180910390f35b6002545b604051908152602001610239565b610267610262366004612a3a565b6105bc565b005b61027c610277366004612979565b610775565b60408051938452602084019290925290820152606001610239565b61024660065481565b6102676102ae3660046129a9565b6107a8565b6102676102c13660046129a9565b6109f4565b6102676102d4366004612a19565b610b3f565b6102676102e7366004612979565b610cf0565b6102466102fa3660046128f8565b610da9565b61031261030d366004612979565b610f77565b6040805182518152602080840151908201529181015190820152606001610239565b61027c6103423660046128f8565b6111bb565b610267611276565b61026761035d366004612979565b6112a2565b61026761138d565b61037d610378366004612979565b6113c3565b6040516001600160a01b039091168152602001610239565b6102676103a3366004612a67565b6113ed565b6000546001600160a01b031661037d565b6102676103c7366004612a3a565b611594565b61024660075481565b6104076103e33660046129a9565b60056020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610239565b61024661042a3660046129a9565b611745565b60015461037d906001600160a01b031681565b6102676104503660046128c0565b611921565b6102676104633660046129d8565b6119c2565b610267610476366004612923565b611b80565b61037d610489366004612979565b611ffb565b61026761049c366004612a3a565b61200b565b610246600a5481565b6102676104b83660046128c0565b61230b565b6102676104cb3660046128c0565b612385565b60095461037d906001600160a01b031681565b6102676104f13660046128c0565b612420565b6001600160a01b0382166000908152600860209081526040808320848452909152808220815160a08101835283928392839291829081018260038282826020028201915b81546001600160a01b0316815260019091019060200180831161053a5750505091835250506040805160608101918290526020909201919060038481019182845b81548152602001906001019080831161057b5750505091909252505081518051602082015193945092915060025b6020020151935093509350509250925092565b60006105c784610f77565b6000858152600560209081526040808320338452909152902081519192509064e8d4a51000906105f79086612bdc565b6106019190612bbc565b8160010160008282546106149190612bfb565b909155505080548490829060009061062d908490612c3a565b9250508190555060006004868154811061065757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156106dd5781546040516344af0fa760e01b81526001600160a01b038316916344af0fa7916106aa918a9133918a9160009190600401612b34565b600060405180830381600087803b1580156106c457600080fd5b505af11580156106d8573d6000803e3d6000fd5b505050505b61071f84866003898154811061070357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316919061244d565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328860405161076591815260200190565b60405180910390a4505050505050565b6002818154811061078557600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60006107b383610f77565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a51000916107e591612bdc565b6107ef9190612bbc565b905060008260010154826108039190612bfb565b600184018390559050801561090c576001546040516340c10f1960e01b81526001600160a01b03878116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506000600a546108873389610da9565b6108919084612bdc565b61089b9190612bbc565b9050801561090a576001546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050505b505b60006004878154811061092f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156109b45783546040516344af0fa760e01b81526001600160a01b038316916344af0fa791610981918b9133918c91899190600401612b34565b600060405180830381600087803b15801561099b57600080fd5b505af11580156109af573d6000803e3d6000fd5b505050505b604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a350505050505050565b60008281526005602090815260408083203384529091528120805482825560018201839055600480549293919286908110610a3f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690508015610ac4576040516344af0fa760e01b81526001600160a01b038216906344af0fa790610a91908890339089906000908190600401612b34565b600060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050505b610aea84836003888154811061070357634e487b7160e01b600052603260045260246000fd5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610b3091815260200190565b60405180910390a45050505050565b336000908152600860209081526040808320848452909152812090818460038110610b7a57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03169050600060038084019086908110610bad57634e487b7160e01b600052603260045260246000fd5b015490506001600160a01b038216610c015760405162461bcd60e51b815260206004820152601260248201527113919508191bd95cc81b9bdd08195e1a5cdd60721b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b158015610c4f57600080fd5b505af1158015610c63573d6000803e3d6000fd5b505050506000836000018660038110610c8c57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b039283161790556040805191841682526020820187905281018590527f72669f1abc5c863b907b781db14a7bab022278d6436116140679c6bca956ba0c9060600160405180910390a15050505050565b6000546001600160a01b03163314610d1a5760405162461bcd60e51b8152600401610bf890612aff565b6064811015610d6b5760405162461bcd60e51b815260206004820152601a60248201527f626f6f7374206d7573742062652077697468696e2072616e67650000000000006044820152606401610bf8565b600a81905560405181815233907f7e10cb5e85e8940bf0ce60fffe269453dc77c2580950f4fecea7e42b5bb61a7b906020015b60405180910390a250565b6009546000906001600160a01b0316610dc457506000610f71565b6001600160a01b0383166000908152600860209081526040808320858452909152808220815160a08101835291829081018260038282826020028201915b81546001600160a01b03168152600190910190602001808311610e025750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311610e435750505050508152505090506000805b6003811015610f6c5760095483516001600160a01b039091169063a45d5039908360038110610ea457634e487b7160e01b600052603260045260246000fd5b602002015185602001518460038110610ecd57634e487b7160e01b600052603260045260246000fd5b60200201516040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b158015610f1657600080fd5b505afa158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e9190612991565b610f589083612ba4565b915080610f6481612c7d565b915050610e65565b509150505b92915050565b610f9b60405180606001604052806000815260200160008152602001600081525090565b60028281548110610fbc57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516060810182526003909302909101805483526001810154938301849052600201549082015291504211156111b65760006003838154811061101c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561106857600080fd5b505afa15801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190612991565b905080156111195760008260200151426110ba9190612c3a565b905060006006548460400151600754846110d49190612bdc565b6110de9190612bdc565b6110e89190612bbc565b9050826110fa64e8d4a5100083612bdc565b6111049190612bbc565b84518590611113908390612ba4565b90525050505b426020830152600280548391908590811061114457634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516003929092020190815582820151600182015560409283015160029091015583810151845183519182529181018490529182015283907fcb7325664a4a3b7c7223eefc492a97ca4fdf94d46884621e5a8fae5a04b2b9d29060600160405180910390a2505b919050565b6001600160a01b0382166000908152600860209081526040808320848452909152808220815160a08101835283928392839291829081018260038282826020028201915b81546001600160a01b031681526001909101906020018083116111ff5750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311611240575050509190925250505060208181015180519181015192935090919060026105a9565b60025460005b8181101561129e5761128d81610f77565b5061129781612c7d565b905061127c565b5050565b6000546001600160a01b031633146112cc5760405162461bcd60e51b8152600401610bf890612aff565b678ac7230489e8000081111561134a5760405162461bcd60e51b815260206004820152603a60248201527f53616861726144616f436865663a3a7365745265776172645065725365636f6e60448201527f643a203e204d41585f5245574152445f5045525f5345434f4e440000000000006064820152608401610bf8565b611352611276565b60078190556040518181527fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a2789060200160405180910390a150565b6000546001600160a01b031633146113b75760405162461bcd60e51b8152600401610bf890612aff565b6113c160006124b0565b565b600381815481106113d357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146114175760405162461bcd60e51b8152600401610bf890612aff565b61141f611276565b826002858154811061144157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201546006546114609190612c3a565b61146a9190612ba4565b600681905550826002858154811061149257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002018190555080156114fe5781600485815481106114cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8061153e576004848154811061152457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611540565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516115869291909182521515602082015260400190565b60405180910390a350505050565b600061159f84610f77565b60008581526005602090815260408083206001600160a01b03871684529091528120805492935091859183916115d6908490612ba4565b9091555050815164e8d4a51000906115ee9086612bdc565b6115f89190612bbc565b81600101600082825461160b9190612b63565b9250508190555060006004868154811061163557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156116bb5781546040516344af0fa760e01b81526001600160a01b038316916344af0fa791611688918a918991829160009190600401612b34565b600060405180830381600087803b1580156116a257600080fd5b505af11580156116b6573d6000803e3d6000fd5b505050505b6116ff33308760038a815481106116e257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316929190612500565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478860405161076591815260200190565b6000806002848154811061176957634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516060810182526003948502909201805483526001810154838501526002015482820152888552600583528085206001600160a01b038916865290925290832081518354929550909390929091889081106117e157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561182d57600080fd5b505afa158015611841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118659190612991565b905083602001514211801561187957508015155b156118e95760008460200151426118909190612c3a565b905060006006548660400151600754846118aa9190612bdc565b6118b49190612bdc565b6118be9190612bbc565b9050826118d064e8d4a5100083612bdc565b6118da9190612bbc565b6118e49085612ba4565b935050505b6001830154835464e8d4a5100090611902908590612bdc565b61190c9190612bbc565b6119169190612bfb565b979650505050505050565b6001546001600160a01b0316156119a05760405162461bcd60e51b815260206004820152603c60248201527f53616861726144616f436865663a3a7365745265776172644d696e7465723a2060448201527f43616e6e6f74207265646566696e65207265776172644d696e746572000000006064820152608401610bf8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119ec5760405162461bcd60e51b8152600401610bf890612aff565b6119f58261253e565b6119fd611276565b8260066000828254611a0f9190612ba4565b909155505060038054600181810183557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90910180546001600160a01b038087166001600160a01b03199283168117909355600480548086019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805491871691909216811790915560408051606081018252600080825242602083019081529282018a8152600280548089018255925291519087027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81019190915591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf830155517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09091015592549091611b4891612c3a565b6040518681527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a4505050565b6009546040516302716e6760e31b81526001600160a01b0386811660048301529091169063138b73389060240160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd919061295d565b611c3e5760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920617070726f766564204e46547360701b6044820152606401610bf8565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e9060240160206040518083038186803b158015611c8057600080fd5b505afa158015611c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb891906128dc565b6001600160a01b031614611d1a5760405162461bcd60e51b8152602060048201526024808201527f5573657220646f6573206e6f74206861766520746865207370656369666965646044820152630813919560e21b6064820152608401610bf8565b60008181526005602090815260408083203384529091529020805415611d7b5760405162461bcd60e51b8152602060048201526016602482015275139bdd08185b1b1bddd959081d1bc819195c1bdcda5d60521b6044820152606401610bf8565b6040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b038616906323b872dd90606401600060405180830381600087803b158015611dc957600080fd5b505af1158015611ddd573d6000803e3d6000fd5b5050336000908152600860209081526040808320878452909152808220815160a081018084529395509350918391820190839060039082845b81546001600160a01b03168152600190910190602001808311611e165750505091835250506040805160608101918290526020909201919060038481019182845b815481526020019060010190808311611e5757505050505081525050905060006001600160a01b031681600001518560038110611ea457634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b031614611eff5760405162461bcd60e51b815260206004820152601b60248201527f416c7265616479206465706f7369746564207468697320736c6f7400000000006044820152606401610bf8565b805186908560038110611f2257634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091015281015185908560038110611f5b57634e487b7160e01b600052603260045260246000fd5b60209081029190910191909152336000908152600882526040808220868352909252208151829190611f909082906003612825565b506020820151611fa6906003808401919061287d565b5050604080516001600160a01b0389168152602081018890529081018590527f2c6e00d05c9537687e3346c6bb423b06c873979206b8d425ddbb4f9b436e0582915060600160405180910390a1505050505050565b600481815481106113d357600080fd5b600061201684610f77565b6000858152600560209081526040808320338452909152812082518154939450909264e8d4a510009161204891612bdc565b6120529190612bbc565b905060008260010154826120669190612bfb565b845190915064e8d4a510009061207c9088612bdc565b6120869190612bbc565b6120909083612bfb565b60018401558254869084906000906120a9908490612c3a565b909155505080156121ae576001546040516340c10f1960e01b81526001600160a01b03878116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561210257600080fd5b505af1158015612116573d6000803e3d6000fd5b505050506000600a54612129338a610da9565b6121339084612bdc565b61213d9190612bbc565b905080156121ac576001546040516340c10f1960e01b81526001600160a01b03888116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561219357600080fd5b505af11580156121a7573d6000803e3d6000fd5b505050505b505b6000600488815481106121d157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316905080156122565783546040516344af0fa760e01b81526001600160a01b038316916344af0fa791612223918c9133918c91899190600401612b34565b600060405180830381600087803b15801561223d57600080fd5b505af1158015612251573d6000803e3d6000fd5b505050505b61227c868860038b8154811061070357634e487b7160e01b600052603260045260246000fd5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516122c291815260200190565b60405180910390a4604051828152889033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a35050505050505050565b6000546001600160a01b031633146123355760405162461bcd60e51b8152600401610bf890612aff565b600980546001600160a01b0319166001600160a01b03831690811790915560405190815233907ffc9ae9e2d54c8ba3ae37c8a337ab3650824f22456385a15a268e231f4849437090602001610d9e565b6000546001600160a01b031633146123af5760405162461bcd60e51b8152600401610bf890612aff565b6001600160a01b0381166124145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf8565b61241d816124b0565b50565b60025460005b818110156124485761243881846107a8565b61244181612c7d565b9050612426565b505050565b6040516001600160a01b03831660248201526044810182905261244890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526125e0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526125389085906323b872dd60e01b90608401612479565b50505050565b60025460005b8181101561244857826001600160a01b03166003828154811061257757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156125d05760405162461bcd60e51b81526020600482015260136024820152726164643a206578697374696e6720706f6f6c3f60681b6044820152606401610bf8565b6125d981612c7d565b9050612544565b6000612635826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126b29092919063ffffffff16565b8051909150156124485780806020019051810190612653919061295d565b6124485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf8565b60606126c184846000856126cb565b90505b9392505050565b60608247101561272c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf8565b6001600160a01b0385163b6127835760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf8565b600080866001600160a01b0316858760405161279f9190612ab0565b60006040518083038185875af1925050503d80600081146127dc576040519150601f19603f3d011682016040523d82523d6000602084013e6127e1565b606091505b5091509150611916828286606083156127fb5750816126c4565b82511561280b5782518084602001fd5b8160405162461bcd60e51b8152600401610bf89190612acc565b826003810192821561286d579160200282015b8281111561286d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612838565b506128799291506128ab565b5090565b826003810192821561286d579160200282015b8281111561286d578251825591602001919060010190612890565b5b8082111561287957600081556001016128ac565b6000602082840312156128d1578081fd5b81356126c481612cae565b6000602082840312156128ed578081fd5b81516126c481612cae565b6000806040838503121561290a578081fd5b823561291581612cae565b946020939093013593505050565b60008060008060808587031215612938578182fd5b843561294381612cae565b966020860135965060408601359560600135945092505050565b60006020828403121561296e578081fd5b81516126c481612cc3565b60006020828403121561298a578081fd5b5035919050565b6000602082840312156129a2578081fd5b5051919050565b600080604083850312156129bb578182fd5b8235915060208301356129cd81612cae565b809150509250929050565b6000806000606084860312156129ec578283fd5b8335925060208401356129fe81612cae565b91506040840135612a0e81612cae565b809150509250925092565b60008060408385031215612a2b578182fd5b50508035926020909101359150565b600080600060608486031215612a4e578283fd5b83359250602084013591506040840135612a0e81612cae565b60008060008060808587031215612a7c578384fd5b84359350602085013592506040850135612a9581612cae565b91506060850135612aa581612cc3565b939692955090935050565b60008251612ac2818460208701612c51565b9190910192915050565b6020815260008251806020840152612aeb816040850160208701612c51565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b600080821280156001600160ff1b0384900385131615612b8557612b85612c98565b600160ff1b8390038412811615612b9e57612b9e612c98565b50500190565b60008219821115612bb757612bb7612c98565b500190565b600082612bd757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612bf657612bf6612c98565b500290565b60008083128015600160ff1b850184121615612c1957612c19612c98565b6001600160ff1b0384018313811615612c3457612c34612c98565b50500390565b600082821015612c4c57612c4c612c98565b500390565b60005b83811015612c6c578181015183820152602001612c54565b838111156125385750506000910152565b6000600019821415612c9157612c91612c98565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461241d57600080fd5b801515811461241d57600080fdfea2646970667358221220c0d7c16877e981c00c3caf98ebb62e6a79e3df9a9899ba702a44ce791575c40064736f6c63430008040033
Deployed Bytecode Sourcemap
25739:16130:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38276:334;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5069:15:1;;;5051:34;;5121:15;;;5116:2;5101:18;;5094:43;5173:15;;5153:18;;;5146:43;;;;5001:2;4986:18;38276:334:0;;;;;;;;27171:100;27248:8;:15;27171:100;;;13327:25:1;;;13315:2;13300:18;27171:100:0;13282:76:1;30591:673:0;;;;;;:::i;:::-;;:::i;:::-;;26211:26;;;;;;:::i;:::-;;:::i;:::-;;;;15675:25:1;;;15731:2;15716:18;;15709:34;;;;15759:18;;;15752:34;15663:2;15648:18;26211:26:0;15630:162:1;26657:34:0;;;;;;31437:944;;;;;;:::i;:::-;;:::i;34049:570::-;;;;;;:::i;:::-;;:::i;39833:490::-;;;;;;:::i;:::-;;:::i;40522:211::-;;;;;;:::i;:::-;;:::i;37841:427::-;;;;;;:::i;:::-;;:::i;28454:740::-;;;;;;:::i;:::-;;:::i;:::-;;;;13030:13:1;;13012:32;;13100:4;13088:17;;;13082:24;13060:20;;;13053:54;13151:17;;;13145:24;13123:20;;;13116:54;13000:2;12985:18;28454:740:0;12967:209:1;38618:322:0;;;;;;:::i;:::-;;:::i;29286:166::-;;;:::i;37105:327::-;;;;;;:::i;:::-;;:::i;2647:103::-;;;:::i;26305:23::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4767:32:1;;;4749:51;;4737:2;4722:18;26305:23:0;4704:102:1;36426:491:0;;;;;;:::i;:::-;;:::i;1996:87::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;1996:87;;29697:682;;;;;;:::i;:::-;;:::i;26700:30::-;;;;;;26492:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15394:25:1;;;15450:2;15435:18;;15428:34;;;;15367:18;26492:64:0;15349:119:1;27494:776:0;;;;;;:::i;:::-;;:::i;26124:37::-;;;;;-1:-1:-1;;;;;26124:37:0;;;37600:233;;;;;;:::i;:::-;;:::i;35525:506::-;;;;;;:::i;:::-;;:::i;38948:877::-;;;;;;:::i;:::-;;:::i;26398:27::-;;;;;;:::i;:::-;;:::i;32657:1207::-;;;;;;:::i;:::-;;:::i;27026:33::-;;;;;;40331:183;;;;;;:::i;:::-;;:::i;2905:201::-;;;;;;:::i;:::-;;:::i;26958:61::-;;;;;-1:-1:-1;;;;;26958:61:0;;;34627:195;;;;;;:::i;:::-;;:::i;38276:334::-;-1:-1:-1;;;;;38489:23:0;;38388:7;38489:23;;;:13;:23;;;;;;;;:29;;;;;;;;;38467:51;;;;;;;38388:7;;;;;;38467:51;;;;;38489:29;38467:51;;38489:29;38467:51;;;;;;;;;-1:-1:-1;;;;;38467:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;38467:51:0;;;-1:-1:-1;;38467:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38467:51:0;;;;-1:-1:-1;;38537:17:0;;:20;;;38559;;;38537:17;;-1:-1:-1;38537:20:0;38559;-1:-1:-1;38599:1:0;38581:20;;;;;38529:73;;;;;;;38276:334;;;;;:::o;30591:673::-;30702:20;30725:15;30736:3;30725:10;:15::i;:::-;30751:21;30775:13;;;:8;:13;;;;;;;;30789:10;30775:25;;;;;;;30869:22;;30702:38;;-1:-1:-1;30775:25:0;26785:4;;30860:31;;:6;:31;:::i;:::-;30859:56;;;;:::i;:::-;30833:4;:15;;;:83;;;;;;;:::i;:::-;;;;-1:-1:-1;;30927:21:0;;30942:6;;30927:4;;:11;;:21;;30942:6;;30927:21;:::i;:::-;;;;;;;;30986:19;31008:8;31017:3;31008:13;;;;;;-1:-1:-1;;;31008:13:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31008:13:0;;-1:-1:-1;31036:32:0;;31032:120;;31128:11;;31085:55;;-1:-1:-1;;;31085:55:0;;-1:-1:-1;;;;;31085:18:0;;;;;:55;;31104:3;;31109:10;;31121:2;;31125:1;;31128:11;31085:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31032:120;31164:37;31190:2;31194:6;31164:7;31172:3;31164:12;;;;;;-1:-1:-1;;;31164:12:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31164:12:0;;:37;:25;:37::i;:::-;31253:2;-1:-1:-1;;;;;31219:37:0;31240:3;31228:10;-1:-1:-1;;;;;31219:37:0;;31245:6;31219:37;;;;13327:25:1;;13315:2;13300:18;;13282:76;31219:37:0;;;;;;;;30591:673;;;;;;:::o;26211:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26211:26:0;:::o;31437:944::-;31497:20;31520:15;31531:3;31520:10;:15::i;:::-;31546:21;31570:13;;;:8;:13;;;;;;;;31584:10;31570:25;;;;;;;31655:22;;31641:11;;31497:38;;-1:-1:-1;31570:25:0;;26785:4;;31641:36;;;:::i;:::-;31640:61;;;;:::i;:::-;31606:96;;31713:22;31766:4;:15;;;31746:17;:35;;;;:::i;:::-;31815:15;;;:35;;;31713:69;-1:-1:-1;31892:19:0;;31888:237;;31928:12;;:37;;-1:-1:-1;;;31928:37:0;;-1:-1:-1;;;;;5772:32:1;;;31928:37:0;;;5754:51:1;5821:18;;;5814:34;;;31928:12:0;;;;:17;;5727:18:1;;31928:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31980:13;32043:12;;32014:25;32023:10;32035:3;32014:8;:25::i;:::-;31997:42;;:14;:42;:::i;:::-;31996:59;;;;:::i;:::-;31980:75;-1:-1:-1;32074:9:0;;32070:43;;32085:12;;:28;;-1:-1:-1;;;32085:28:0;;-1:-1:-1;;;;;5772:32:1;;;32085:28:0;;;5754:51:1;5821:18;;;5814:34;;;32085:12:0;;;;:17;;5727:18:1;;32085:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32070:43;31888:237;;32137:19;32159:8;32168:3;32159:13;;;;;;-1:-1:-1;;;32159:13:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32159:13:0;;-1:-1:-1;32187:32:0;;32183:133;;32292:11;;32236:68;;-1:-1:-1;;;32236:68:0;;-1:-1:-1;;;;;32236:18:0;;;;;:68;;32255:3;;32260:10;;32272:2;;32276:14;;32292:11;32236:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32183:133;32333:40;;13327:25:1;;;32353:3:0;;32341:10;;32333:40;;13315:2:1;13300:18;32333:40:0;;;;;;;31437:944;;;;;;;:::o;34049:570::-;34119:21;34143:13;;;:8;:13;;;;;;;;34157:10;34143:25;;;;;;;34196:11;;34218:15;;;-1:-1:-1;34244:15:0;;:19;;;34298:8;:13;;34143:25;;34196:11;;34152:3;;34298:13;;;;-1:-1:-1;;;34298:13:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34298:13:0;;-1:-1:-1;34326:32:0;;34322:110;;34375:45;;-1:-1:-1;;;34375:45:0;;-1:-1:-1;;;;;34375:18:0;;;;;:45;;34394:3;;34399:10;;34411:2;;34415:1;;;;34375:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34322:110;34512:37;34538:2;34542:6;34512:7;34520:3;34512:12;;;;;;-1:-1:-1;;;34512:12:0;;;;;;;;:37;34608:2;-1:-1:-1;;;;;34565:46:0;34595:3;34583:10;-1:-1:-1;;;;;34565:46:0;;34600:6;34565:46;;;;13327:25:1;;13315:2;13300:18;;13282:76;34565:46:0;;;;;;;;34049:570;;;;;:::o;39833:490::-;39943:10;39906:20;39929:25;;;:13;:25;;;;;;;;:31;;;;;;;;;;40006:10;39988:29;;;;;-1:-1:-1;;;39988:29:0;;;;;;;;;;;-1:-1:-1;;;;;39988:29:0;;-1:-1:-1;39988:29:0;40047:12;;;;;40060:10;;40047:24;;;;-1:-1:-1;;;40047:24:0;;;;;;;;;;;;-1:-1:-1;;;;;;40092:18:0;;40084:49;;;;-1:-1:-1;;;40084:49:0;;12316:2:1;40084:49:0;;;12298:21:1;12355:2;12335:18;;;12328:30;-1:-1:-1;;;12374:18:1;;;12367:48;12432:18;;40084:49:0;;;;;;;;;40144:63;;-1:-1:-1;;;40144:63:0;;40179:4;40144:63;;;5440:34:1;40186:10:0;5490:18:1;;;5483:43;5542:18;;;5535:34;;;-1:-1:-1;;;;;40144:26:0;;;;;5375:18:1;;40144:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40260:1;40220:4;:17;;40238:10;40220:29;;;;;-1:-1:-1;;;40220:29:0;;;;;;;;;;:42;;-1:-1:-1;;;;;;40220:42:0;-1:-1:-1;;;;;40220:42:0;;;;;;40280:35;;;6079:32:1;;;6061:51;;6143:2;6128:18;;6121:34;;;6171:18;;6164:34;;;40280:35:0;;6049:2:1;6034:18;40280:35:0;;;;;;;39833:490;;;;;:::o;40522:211::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;40607:3:::1;40598:5;:12;;40590:51;;;::::0;-1:-1:-1;;;40590:51:0;;12663:2:1;40590:51:0::1;::::0;::::1;12645:21:1::0;12702:2;12682:18;;;12675:30;12741:28;12721:18;;;12714:56;12787:18;;40590:51:0::1;12635:176:1::0;40590:51:0::1;40652:12;:20:::0;;;40688:37:::1;::::0;13327:25:1;;;40707:10:0::1;::::0;40688:37:::1;::::0;13315:2:1;13300:18;40688:37:0::1;;;;;;;;40522:211:::0;:::o;37841:427::-;37944:10;;37912:7;;-1:-1:-1;;;;;37944:10:0;37932:47;;-1:-1:-1;37978:1:0;37971:8;;37932:47;-1:-1:-1;;;;;38014:23:0;;37992:19;38014:23;;;:13;:23;;;;;;;;:29;;;;;;;;;37992:51;;;;;;;;;;;;38014:29;37992:51;;38014:29;37992:51;;;;;;;;;-1:-1:-1;;;;;37992:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;37992:51:0;;;-1:-1:-1;;37992:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38054:13;38087:9;38082:130;38106:1;38102;:5;38082:130;;;38138:10;;38162:17;;-1:-1:-1;;;;;38138:10:0;;;;:23;;38180:1;38162:20;;;;;-1:-1:-1;;;38162:20:0;;;;;;;;;;;;;38184:4;:12;;;38197:1;38184:15;;;;;-1:-1:-1;;;38184:15:0;;;;;;;;;;;;;38138:62;;-1:-1:-1;;;;;;38138:62:0;;;;;;;-1:-1:-1;;;;;5772:32:1;;;38138:62:0;;;5754:51:1;5821:18;;;5814:34;5727:18;;38138:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38129:71;;;;:::i;:::-;;-1:-1:-1;38109:3:0;;;;:::i;:::-;;;;38082:130;;;-1:-1:-1;38229:5:0;-1:-1:-1;;37841:427:0;;;;;:::o;28454:740::-;28503:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;28503:20:0;28543:8;28552:3;28543:13;;;;;;-1:-1:-1;;;28543:13:0;;;;;;;;;;;;;;;;;;28536:20;;;;;;;;28543:13;;;;;;;28536:20;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28571:15:0;:37;28567:620;;;28625:16;28644:7;28652:3;28644:12;;;;;;-1:-1:-1;;;28644:12:0;;;;;;;;;;;;;;;;;;;:37;;-1:-1:-1;;;28644:37:0;;28675:4;28644:37;;;4749:51:1;-1:-1:-1;;;;;28644:12:0;;;;:22;;4722:18:1;;28644:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28625:56;-1:-1:-1;28700:12:0;;28696:300;;28733:12;28766:4;:19;;;28748:15;:37;;;;:::i;:::-;28733:52;;28804:20;28872:15;;28853:4;:15;;;28835;;28828:4;:22;;;;:::i;:::-;:40;;;;:::i;:::-;28827:60;;;;:::i;:::-;28804:83;-1:-1:-1;28972:8:0;28933:35;26785:4;28804:83;28933:35;:::i;:::-;28932:48;;;;:::i;:::-;28906:74;;:4;;:74;;;;;:::i;:::-;;;-1:-1:-1;;;28696:300:0;29032:15;29010:19;;;:37;29062:8;:13;;29010:4;;29062:8;29071:3;;29062:13;;;;-1:-1:-1;;;29062:13:0;;;;;;;;;;;;;;;;;;:20;;:13;;;;;;:20;;;;;;;;;;;;;;;;;;;;;29121:19;;;;29152:22;;29102:73;;15675:25:1;;;15716:18;;;15709:34;;;15759:18;;;15752:34;29116:3:0;;29102:73;;15663:2:1;15648:18;29102:73:0;;;;;;;28567:620;;28454:740;;;:::o;38618:322::-;-1:-1:-1;;;;;38834:23:0;;38733:7;38834:23;;;:13;:23;;;;;;;;:29;;;;;;;;;38812:51;;;;;;;38733:7;;;;;;38812:51;;;;;38834:29;38812:51;;38834:29;38812:51;;;;;;;;;-1:-1:-1;;;;;38812:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;38812:51:0;;;-1:-1:-1;;38812:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38812:51:0;;;;-1:-1:-1;;;38882:12:0;;;;;:15;;38899;;;;38882:12;;-1:-1:-1;38882:15:0;;38899;38929:1;38916:15;;29286:166;29345:8;:15;29331:11;29371:74;29395:3;29391:1;:7;29371:74;;;29420:13;29431:1;29420:10;:13::i;:::-;-1:-1:-1;29400:3:0;;;:::i;:::-;;;29371:74;;;;29286:166;:::o;37105:327::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;26845:5:::1;37195:16;:41;;37187:112;;;::::0;-1:-1:-1;;;37187:112:0;;7709:2:1;37187:112:0::1;::::0;::::1;7691:21:1::0;7748:2;7728:18;;;7721:30;7787:34;7767:18;;;7760:62;7858:28;7838:18;;;7831:56;7904:19;;37187:112:0::1;7681:248:1::0;37187:112:0::1;37310:17;:15;:17::i;:::-;37338:15;:34:::0;;;37388:36:::1;::::0;13327:25:1;;;37388:36:0::1;::::0;13315:2:1;13300:18;37388:36:0::1;;;;;;;37105:327:::0;:::o;2647:103::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;2712:30:::1;2739:1;2712:18;:30::i;:::-;2647:103::o:0;26305:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26305:23:0;;-1:-1:-1;26305:23:0;:::o;36426:491::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;36582:17:::1;:15;:17::i;:::-;36674:11;36646:8;36655:4;36646:14;;;;;;-1:-1:-1::0;;;36646:14:0::1;;;;;;;;;;;;;;;;;;;:25;;;36628:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;36610:15;:75;;;;36724:11;36696:8;36705:4;36696:14;;;;;;-1:-1:-1::0;;;36696:14:0::1;;;;;;;;;;;;;;;;;;;:25;;:39;;;;36750:9;36746:68;;;36793:9;36776:8;36785:4;36776:14;;;;;;-1:-1:-1::0;;;36776:14:0::1;;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;36776:26:0::1;;;;;-1:-1:-1::0;;;;;36776:26:0::1;;;;;;36746:68;36859:9;:38;;36883:8;36892:4;36883:14;;;;;;-1:-1:-1::0;;;36883:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36883:14:0::1;36859:38;;;36871:9;36859:38;-1:-1:-1::0;;;;;36829:80:0::1;36840:4;36829:80;36846:11;36899:9;36829:80;;;;;;15127:25:1::0;;;15195:14;15188:22;15183:2;15168:18;;15161:50;15115:2;15100:18;;15082:135;36829:80:0::1;;;;;;;;36426:491:::0;;;;:::o;29697:682::-;29807:20;29830:15;29841:3;29830:10;:15::i;:::-;29856:21;29880:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;29880:17:0;;;;;;;;;29930:21;;29807:38;;-1:-1:-1;29880:17:0;29945:6;;29880:17;;29930:21;;29945:6;;29930:21;:::i;:::-;;;;-1:-1:-1;;29998:22:0;;26785:4;;29989:31;;:6;:31;:::i;:::-;29988:56;;;;:::i;:::-;29962:4;:15;;;:83;;;;;;;:::i;:::-;;;;;;;;30083:19;30105:8;30114:3;30105:13;;;;;;-1:-1:-1;;;30105:13:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30105:13:0;;-1:-1:-1;30133:32:0;;30129:112;;30217:11;;30182:47;;-1:-1:-1;;;30182:47:0;;-1:-1:-1;;;;;30182:18:0;;;;;:47;;30201:3;;30206:2;;;;30214:1;;30217:11;30182:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30129:112;30253:64;30283:10;30303:4;30310:6;30253:7;30261:3;30253:12;;;;;;-1:-1:-1;;;30253:12:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30253:12:0;;:64;;:29;:64::i;:::-;30368:2;-1:-1:-1;;;;;30335:36:0;30355:3;30343:10;-1:-1:-1;;;;;30335:36:0;;30360:6;30335:36;;;;13327:25:1;;13315:2;13300:18;;13282:76;27494:776:0;27569:15;27597:20;27620:8;27629:4;27620:14;;;;;;-1:-1:-1;;;27620:14:0;;;;;;;;;;;;;;;;;27597:37;;;;;;;;27620:14;;;;;;;27597:37;;;;;;;;;;;;;;;;;;;27669:14;;;:8;:14;;;;;-1:-1:-1;;;;;27669:21:0;;;;;;;;;;27729:22;;27781:13;;27597:37;;-1:-1:-1;27669:21:0;;27729:22;;27620:14;;27678:4;;27781:13;;;;-1:-1:-1;;;27781:13:0;;;;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;27781:38:0;;27813:4;27781:38;;;4749:51:1;-1:-1:-1;;;;;27781:13:0;;;;:23;;4722:18:1;;27781:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27762:57;;27852:4;:19;;;27834:15;:37;:54;;;;-1:-1:-1;27875:13:0;;;27834:54;27830:321;;;27905:12;27938:4;:19;;;27920:15;:37;;;;:::i;:::-;27905:52;;27972:20;28040:15;;28021:4;:15;;;28003;;27996:4;:22;;;;:::i;:::-;:40;;;;:::i;:::-;27995:60;;;;:::i;:::-;27972:83;-1:-1:-1;28131:8:0;28092:35;26785:4;27972:83;28092:35;:::i;:::-;28091:48;;;;:::i;:::-;28070:69;;;;:::i;:::-;;;27830:321;;;28246:15;;;;28187:11;;26785:4;;28187:31;;28201:17;;28187:31;:::i;:::-;28186:56;;;;:::i;:::-;28179:82;;;;:::i;:::-;28161:101;27494:776;-1:-1:-1;;;;;;;27494:776:0:o;37600:233::-;37694:12;;-1:-1:-1;;;;;37694:12:0;37686:35;37678:108;;;;-1:-1:-1;;;37678:108:0;;10724:2:1;37678:108:0;;;10706:21:1;10763:2;10743:18;;;10736:30;10802:34;10782:18;;;10775:62;10873:30;10853:18;;;10846:58;10921:19;;37678:108:0;10696:250:1;37678:108:0;37797:12;:28;;-1:-1:-1;;;;;;37797:28:0;-1:-1:-1;;;;;37797:28:0;;;;;;;;;;37600:233::o;35525:506::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;35658:28:::1;35677:8;35658:18;:28::i;:::-;35697:17;:15;:17::i;:::-;35744:10;35725:15;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35765:7:0::1;:22:::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;35765:22:0;;::::1;-1:-1:-1::0;;;;;;35765:22:0;;::::1;::::0;::::1;::::0;;;35798:8:::1;:24:::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;35849:89:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;35849:89:0;;;35899:15:::1;35765:22;35849:89:::0;::::1;::::0;;;;;;;;;35835:8:::1;:104:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;35971:14;;35765:22;;35971:18:::1;::::0;::::1;:::i;:::-;35955:68;::::0;13327:25:1;;;35955:68:0::1;::::0;13315:2:1;13300:18;35955:68:0::1;;;;;;;35525:506:::0;;;:::o;38948:877::-;39103:10;;:33;;-1:-1:-1;;;39103:33:0;;-1:-1:-1;;;;;4767:32:1;;;39103:33:0;;;4749:51:1;39103:10:0;;;;:27;;4722:18:1;;39103:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39095:64;;;;-1:-1:-1;;;39095:64:0;;11153:2:1;39095:64:0;;;11135:21:1;11192:2;11172:18;;;11165:30;-1:-1:-1;;;11211:18:1;;;11204:48;11269:18;;39095:64:0;11125:168:1;39095:64:0;39178:31;;-1:-1:-1;;;39178:31:0;;;;;13327:25:1;;;39213:10:0;;-1:-1:-1;;;;;39178:21:0;;;;;13300:18:1;;39178:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39178:45:0;;39170:94;;;;-1:-1:-1;;;39170:94:0;;11911:2:1;39170:94:0;;;11893:21:1;11950:2;11930:18;;;11923:30;11989:34;11969:18;;;11962:62;-1:-1:-1;;;12040:18:1;;;12033:34;12084:19;;39170:94:0;11883:226:1;39170:94:0;39275:21;39299:14;;;:8;:14;;;;;;;;39314:10;39299:26;;;;;;;39344:11;;:16;39336:51;;;;-1:-1:-1;;;39336:51:0;;8492:2:1;39336:51:0;;;8474:21:1;8531:2;8511:18;;;8504:30;-1:-1:-1;;;8550:18:1;;;8543:52;8612:18;;39336:51:0;8464:172:1;39336:51:0;39400:63;;-1:-1:-1;;;39400:63:0;;39427:10;39400:63;;;5440:34:1;39447:4:0;5490:18:1;;;5483:43;5542:18;;;5535:34;;;-1:-1:-1;;;;;39400:26:0;;;;;5375:18:1;;39400:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39512:10:0;39476:19;39498:25;;;:13;:25;;;;;;;;:31;;;;;;;;;39476:53;;;;;;;;:19;;-1:-1:-1;39476:53:0;-1:-1:-1;39498:31:0;39476:53;;;;;39498:31;;39476:53;;39498:31;39476:53;;;;-1:-1:-1;;;;;39476:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;39476:53:0;;;-1:-1:-1;;39476:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39589:1;-1:-1:-1;;;;;39548:43:0;:4;:17;;;39566:10;39548:29;;;;;-1:-1:-1;;;39548:29:0;;;;;;;;;;;;;-1:-1:-1;;;;;39548:43:0;;39540:83;;;;-1:-1:-1;;;39540:83:0;;8136:2:1;39540:83:0;;;8118:21:1;8175:2;8155:18;;;8148:30;8214:29;8194:18;;;8187:57;8261:18;;39540:83:0;8108:177:1;39540:83:0;39634:17;;39666:4;;39652:10;39634:29;;;;;-1:-1:-1;;;39634:29:0;;;;;;;;;-1:-1:-1;;;;;39634:36:0;;;:29;;;;;;;;:36;39681:12;;;39708:8;;39694:10;39681:24;;;;;-1:-1:-1;;;39681:24:0;;;;;;;;;;;;;;;;;:35;;;;39743:10;39729:25;;;;:13;:25;;;;;;:31;;;;;;;:38;;39763:4;;39729:31;:38;;:31;;:38;;:::i;:::-;-1:-1:-1;39729:38:0;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;39785:32:0;;;-1:-1:-1;;;;;6079:32:1;;6061:51;;6143:2;6128:18;;6121:34;;;6171:18;;;6164:34;;;39785:32:0;;-1:-1:-1;6049:2:1;6034:18;39785:32:0;;;;;;;38948:877;;;;;;:::o;26398:27::-;;;;;;;;;;;;32657:1207;32778:20;32801:15;32812:3;32801:10;:15::i;:::-;32827:21;32851:13;;;:8;:13;;;;;;;;32865:10;32851:25;;;;;;;32936:22;;32922:11;;32778:38;;-1:-1:-1;32851:25:0;;26785:4;;32922:36;;;:::i;:::-;32921:61;;;;:::i;:::-;32887:96;;32994:22;33047:4;:15;;;33027:17;:35;;;;:::i;:::-;33151:22;;32994:69;;-1:-1:-1;26785:4:0;;33142:31;;:6;:31;:::i;:::-;33141:56;;;;:::i;:::-;33114:84;;:17;:84;:::i;:::-;33096:15;;;:102;33209:21;;33224:6;;33096:4;;33209:11;;:21;;33224:6;;33209:21;:::i;:::-;;;;-1:-1:-1;;33272:19:0;;33268:237;;33308:12;;:37;;-1:-1:-1;;;33308:37:0;;-1:-1:-1;;;;;5772:32:1;;;33308:37:0;;;5754:51:1;5821:18;;;5814:34;;;33308:12:0;;;;:17;;5727:18:1;;33308:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33360:13;33423:12;;33394:25;33403:10;33415:3;33394:8;:25::i;:::-;33377:42;;:14;:42;:::i;:::-;33376:59;;;;:::i;:::-;33360:75;-1:-1:-1;33454:9:0;;33450:43;;33465:12;;:28;;-1:-1:-1;;;33465:28:0;;-1:-1:-1;;;;;5772:32:1;;;33465:28:0;;;5754:51:1;5821:18;;;5814:34;;;33465:12:0;;;;:17;;5727:18:1;;33465:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33450:43;33268:237;;33517:19;33539:8;33548:3;33539:13;;;;;;-1:-1:-1;;;33539:13:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33539:13:0;;-1:-1:-1;33567:32:0;;33563:133;;33672:11;;33616:68;;-1:-1:-1;;;33616:68:0;;-1:-1:-1;;;;;33616:18:0;;;;;:68;;33635:3;;33640:10;;33652:2;;33656:14;;33672:11;33616:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33563:133;33708:37;33734:2;33738:6;33708:7;33716:3;33708:12;;;;;;-1:-1:-1;;;33708:12:0;;;;;;;;:37;33797:2;-1:-1:-1;;;;;33763:37:0;33784:3;33772:10;-1:-1:-1;;;;;33763:37:0;;33789:6;33763:37;;;;13327:25:1;;13315:2;13300:18;;13282:76;33763:37:0;;;;;;;;33816:40;;13327:25:1;;;33836:3:0;;33824:10;;33816:40;;13315:2:1;13300:18;33816:40:0;;;;;;;32657:1207;;;;;;;;:::o;40331:183::-;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;40406:10:::1;:40:::0;;-1:-1:-1;;;;;;40406:40:0::1;-1:-1:-1::0;;;;;40406:40:0;::::1;::::0;;::::1;::::0;;;40462:44:::1;::::0;4749:51:1;;;40482:10:0::1;::::0;40462:44:::1;::::0;4737:2:1;4722:18;40462:44:0::1;4704:102:1::0;2905:201:0;2042:7;2069:6;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2994:22:0;::::1;2986:73;;;::::0;-1:-1:-1;;;2986:73:0;;8843:2:1;2986:73:0::1;::::0;::::1;8825:21:1::0;8882:2;8862:18;;;8855:30;8921:34;8901:18;;;8894:62;-1:-1:-1;;;8972:18:1;;;8965:36;9018:19;;2986:73:0::1;8815:228:1::0;2986:73:0::1;3070:28;3089:8;3070:18;:28::i;:::-;2905:201:::0;:::o;34627:195::-;34703:8;:15;34686:14;34729:86;34757:6;34751:3;:12;34729:86;;;34787:16;34795:3;34800:2;34787:7;:16::i;:::-;34765:5;;;:::i;:::-;;;34729:86;;;;34627:195;;:::o;15551:211::-;15695:58;;-1:-1:-1;;;;;5772:32:1;;15695:58:0;;;5754:51:1;5821:18;;;5814:34;;;15668:86:0;;15688:5;;-1:-1:-1;;;15718:23:0;5727:18:1;;15695:58:0;;;;-1:-1:-1;;15695:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15695:58:0;-1:-1:-1;;;;;;15695:58:0;;;;;;;;;;15668:19;:86::i;3266:191::-;3340:16;3359:6;;-1:-1:-1;;;;;3376:17:0;;;-1:-1:-1;;;;;;3376:17:0;;;;;;3409:40;;3359:6;;;;;;;3409:40;;3340:16;3409:40;3266:191;;:::o;15770:248::-;15941:68;;-1:-1:-1;;;;;5458:15:1;;;15941:68:0;;;5440:34:1;5510:15;;5490:18;;;5483:43;5542:18;;;5535:34;;;15914:96:0;;15934:5;;-1:-1:-1;;;15964:27:0;5375:18:1;;15941:68:0;5357:218:1;15914:96:0;15770:248;;;;:::o;34884:246::-;34971:8;:15;34954:14;34997:126;35025:6;35019:3;:12;34997:126;;;35079:8;-1:-1:-1;;;;;35063:24:0;:7;35071:3;35063:12;;;;;;-1:-1:-1;;;35063:12:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35063:12:0;:24;;35055:56;;;;-1:-1:-1;;;35055:56:0;;9657:2:1;35055:56:0;;;9639:21:1;9696:2;9676:18;;;9669:30;-1:-1:-1;;;9715:18:1;;;9708:49;9774:18;;35055:56:0;9629:169:1;35055:56:0;35033:5;;;:::i;:::-;;;34997:126;;18087:716;18511:23;18537:69;18565:4;18537:69;;;;;;;;;;;;;;;;;18545:5;-1:-1:-1;;;;;18537:27:0;;;:69;;;;;:::i;:::-;18621:17;;18511:95;;-1:-1:-1;18621:21:0;18617:179;;18718:10;18707:30;;;;;;;;;;;;:::i;:::-;18699:85;;;;-1:-1:-1;;;18699:85:0;;11500:2:1;18699:85:0;;;11482:21:1;11539:2;11519:18;;;11512:30;11578:34;11558:18;;;11551:62;-1:-1:-1;;;11629:18:1;;;11622:40;11679:19;;18699:85:0;11472:232:1;10329:229:0;10466:12;10498:52;10520:6;10528:4;10534:1;10537:12;10498:21;:52::i;:::-;10491:59;;10329:229;;;;;;:::o;11449:510::-;11619:12;11677:5;11652:21;:30;;11644:81;;;;-1:-1:-1;;;11644:81:0;;9250:2:1;11644:81:0;;;9232:21:1;9289:2;9269:18;;;9262:30;9328:34;9308:18;;;9301:62;-1:-1:-1;;;9379:18:1;;;9372:36;9425:19;;11644:81:0;9222:228:1;11644:81:0;-1:-1:-1;;;;;7879:19:0;;;11736:60;;;;-1:-1:-1;;;11736:60:0;;10366:2:1;11736:60:0;;;10348:21:1;10405:2;10385:18;;;10378:30;10444:31;10424:18;;;10417:59;10493:18;;11736:60:0;10338:179:1;11736:60:0;11810:12;11824:23;11851:6;-1:-1:-1;;;;;11851:11:0;11870:5;11877:4;11851:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11809:73;;;;11900:51;11917:7;11926:10;11938:12;14285;14314:7;14310:530;;;-1:-1:-1;14345:10:0;14338:17;;14310:530;14459:17;;:21;14455:374;;14657:10;14651:17;14718:15;14705:10;14701:2;14697:19;14690:44;14605:148;14800:12;14793:20;;-1:-1:-1;;;14793:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:257:1;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:325::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;857:2;842:18;;;;829:32;;-1:-1:-1;;;629:238:1:o;872:462::-;958:6;966;974;982;1035:3;1023:9;1014:7;1010:23;1006:33;1003:2;;;1057:6;1049;1042:22;1003:2;1101:9;1088:23;1120:31;1145:5;1120:31;:::i;:::-;1170:5;1222:2;1207:18;;1194:32;;-1:-1:-1;1273:2:1;1258:18;;1245:32;;1324:2;1309:18;1296:32;;-1:-1:-1;993:341:1;-1:-1:-1;;;993:341:1:o;1339:255::-;1406:6;1459:2;1447:9;1438:7;1434:23;1430:32;1427:2;;;1480:6;1472;1465:22;1427:2;1517:9;1511:16;1536:28;1558:5;1536:28;:::i;1886:190::-;1945:6;1998:2;1986:9;1977:7;1973:23;1969:32;1966:2;;;2019:6;2011;2004:22;1966:2;-1:-1:-1;2047:23:1;;1956:120;-1:-1:-1;1956:120:1:o;2081:194::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:2;;;2225:6;2217;2210:22;2172:2;-1:-1:-1;2253:16:1;;2162:113;-1:-1:-1;2162:113:1:o;2280:325::-;2348:6;2356;2409:2;2397:9;2388:7;2384:23;2380:32;2377:2;;;2430:6;2422;2415:22;2377:2;2471:9;2458:23;2448:33;;2531:2;2520:9;2516:18;2503:32;2544:31;2569:5;2544:31;:::i;:::-;2594:5;2584:15;;;2367:238;;;;;:::o;2610:497::-;2718:6;2726;2734;2787:2;2775:9;2766:7;2762:23;2758:32;2755:2;;;2808:6;2800;2793:22;2755:2;2849:9;2836:23;2826:33;;2909:2;2898:9;2894:18;2881:32;2922:31;2947:5;2922:31;:::i;:::-;2972:5;-1:-1:-1;3029:2:1;3014:18;;3001:32;3042:33;3001:32;3042:33;:::i;:::-;3094:7;3084:17;;;2745:362;;;;;:::o;3112:258::-;3180:6;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:2;;;3262:6;3254;3247:22;3209:2;-1:-1:-1;;3290:23:1;;;3360:2;3345:18;;;3332:32;;-1:-1:-1;3199:171:1:o;3375:393::-;3452:6;3460;3468;3521:2;3509:9;3500:7;3496:23;3492:32;3489:2;;;3542:6;3534;3527:22;3489:2;3583:9;3570:23;3560:33;;3640:2;3629:9;3625:18;3612:32;3602:42;;3694:2;3683:9;3679:18;3666:32;3707:31;3732:5;3707:31;:::i;3773:546::-;3873:6;3881;3889;3897;3950:3;3938:9;3929:7;3925:23;3921:33;3918:2;;;3972:6;3964;3957:22;3918:2;4013:9;4000:23;3990:33;;4070:2;4059:9;4055:18;4042:32;4032:42;;4124:2;4113:9;4109:18;4096:32;4137:31;4162:5;4137:31;:::i;:::-;4187:5;-1:-1:-1;4244:2:1;4229:18;;4216:32;4257:30;4216:32;4257:30;:::i;:::-;3908:411;;;;-1:-1:-1;3908:411:1;;-1:-1:-1;;3908:411:1:o;4324:274::-;4453:3;4491:6;4485:13;4507:53;4553:6;4548:3;4541:4;4533:6;4529:17;4507:53;:::i;:::-;4576:16;;;;;4461:137;-1:-1:-1;;4461:137:1:o;7119:383::-;7268:2;7257:9;7250:21;7231:4;7300:6;7294:13;7343:6;7338:2;7327:9;7323:18;7316:34;7359:66;7418:6;7413:2;7402:9;7398:18;7393:2;7385:6;7381:15;7359:66;:::i;:::-;7486:2;7465:15;-1:-1:-1;;7461:29:1;7446:45;;;;7493:2;7442:54;;7240:262;-1:-1:-1;;7240:262:1:o;9803:356::-;10005:2;9987:21;;;10024:18;;;10017:30;10083:34;10078:2;10063:18;;10056:62;10150:2;10135:18;;9977:182::o;13363:535::-;13638:25;;;-1:-1:-1;;;;;13737:15:1;;;13732:2;13717:18;;13710:43;13789:15;;;;13784:2;13769:18;;13762:43;13836:2;13821:18;;13814:34;;;;13879:3;13864:19;;13857:35;13625:3;13610:19;;13592:306::o;15797:267::-;15836:3;15864:11;;;15891:10;;-1:-1:-1;;;;;15910:27:1;;;15903:35;;15887:52;15884:2;;;15942:18;;:::i;:::-;-1:-1:-1;;;15989:19:1;;;15982:27;;15974:36;;15971:2;;;16013:18;;:::i;:::-;-1:-1:-1;;16049:9:1;;15844:220::o;16069:128::-;16109:3;16140:1;16136:6;16133:1;16130:13;16127:2;;;16146:18;;:::i;:::-;-1:-1:-1;16182:9:1;;16117:80::o;16202:217::-;16242:1;16268;16258:2;;-1:-1:-1;;;16293:31:1;;16347:4;16344:1;16337:15;16375:4;16300:1;16365:15;16258:2;-1:-1:-1;16404:9:1;;16248:171::o;16424:168::-;16464:7;16530:1;16526;16522:6;16518:14;16515:1;16512:21;16507:1;16500:9;16493:17;16489:45;16486:2;;;16537:18;;:::i;:::-;-1:-1:-1;16577:9:1;;16476:116::o;16597:270::-;16636:4;16665:12;;;16693:10;;-1:-1:-1;;;16712:19:1;;16705:27;;16689:44;16686:2;;;16736:18;;:::i;:::-;-1:-1:-1;;;;;16783:27:1;;16776:35;;16768:44;;16765:2;;;16815:18;;:::i;:::-;-1:-1:-1;;16852:9:1;;16645:222::o;16872:125::-;16912:4;16940:1;16937;16934:8;16931:2;;;16945:18;;:::i;:::-;-1:-1:-1;16982:9:1;;16921:76::o;17002:258::-;17074:1;17084:113;17098:6;17095:1;17092:13;17084:113;;;17174:11;;;17168:18;17155:11;;;17148:39;17120:2;17113:10;17084:113;;;17215:6;17212:1;17209:13;17206:2;;;-1:-1:-1;;17250:1:1;17232:16;;17225:27;17055:205::o;17265:135::-;17304:3;-1:-1:-1;;17325:17:1;;17322:2;;;17345:18;;:::i;:::-;-1:-1:-1;17392:1:1;17381:13;;17312:88::o;17405:127::-;17466:10;17461:3;17457:20;17454:1;17447:31;17497:4;17494:1;17487:15;17521:4;17518:1;17511:15;17537:131;-1:-1:-1;;;;;17612:31:1;;17602:42;;17592:2;;17658:1;17655;17648:12;17673:118;17759:5;17752:13;17745:21;17738:5;17735:32;17725:2;;17781:1;17778;17771:12
Swarm Source
ipfs://c0d7c16877e981c00c3caf98ebb62e6a79e3df9a9899ba702a44ce791575c400
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.