Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 1,516 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 21424324 | 417 days ago | IN | 0 ETH | 0.00359059 | ||||
| Withdraw | 19885962 | 632 days ago | IN | 0 ETH | 0.00065321 | ||||
| Withdraw | 19338630 | 709 days ago | IN | 0 ETH | 0.00810019 | ||||
| Withdraw | 19315632 | 712 days ago | IN | 0 ETH | 0.00731055 | ||||
| Withdraw | 19315622 | 712 days ago | IN | 0 ETH | 0.00834317 | ||||
| Withdraw | 19315564 | 712 days ago | IN | 0 ETH | 0.00800097 | ||||
| Withdraw | 19304999 | 713 days ago | IN | 0 ETH | 0.005898 | ||||
| Withdraw | 19296205 | 715 days ago | IN | 0 ETH | 0.00711869 | ||||
| Withdraw | 19259997 | 720 days ago | IN | 0 ETH | 0.00471797 | ||||
| Withdraw | 19259949 | 720 days ago | IN | 0 ETH | 0.00649598 | ||||
| Withdraw | 19253476 | 721 days ago | IN | 0 ETH | 0.00448404 | ||||
| Withdraw | 19199267 | 728 days ago | IN | 0 ETH | 0.00667356 | ||||
| Withdraw | 19024469 | 753 days ago | IN | 0 ETH | 0.00585422 | ||||
| Withdraw | 18966900 | 761 days ago | IN | 0 ETH | 0.00297419 | ||||
| Withdraw | 18900853 | 770 days ago | IN | 0 ETH | 0.00324485 | ||||
| Withdraw | 18893334 | 771 days ago | IN | 0 ETH | 0.0034539 | ||||
| Withdraw | 18838068 | 779 days ago | IN | 0 ETH | 0.00486243 | ||||
| Withdraw | 18802679 | 784 days ago | IN | 0 ETH | 0.00747448 | ||||
| Withdraw | 18799848 | 784 days ago | IN | 0 ETH | 0.01321957 | ||||
| Grant Role | 18798187 | 785 days ago | IN | 0 ETH | 0.00183866 | ||||
| Withdraw Reward | 18782564 | 787 days ago | IN | 0 ETH | 0.00350595 | ||||
| Withdraw | 18782556 | 787 days ago | IN | 0 ETH | 0.00723096 | ||||
| Withdraw | 18739691 | 793 days ago | IN | 0 ETH | 0.0072834 | ||||
| Withdraw | 18730855 | 794 days ago | IN | 0 ETH | 0.01276361 | ||||
| Withdraw Reward | 18730726 | 794 days ago | IN | 0 ETH | 0.00525747 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RainiLpv3StakingPool
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-06-18
*/
// SPDX-License-Identifier: MIT
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) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant alphabet = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @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);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if(!hasRole(role, account)) {
revert(string(abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)));
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
/**
* @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'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + 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
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @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;
}
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
interface INonfungiblePositionManager is IERC721 {
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
interface RainiLpv2StakingPool {
function burn(address _owner, uint256 _amount) external;
function balanceOf(address _owner) external view returns(uint256);
}
contract RainiLpv3StakingPool is AccessControl, ReentrancyGuard, ERC721Holder {
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
using SafeERC20 for IERC20;
// Fixed / admin assigned values:
uint256 public rewardRate;
uint256 public minRewardStake;
uint256 constant public REWARD_DECIMALS = 1000000;
uint256 public maxBonus;
uint256 public bonusDuration;
uint256 public bonusRate;
uint256 constant public BONUS_DECIMALS = 1000000000;
uint256 constant public RAINI_REWARD_DECIMALS = 1000000000000;
int24 public minTickUpper;
int24 public maxTickLower;
uint24 public feeRequired;
INonfungiblePositionManager public rainiLpNFT;
RainiLpv2StakingPool public rainiLpv2StakingPool;
IERC20 public rainiToken;
address public exchangeTokenAddress;
uint256 public unicornToEth;
// Universal variables
uint256 public totalSupply;
struct GeneralRewardVars {
uint32 lastUpdateTime;
uint64 rainiRewardPerTokenStored;
uint32 periodFinish;
uint128 rainiRewardRate;
}
GeneralRewardVars public generalRewardVars;
// account specific variables
struct AccountRewardVars {
uint40 lastBonus;
uint32 lastUpdated;
uint104 rainiRewards;
uint64 rainiRewardPerTokenPaid;
}
struct AccountVars {
uint128 staked;
uint128 unicornBalance;
}
mapping(address => AccountRewardVars) internal accountRewardVars;
mapping(address => AccountVars) internal accountVars;
mapping(address => uint32[]) internal stakedNFTs;
// Events
event EthWithdrawn(uint256 amount);
event RewardSet(uint256 rewardRate, uint256 minRewardStake);
event BonusesSet(uint256 maxBonus, uint256 bonusDuration);
event RainiLpTokenSet(address token);
event UnicornToEthSet(uint256 unicornToEth);
event TickRangeSet(int24 minTickUpper, int24 maxTickLower);
event FeeRequiredSet(uint24 feeRequired);
event TokensStaked(address payer, uint256 amount, uint256 timestamp);
event TokensWithdrawn(address owner, uint256 amount, uint256 timestamp);
event UnicornPointsBurned(address owner, uint256 amount);
event UnicornPointsMinted(address owner, uint256 amount);
event UnicornPointsBought(address owner, uint256 amount);
event RewardWithdrawn(address owner, uint256 amount, uint256 timestamp);
event RewardPoolAdded(uint256 _amount, uint256 _duration, uint256 timestamp);
constructor(address _rainiLpNFT, address _rainiToken, address _exchangeToken, address _v2Pool) {
require(_rainiLpNFT != address(0), "RainiLpv3StakingPool: _rainiLpToken is zero address");
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
rainiLpNFT = INonfungiblePositionManager(_rainiLpNFT);
exchangeTokenAddress = _exchangeToken;
rainiToken = IERC20(_rainiToken);
rainiLpv2StakingPool = RainiLpv2StakingPool(_v2Pool);
}
modifier onlyOwner() {
require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "RainiLpv3StakingPool: caller is not an owner");
_;
}
modifier onlyBurner() {
require(hasRole(BURNER_ROLE, _msgSender()), "RainiLpv3StakingPool: caller is not a burner");
_;
}
modifier onlyMinter() {
require(hasRole(MINTER_ROLE, _msgSender()), "RainiLpv3StakingPool: caller is not a minter");
_;
}
modifier balanceUpdate(address _owner) {
AccountRewardVars memory _accountRewardVars = accountRewardVars[_owner];
AccountVars memory _accountVars = accountVars[_owner];
GeneralRewardVars memory _generalRewardVars = generalRewardVars;
// Raini rewards
_generalRewardVars.rainiRewardPerTokenStored = uint64(rainiRewardPerToken());
_generalRewardVars.lastUpdateTime = uint32(lastTimeRewardApplicable());
if (_owner != address(0)) {
uint32 duration = uint32(block.timestamp) - _accountRewardVars.lastUpdated;
uint128 reward = calculateReward(_owner, _accountVars.staked, duration);
_accountVars.unicornBalance = _accountVars.unicornBalance + reward;
_accountRewardVars.lastUpdated = uint32(block.timestamp);
_accountRewardVars.lastBonus = uint40(Math.min(maxBonus, _accountRewardVars.lastBonus + bonusRate * duration));
_accountRewardVars.rainiRewards = uint104(rainiEarned(_owner));
_accountRewardVars.rainiRewardPerTokenPaid = _generalRewardVars.rainiRewardPerTokenStored;
}
accountRewardVars[_owner] = _accountRewardVars;
accountVars[_owner] = _accountVars;
generalRewardVars = _generalRewardVars;
_;
}
function getRewardByDuration(address _owner, uint256 _amount, uint256 _duration)
public view returns(uint256) {
return calculateReward(_owner, _amount, _duration);
}
function getStaked(address _owner)
public view returns(uint256) {
return accountVars[_owner].staked;
}
function getStakedPositions(address _owner)
public view returns(uint32[] memory) {
return stakedNFTs[_owner];
}
function balanceOf(address _owner)
public view returns(uint256) {
uint256 reward = calculateReward(_owner, accountVars[_owner].staked, block.timestamp - accountRewardVars[_owner].lastUpdated);
return accountVars[_owner].unicornBalance + reward;
}
function getCurrentBonus(address _owner)
public view returns(uint256) {
AccountRewardVars memory _accountRewardVars = accountRewardVars[_owner];
if(accountVars[_owner].staked == 0) {
return 0;
}
uint256 duration = block.timestamp - _accountRewardVars.lastUpdated;
return Math.min(maxBonus, _accountRewardVars.lastBonus + bonusRate * duration);
}
function getCurrentAvgBonus(address _owner, uint256 _duration)
public view returns(uint256) {
AccountRewardVars memory _accountRewardVars = accountRewardVars[_owner];
if(accountVars[_owner].staked == 0) {
return 0;
}
uint256 avgBonus;
if(_accountRewardVars.lastBonus < maxBonus) {
uint256 durationTillMax = (maxBonus - _accountRewardVars.lastBonus) / bonusRate;
if(_duration > durationTillMax) {
uint256 avgWeightedBonusTillMax = (_accountRewardVars.lastBonus + maxBonus) * durationTillMax / 2;
uint256 weightedMaxBonus = maxBonus * (_duration - durationTillMax);
avgBonus = (avgWeightedBonusTillMax + weightedMaxBonus) / _duration;
} else {
avgBonus = (_accountRewardVars.lastBonus + bonusRate * _duration + _accountRewardVars.lastBonus) / 2;
}
} else {
avgBonus = maxBonus;
}
return avgBonus;
}
function setReward(uint256 _rewardRate, uint256 _minRewardStake)
external onlyOwner {
rewardRate = _rewardRate;
minRewardStake = _minRewardStake;
emit RewardSet(rewardRate, minRewardStake);
}
function setUnicornToEth(uint256 _unicornToEth)
external onlyOwner {
unicornToEth = _unicornToEth;
emit UnicornToEthSet(_unicornToEth);
}
function setBonus(uint256 _maxBonus, uint256 _bonusDuration)
external onlyOwner {
maxBonus = _maxBonus * BONUS_DECIMALS;
bonusDuration = _bonusDuration;
bonusRate = maxBonus / _bonusDuration;
emit BonusesSet(_maxBonus, _bonusDuration);
}
function setTickRange(int24 _maxTickLower, int24 _minTickUpper)
external onlyOwner {
minTickUpper = _minTickUpper;
maxTickLower = _maxTickLower;
emit TickRangeSet(_minTickUpper, _maxTickLower);
}
function setFeeRequired(uint24 _feeRequired)
external onlyOwner {
feeRequired = _feeRequired;
emit FeeRequiredSet(_feeRequired);
}
function stake(uint32 _tokenId)
external nonReentrant balanceUpdate(_msgSender()) {
(
,//uint96 nonce,
,//address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
,//uint256 feeGrowthInside0LastX128,
,//uint256 feeGrowthInside1LastX128,
,//uint128 tokensOwed0,
//uint128 tokensOwed1
) = rainiLpNFT.positions(_tokenId);
require(tickUpper > minTickUpper, "RainiLpv3StakingPool: tickUpper too low");
require(tickLower < maxTickLower, "RainiLpv3StakingPool: tickLower too high");
require((token0 == exchangeTokenAddress && token1 == address(rainiToken)) ||
(token1 == exchangeTokenAddress && token0 == address(rainiToken)), "RainiLpv3StakingPool: NFT tokens not correct");
require(fee == feeRequired, "RainiLpv3StakingPool: fee != feeRequired");
rainiLpNFT.safeTransferFrom(_msgSender(), address(this), _tokenId);
uint32[] memory nfts = stakedNFTs[_msgSender()];
bool wasAdded = false;
for (uint i = 0; i < nfts.length; i++) {
if (nfts[i] == 0) {
stakedNFTs[_msgSender()][i] = _tokenId;
wasAdded = true;
break;
}
}
if (!wasAdded) {
stakedNFTs[_msgSender()].push(_tokenId);
}
totalSupply = totalSupply + liquidity;
uint128 currentStake = accountVars[_msgSender()].staked;
accountVars[_msgSender()].staked = currentStake + liquidity;
accountRewardVars[_msgSender()].lastBonus = uint40(accountRewardVars[_msgSender()].lastBonus * currentStake / (currentStake + liquidity));
emit TokensStaked(_msgSender(), liquidity, block.timestamp);
}
function withdraw(uint256 _tokenId)
external nonReentrant balanceUpdate(_msgSender()) {
bool ownsNFT = false;
uint32[] memory nfts = stakedNFTs[_msgSender()];
for (uint i = 0; i < nfts.length; i++) {
if (nfts[i] == _tokenId) {
ownsNFT = true;
delete stakedNFTs[_msgSender()][i];
break;
}
}
require(ownsNFT == true, "RainiLpv3StakingPool: Not the owner");
rainiLpNFT.safeTransferFrom(address(this), _msgSender(), _tokenId);
(
,//uint96 nonce,
,//address operator,
,//address token0,
,//address token1,
,//uint24 fee,
,//int24 tickLower,
,//int24 tickUpper,
uint128 liquidity,
,//uint256 feeGrowthInside0LastX128,
,//uint256 feeGrowthInside1LastX128,
,//uint128 tokensOwed0,
//uint128 tokensOwed1
) = rainiLpNFT.positions(_tokenId);
accountVars[_msgSender()].staked = accountVars[_msgSender()].staked - liquidity;
totalSupply = totalSupply - liquidity;
emit TokensWithdrawn(_msgSender(), liquidity, block.timestamp);
}
function withdrawEth(uint256 _amount)
external onlyOwner {
require(_amount <= address(this).balance, "RainiLpv3StakingPool: not enough balance");
(bool success, ) = _msgSender().call{ value: _amount }("");
require(success, "RainiLpv3StakingPool: transfer failed");
emit EthWithdrawn(_amount);
}
function mint(address[] calldata _addresses, uint256[] calldata _points)
external onlyMinter {
require(_addresses.length == _points.length, "RainiLpv3StakingPool: Arrays not equal");
for (uint256 i = 0; i < _addresses.length; i++) {
accountVars[_addresses[i]].unicornBalance = uint128(accountVars[_addresses[i]].unicornBalance + _points[i]);
emit UnicornPointsMinted(_addresses[i], _points[i]);
}
}
function buyUnicorn(uint256 _amount)
external payable {
require(_amount > 0, "RainiLpv3StakingPool: _amount is zero");
require(msg.value * unicornToEth >= _amount, "RainiLpv3StakingPool: not enougth eth");
accountVars[_msgSender()].unicornBalance = uint128(accountVars[_msgSender()].unicornBalance + _amount);
uint256 refund = msg.value - (_amount / unicornToEth);
if(refund > 0) {
(bool success, ) = _msgSender().call{ value: refund }("");
require(success, "RainiLpv3StakingPool: transfer failed");
}
emit UnicornPointsBought(_msgSender(), _amount);
}
function burn(address _owner, uint256 _amount)
external nonReentrant onlyBurner balanceUpdate(_owner) {
accountVars[_owner].unicornBalance = uint128(accountVars[_owner].unicornBalance - _amount);
emit UnicornPointsBurned(_owner, _amount);
}
function calculateReward(address _owner, uint256 _amount, uint256 _duration)
private view returns(uint128) {
uint256 reward = _duration * rewardRate * _amount / (REWARD_DECIMALS * minRewardStake);
return calculateBonus(_owner, reward, _duration);
}
function calculateBonus(address _owner, uint256 _amount, uint256 _duration)
private view returns(uint128) {
uint256 avgBonus = getCurrentAvgBonus(_owner, _duration);
return uint128(_amount + _amount * avgBonus / BONUS_DECIMALS / 100);
}
// RAINI rewards
function lastTimeRewardApplicable() public view returns (uint256) {
return Math.min(block.timestamp, generalRewardVars.periodFinish);
}
function rainiRewardPerToken() public view returns (uint256) {
GeneralRewardVars memory _generalRewardVars = generalRewardVars;
if (totalSupply == 0) {
return _generalRewardVars.rainiRewardPerTokenStored;
}
return _generalRewardVars.rainiRewardPerTokenStored + (uint256(lastTimeRewardApplicable() - _generalRewardVars.lastUpdateTime) * _generalRewardVars.rainiRewardRate * RAINI_REWARD_DECIMALS) / totalSupply;
}
function rainiEarned(address account) public view returns (uint256) {
AccountRewardVars memory _accountRewardVars = accountRewardVars[account];
AccountVars memory _accountVars = accountVars[account];
uint256 calculatedEarned = (uint256(_accountVars.staked) * (rainiRewardPerToken() - _accountRewardVars.rainiRewardPerTokenPaid)) / RAINI_REWARD_DECIMALS + _accountRewardVars.rainiRewards;
uint256 poolBalance = rainiToken.balanceOf(address(this));
// some rare case the reward can be slightly bigger than real number, we need to check against how much we have left in pool
if (calculatedEarned > poolBalance) return poolBalance;
return calculatedEarned;
}
function addRainiRewardPool(uint256 _amount, uint256 _duration)
external onlyOwner nonReentrant balanceUpdate(address(0)) {
GeneralRewardVars memory _generalRewardVars = generalRewardVars;
if (_generalRewardVars.periodFinish > block.timestamp) {
uint256 timeRemaining = _generalRewardVars.periodFinish - block.timestamp;
_amount += timeRemaining * _generalRewardVars.rainiRewardRate;
}
rainiToken.safeTransferFrom(_msgSender(), address(this), _amount);
_generalRewardVars.rainiRewardRate = uint128(_amount / _duration);
_generalRewardVars.periodFinish = uint32(block.timestamp + _duration);
_generalRewardVars.lastUpdateTime = uint32(block.timestamp);
generalRewardVars = _generalRewardVars;
emit RewardPoolAdded(_amount, _duration, block.timestamp);
}
function abortRainiRewardPool() external onlyOwner nonReentrant balanceUpdate(address(0)) {
GeneralRewardVars memory _generalRewardVars = generalRewardVars;
require (_generalRewardVars.periodFinish > block.timestamp, "Reward pool is not active");
uint256 timeRemaining = _generalRewardVars.periodFinish - block.timestamp;
uint256 remainingAmount = timeRemaining * _generalRewardVars.rainiRewardRate;
rainiToken.transfer(_msgSender(), remainingAmount);
_generalRewardVars.rainiRewardRate = 0;
_generalRewardVars.periodFinish = uint32(block.timestamp);
_generalRewardVars.lastUpdateTime = uint32(block.timestamp);
generalRewardVars = _generalRewardVars;
}
function recoverRaini(uint256 _amount) external onlyOwner nonReentrant {
require(generalRewardVars.periodFinish < block.timestamp, "Raini cannot be recovered while reward pool active.");
rainiToken.transfer(_msgSender(), _amount);
}
function withdrawReward() external nonReentrant balanceUpdate(_msgSender()) {
uint256 reward = rainiEarned(_msgSender());
require(reward > 1, "no reward to withdraw");
if (reward > 1) {
accountRewardVars[_msgSender()].rainiRewards = 0;
rainiToken.safeTransfer(_msgSender(), reward);
}
emit RewardWithdrawn(_msgSender(), reward, block.timestamp);
}
// LP v2 migration
function migrateV2Unicorns() external {
uint256 balance = rainiLpv2StakingPool.balanceOf(_msgSender());
rainiLpv2StakingPool.burn(_msgSender(), balance);
accountVars[_msgSender()].unicornBalance = uint128(accountVars[_msgSender()].unicornBalance + balance);
emit UnicornPointsMinted(_msgSender(), balance);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_rainiLpNFT","type":"address"},{"internalType":"address","name":"_rainiToken","type":"address"},{"internalType":"address","name":"_exchangeToken","type":"address"},{"internalType":"address","name":"_v2Pool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonusDuration","type":"uint256"}],"name":"BonusesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"feeRequired","type":"uint24"}],"name":"FeeRequiredSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RainiLpTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardPoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minRewardStake","type":"uint256"}],"name":"RewardSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int24","name":"minTickUpper","type":"int24"},{"indexed":false,"internalType":"int24","name":"maxTickLower","type":"int24"}],"name":"TickRangeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnicornPointsBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnicornPointsBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnicornPointsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unicornToEth","type":"uint256"}],"name":"UnicornToEthSet","type":"event"},{"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAINI_REWARD_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"abortRainiRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"addRainiRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyUnicorn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exchangeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRequired","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalRewardVars","outputs":[{"internalType":"uint32","name":"lastUpdateTime","type":"uint32"},{"internalType":"uint64","name":"rainiRewardPerTokenStored","type":"uint64"},{"internalType":"uint32","name":"periodFinish","type":"uint32"},{"internalType":"uint128","name":"rainiRewardRate","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"getCurrentAvgBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getCurrentBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"getRewardByDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getStakedPositions","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTickLower","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrateV2Unicorns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minRewardStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTickUpper","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_points","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"rainiEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainiLpNFT","outputs":[{"internalType":"contract INonfungiblePositionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainiLpv2StakingPool","outputs":[{"internalType":"contract RainiLpv2StakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainiRewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainiToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverRaini","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBonus","type":"uint256"},{"internalType":"uint256","name":"_bonusDuration","type":"uint256"}],"name":"setBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_feeRequired","type":"uint24"}],"name":"setFeeRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardRate","type":"uint256"},{"internalType":"uint256","name":"_minRewardStake","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"_maxTickLower","type":"int24"},{"internalType":"int24","name":"_minTickUpper","type":"int24"}],"name":"setTickRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unicornToEth","type":"uint256"}],"name":"setUnicornToEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_tokenId","type":"uint32"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unicornToEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawReward","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162005030380380620050308339810160408190526200003491620001fa565b600180556001600160a01b038416620000b95760405162461bcd60e51b815260206004820152603360248201527f5261696e694c7076335374616b696e67506f6f6c3a205f7261696e694c70546f60448201527f6b656e206973207a65726f206164647265737300000000000000000000000000606482015260840160405180910390fd5b620000c66000336200012d565b600780546001600160a01b03958616690100000000000000000002600160481b600160e81b0319909116179055600a80549285166001600160a01b031993841617905560098054938516938316939093179092556008805492909316911617905562000256565b6200013982826200013d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000139576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001993390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b0381168114620001f557600080fd5b919050565b6000806000806080858703121562000210578384fd5b6200021b85620001dd565b93506200022b60208601620001dd565b92506200023b60408601620001dd565b91506200024b60608601620001dd565b905092959194509250565b614dca80620002666000396000f3fe60806040526004361061031a5760003560e01c80637b0a47ee116101ab578063ac0dc0a6116100f7578063d539139311610095578063e48b6e351161006f578063e48b6e3514610a03578063e4f9e1ea14610a19578063e7345be714610a33578063fe421e3414610a4c5761031a565b8063d53913931461098f578063d547741f146109c3578063e467f7e0146109e35761031a565b8063b09b1a51116100d1578063b09b1a5114610932578063c311d04914610945578063c885bc5814610965578063cc61bb661461097a5761031a565b8063ac0dc0a6146108c7578063ac727831146108e7578063adc3fa531461091b5761031a565b80638812e897116101645780639dc29fac1161013e5780639dc29fac14610852578063a217fddf14610872578063a24c256214610887578063a47bd496146108a75761031a565b80638812e897146107fd57806391d148541461081d5780639aec88ed1461083d5761031a565b80637b0a47ee1461074b5780637dda94c9146107615780637fcfb7c214610781578063802c13ff146107a157806380faa57d146107c157806387d3085c146107d65761031a565b80632e1a7d4d1161026a57806354c5b696116102235780636aece8c4116101fd5780636aece8c4146106a757806370a08231146106d457806372141309146106f45780637896779e1461072b5761031a565b806354c5b6961461065b5780635af123f4146106715780636132dd15146106875761031a565b80632e1a7d4d1461057c5780632f2ff15d1461059c578063308cd81a146105bc57806336568abe146105dc578063399080ec146105fc578063503ea2881461063b5761031a565b806315d21e11116102d757806319979932116102b157806319979932146104ea5780631dc27fde14610500578063248a9ca314610518578063282c51f3146105485761031a565b806315d21e1114610490578063170d236d146104b457806318160ddd146104d45761031a565b806301ffc9a71461031f578063021e79d714610354578063037c99b0146103dd5780630e5d2e21146103ff578063120df3b714610437578063150b7a021461044c575b600080fd5b34801561032b57600080fd5b5061033f61033a366004614817565b610a6c565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50600d5461039e9063ffffffff80821691600160201b81046001600160401b031691600160601b82041690600160801b90046001600160801b031684565b6040805163ffffffff95861681526001600160401b0394909416602085015291909316908201526001600160801b03909116606082015260800161034b565b3480156103e957600080fd5b506103fd6103f83660046148a0565b610aa5565b005b34801561040b57600080fd5b50600a5461041f906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b34801561044357600080fd5b506103fd610b39565b34801561045857600080fd5b50610477610467366004614611565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161034b565b34801561049c57600080fd5b506104a6600b5481565b60405190815260200161034b565b3480156104c057600080fd5b5060095461041f906001600160a01b031681565b3480156104e057600080fd5b506104a6600c5481565b3480156104f657600080fd5b506104a660055481565b34801561050c57600080fd5b506104a6633b9aca0081565b34801561052457600080fd5b506104a66105333660046147d0565b60009081526020819052604090206001015490565b34801561055457600080fd5b506104a67f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b34801561058857600080fd5b506103fd6105973660046147d0565b611065565b3480156105a857600080fd5b506103fd6105b73660046147e8565b611704565b3480156105c857600080fd5b506104a66105d73660046146e9565b611730565b3480156105e857600080fd5b506103fd6105f73660046147e8565b6118cf565b34801561060857600080fd5b506104a66106173660046145f5565b6001600160a01b03166000908152600f60205260409020546001600160801b031690565b34801561064757600080fd5b506103fd6106563660046147d0565b61194d565b34801561066757600080fd5b506104a660045481565b34801561067d57600080fd5b506104a660065481565b34801561069357600080fd5b506103fd6106a236600461483f565b6119b0565b3480156106b357600080fd5b506106c76106c23660046145f5565b611a42565b60405161034b9190614a50565b3480156106e057600080fd5b506104a66106ef3660046145f5565b611ada565b34801561070057600080fd5b5060075461071790600160301b900462ffffff1681565b60405162ffffff909116815260200161034b565b34801561073757600080fd5b5060085461041f906001600160a01b031681565b34801561075757600080fd5b506104a660025481565b34801561076d57600080fd5b506103fd61077c3660046148a0565b611b6c565b34801561078d57600080fd5b506103fd61079c3660046148c1565b612045565b3480156107ad57600080fd5b506103fd6107bc36600461486c565b612993565b3480156107cd57600080fd5b506104a6612a0f565b3480156107e257600080fd5b5060075461041f90600160481b90046001600160a01b031681565b34801561080957600080fd5b506104a66108183660046145f5565b612a33565b34801561082957600080fd5b5061033f6108383660046147e8565b612b0a565b34801561084957600080fd5b506103fd612b33565b34801561085e57600080fd5b506103fd61086d3660046146e9565b612cdf565b34801561087e57600080fd5b506104a6600081565b34801561089357600080fd5b506104a66108a2366004614714565b613110565b3480156108b357600080fd5b506103fd6108c23660046148a0565b61312e565b3480156108d357600080fd5b506104a66108e23660046145f5565b613195565b3480156108f357600080fd5b50600754610908906301000000900460020b81565b60405160029190910b815260200161034b565b34801561092757600080fd5b506104a6620f424081565b6103fd6109403660046147d0565b613326565b34801561095157600080fd5b506103fd6109603660046147d0565b613504565b34801561097157600080fd5b506103fd613624565b34801561098657600080fd5b506104a6613a10565b34801561099b57600080fd5b506104a67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109cf57600080fd5b506103fd6109de3660046147e8565b613af0565b3480156109ef57600080fd5b506103fd6109fe366004614748565b613b16565b348015610a0f57600080fd5b506104a660035481565b348015610a2557600080fd5b506007546109089060020b81565b348015610a3f57600080fd5b506104a664e8d4a5100081565b348015610a5857600080fd5b506103fd610a673660046147d0565b613dc3565b60006001600160e01b03198216637965db0b60e01b1480610a9d57506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b610ab0600033610838565b610ad55760405162461bcd60e51b8152600401610acc90614b12565b60405180910390fd5b610ae3633b9aca0083614c41565b60048190556005829055610af8908290614bfe565b60065560408051838152602081018390527f91748b9e70aede6f70ab0899def21be673bd7a3d850e142963dd688b53ecd5d391015b60405180910390a15050565b610b44600033610838565b610b605760405162461bcd60e51b8152600401610acc90614b12565b60026001541415610b835760405162461bcd60e51b8152600401610acc90614b5e565b600260015560408051608080820183527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5464ffffffffff8116835263ffffffff600160281b820481166020858101919091526001600160681b03600160481b840416858701526001600160401b03600160b01b90930483166060808701919091526000808052600f8352875180890189527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375546001600160801b038082168352600160801b918290048116838701528a519889018b52600d548088168a52600160201b810490981695890195909552600160601b8704909516988701989098529290930416918301919091529290610c9a613a10565b6001600160401b03166020820152610cb0612a0f565b63ffffffff1681526001600160a01b03841615610d93576000836020015142610cd99190614c9f565b90506000610cfb8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151610d0d9190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654610d5d92610d459190861690614c41565b8751610d58919064ffffffffff16614bc0565b613f74565b64ffffffffff168552610d6f86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f8552948390208751888601516001600160801b03918216600160801b9183168202179092558751600d80548a8901518b8901518c8c01519489166001600160601b031990931692909217600160201b9188168202176001600160601b0316600160601b92891683028616179385168602939093179182905587516080810189528288168152928204909516978201979097529286049093169382018490529093041692820192909252904210610f295760405162461bcd60e51b815260206004820152601960248201527f52657761726420706f6f6c206973206e6f7420616374697665000000000000006044820152606401610acc565b600042826040015163ffffffff16610f419190614c88565b9050600082606001516001600160801b031682610f5e9190614c41565b6009549091506001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906147b0565b5050600060608301525063ffffffff421660408201819052808252600d8054602090930151600160601b83026001600160801b03166001600160601b036001600160401b03909216600160201b026001600160601b031990951690931793909317929092161790555050600180555050565b600260015414156110885760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161116c613a10565b6001600160401b03166020820152611182612a0f565b63ffffffff1681526001600160a01b0384161561124d5760008360200151426111ab9190614c9f565b905060006111cd8685600001516001600160801b03168463ffffffff16613f27565b90508084602001516111df9190614b95565b6001600160801b031660208086019190915263ffffffff4281169187019190915260045460065461121792610d459190861690614c41565b64ffffffffff16855261122986613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f85528386208851898701516001600160801b03918216600160801b9183168202179092558851600d8054988b0151978b0151948b01519187166001600160601b031990991698909817600160201b9790951696909602939093176001600160601b0316600160601b9290941691909102821692909217921602179055806010816113723390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561140857602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116113cb5790505b5050505050905060005b81518110156114c2578782828151811061143c57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff1614156114b0573360009081526010602052604090208054600194508290811061148357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690556114c2565b806114ba81614cff565b915050611412565b506001821515146115215760405162461bcd60e51b815260206004820152602360248201527f5261696e694c7076335374616b696e67506f6f6c3a204e6f7420746865206f776044820152623732b960e91b6064820152608401610acc565b600754600160481b90046001600160a01b03166342842e0e306115413390565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018a9052606401600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505060075460405163133f757160e31b8152600481018b905260009350600160481b9091046001600160a01b031691506399fbab88906024016101806040518083038186803b1580156115f657600080fd5b505afa15801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e91906148e5565b5050505097505050505050505080600f60006116473390565b6001600160a01b0316815260208101919091526040016000205461167491906001600160801b0316614c60565b336000908152600f6020526040902080546001600160801b0319166001600160801b03928316179055600c546116ac91831690614c88565b600c55604080513381526001600160801b0383166020820152428183015290517fffe903c0abe6b2dbb2f3474ef43d7a3c1fca49e5a774453423ca8e1952aabffa9181900360600190a1505060018055505050505050565b60008281526020819052604090206001015461172181335b613f8a565b61172b8383613fee565b505050565b6001600160a01b0382166000818152600e602090815260408083208151608081018352905464ffffffffff81168252600160281b810463ffffffff1682850152600160481b81046001600160681b031682840152600160b01b90046001600160401b03166060820152938352600f9091528120549091906001600160801b03166117be5760009150506118c9565b6000600454826000015164ffffffffff1610156118c0576000600654836000015164ffffffffff166004546117f39190614c88565b6117fd9190614bfe565b905080851115611874576000600282600454866000015164ffffffffff166118259190614bc0565b61182f9190614c41565b6118399190614bfe565b905060006118478388614c88565b6004546118549190614c41565b9050866118618284614bc0565b61186b9190614bfe565b935050506118ba565b6002836000015164ffffffffff16866006546118909190614c41565b85516118a3919064ffffffffff16614bc0565b6118ad9190614bc0565b6118b79190614bfe565b91505b506118c5565b506004545b9150505b92915050565b6001600160a01b038116331461193f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610acc565b6119498282614072565b5050565b611958600033610838565b6119745760405162461bcd60e51b8152600401610acc90614b12565b600b8190556040518181527fb7cf93fdd1a223f775d0ba0c876449f55dba0345d09446d623a0415546cf3aac906020015b60405180910390a150565b6119bb600033610838565b6119d75760405162461bcd60e51b8152600401610acc90614b12565b60078054600284810b62ffffff90811663010000000265ffffffffffff199093169185900b16171790556040517fb7bbb6b57b22be6ae3dd52b5b998d54e6316abe14b5997daa8be7c301b3b52ba90610b2d9083908590600292830b8152910b602082015260400190565b6001600160a01b038116600090815260106020908152604091829020805483518184028101840190945280845260609392830182828015611ace57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611a915790505b50505050509050919050565b6001600160a01b0381166000908152600f6020908152604080832054600e9092528220548291611b2c9185916001600160801b031690611b2790600160281b900463ffffffff1642614c88565b613f27565b6001600160a01b0384166000908152600f60205260409020546001600160801b039182169250611b65918391600160801b900416614bc0565b9392505050565b611b77600033610838565b611b935760405162461bcd60e51b8152600401610acc90614b12565b60026001541415611bb65760405162461bcd60e51b8152600401610acc90614b5e565b600260015560408051608080820183527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5464ffffffffff8116835263ffffffff600160281b820481166020858101919091526001600160681b03600160481b840416858701526001600160401b03600160b01b90930483166060808701919091526000808052600f8352875180890189527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375546001600160801b038082168352600160801b918290048116838701528a519889018b52600d548088168a52600160201b810490981695890195909552600160601b8704909516988701989098529290930416918301919091529290611ccd613a10565b6001600160401b03166020820152611ce3612a0f565b63ffffffff1681526001600160a01b03841615611dae576000836020015142611d0c9190614c9f565b90506000611d2e8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151611d409190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654611d7892610d459190861690614c41565b64ffffffffff168552611d8a86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f8552948390208751888601516001600160801b03918216600160801b9183168202179092558751600d80548a8901518b8901518c8c01519489166001600160601b031990931692909217600160201b9188168202176001600160601b0316600160601b9289168302861617938516860293909317918290558751608081018952828816815292820490951697820197909752928604909316938201849052909304169282019290925290421015611f3e57600042826040015163ffffffff16611f159190614c88565b905081606001516001600160801b031681611f309190614c41565b611f3a9089614bc0565b9750505b611f56336009546001600160a01b031690308a6140d7565b611f608688614bfe565b6001600160801b03166060820152611f788642614bc0565b63ffffffff908116604080840182905242928316808552600d8054602087015160608801516001600160801b03908116600160801b02600160601b909702166001600160601b036001600160401b03909216600160201b026001600160601b031990931690941791909117169190911792909217909155517fa75222b3beec2334fd33dea12c05fdf6c4187c226b9ab605a606cc31fb5194f791612030918a918a919283526020830191909152604082015260600190565b60405180910390a15050600180555050505050565b600260015414156120685760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161214c613a10565b6001600160401b03166020820152612162612a0f565b63ffffffff1681526001600160a01b0384161561222d57600083602001514261218b9190614c9f565b905060006121ad8685600001516001600160801b03168463ffffffff16613f27565b90508084602001516121bf9190614b95565b6001600160801b031660208086019190915263ffffffff428116918701919091526004546006546121f792610d459190861690614c41565b64ffffffffff16855261220986613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b038481166000908152600e6020908152604080832087518154898501518a8501516060808d015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b03909216820267ffffffffffffffff60b01b191617600160b01b6001600160401b039586160217909455600f86528487208a518b8801516001600160801b03918216600160801b9183168202179092558a51600d8054998d01518d8a0151968e01519286166001600160601b0319909b169a909a17600160201b9a90971699909902959095176001600160601b0316600160601b948416949094028116939093179390921690910291909117909355600754915163133f757160e31b8152928a16600484015292938493849384938493849390910416906399fbab88906024016101806040518083038186803b15801561239757600080fd5b505afa1580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf91906148e5565b505050509750975097509750975097505050600760009054906101000a900460020b60020b8260020b136124555760405162461bcd60e51b815260206004820152602760248201527f5261696e694c7076335374616b696e67506f6f6c3a207469636b557070657220604482015266746f6f206c6f7760c81b6064820152608401610acc565b60075463010000009004600290810b810b9084900b126124c85760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a207469636b4c6f776572206044820152670e8dede40d0d2ced60c31b6064820152608401610acc565b600a546001600160a01b0387811691161480156124f257506009546001600160a01b038681169116145b806125225750600a546001600160a01b03868116911614801561252257506009546001600160a01b038781169116145b6125835760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a204e465420746f6b656e7360448201526b081b9bdd0818dbdc9c9958dd60a21b6064820152608401610acc565b60075462ffffff858116600160301b90920416146125f45760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a2066656520213d2066656560448201526714995c5d5a5c995960c21b6064820152608401610acc565b600754600160481b90046001600160a01b03166342842e0e6126133390565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015263ffffffff8e166044820152606401600060405180830381600087803b15801561266657600080fd5b505af115801561267a573d6000803e3d6000fd5b5050505060006010600061268b3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561272157602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116126e45790505b505050505090506000805b82518110156127eb5782818151811061275557634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16600014156127d95733600090815260106020526040902080548f91908390811061279d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550600191506127eb565b806127e381614cff565b91505061272c565b50806128635760106000336001600160a01b03166001600160a01b031681526020019081526020016000208d90806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff1602179055505b826001600160801b0316600c5461287a9190614bc0565b600c55336000908152600f60205260409020546001600160801b03166128a08482614b95565b336000908152600f6020526040902080546001600160801b0319166001600160801b03929092169190911790556128d78482614b95565b336000908152600e60205260409020546128f990839064ffffffffff16614c12565b6129039190614bd8565b336000818152600e60205260409020805464ffffffffff191664ffffffffff93909316929092179091557fdd2a19c3bdd089cbe77c04f5655f83de0504d6140d12c8667646f55d0557c4dc90604080516001600160a01b0390921682526001600160801b0387166020830152429082015260600160405180910390a1505060018055505050505050505050505050565b61299e600033610838565b6129ba5760405162461bcd60e51b8152600401610acc90614b12565b6007805468ffffff0000000000001916600160301b62ffffff8416908102919091179091556040519081527f150007d835ba6a879365dbd0ec151d80c05fec6bcb4b7a21f22e3ba2115dd227906020016119a5565b600d54600090612a2d904290600160601b900463ffffffff16613f74565b90505b90565b6001600160a01b0381166000818152600e602090815260408083208151608081018352905464ffffffffff81168252600160281b810463ffffffff1682850152600160481b81046001600160681b031682840152600160b01b90046001600160401b03166060820152938352600f9091528120549091906001600160801b0316612ac1576000915050610aa0565b6000816020015163ffffffff1642612ad99190614c88565b9050612b0260045482600654612aef9190614c41565b8451610d58919064ffffffffff16614bc0565b949350505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6008546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbf9190614888565b6008549091506001600160a01b0316639dc29fac336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b5050505080600f6000612c403390565b6001600160a01b03168152602081019190915260400160002054612c749190600160801b90046001600160801b0316614bc0565b336000818152600f6020526040902080546001600160801b03938416600160801b029316929092179091557fccf7b2bbc1b9e2aff9848ffc047297bfc64f47a18d250b12da287200b15920f190604080516001600160a01b03909216825260208201849052016119a5565b60026001541415612d025760405162461bcd60e51b8152600401610acc90614b5e565b6002600155612d317f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610838565b612d925760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060448201526b3737ba103090313ab93732b960a11b6064820152608401610acc565b6001600160a01b0382166000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152978752600f8652958490208451808601865290546001600160801b038082168352600160801b9182900481168389015286519586018752600d54808a168752600160201b810490941697860197909752600160601b8304909716948401949094529490940490921693820193909352849290612e7d613a10565b6001600160401b03166020820152612e93612a0f565b63ffffffff1681526001600160a01b03841615612f5e576000836020015142612ebc9190614c9f565b90506000612ede8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151612ef09190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654612f2892610d459190861690614c41565b64ffffffffff168552612f3a86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b038481166000908152600e6020908152604080832087518154898501518a8501516060808d015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f855283862089518a8701516001600160801b03918216600160801b9183168202179092558951600d8054988c01518c890151958d01519288166001600160601b0319909a1699909917600160201b9990961698909802949094176001600160601b0316600160601b9390951692909202821693909317918116830291909117909355938a16835290912054613096928892910416614c88565b6001600160a01b0387166000818152600f602090815260409182902080546001600160801b03958616600160801b0295169490941790935580519182529181018790527f2dcfcb8dd7f92a1441a21ffa64ff110b029b8c14727dc57c22d5e3a7dad20b72910160405180910390a150506001805550505050565b600061311d848484613f27565b6001600160801b0316949350505050565b613139600033610838565b6131555760405162461bcd60e51b8152600401610acc90614b12565b6002829055600381905560408051838152602081018390527fb1364803920b7aa08b58c240c989062d8ebd96ab4bd352792350afbab26c82399101610b2d565b6001600160a01b0381166000818152600e602090815260408083208151608081018352905464ffffffffff8116825263ffffffff600160281b820416828501526001600160681b03600160481b820481168385019081526001600160401b03600160b01b909304831660608501908152978752600f86528487208551808701909652546001600160801b038082168752600160801b909104169585019590955293519551949591949293869392169164e8d4a510009116613254613a10565b61325e9190614c88565b845161327391906001600160801b0316614c41565b61327d9190614bfe565b6132879190614bc0565b6009546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190614888565b90508082111561331d579350610aa092505050565b50949350505050565b600081116133845760405162461bcd60e51b815260206004820152602560248201527f5261696e694c7076335374616b696e67506f6f6c3a205f616d6f756e74206973604482015264207a65726f60d81b6064820152608401610acc565b80600b54346133939190614c41565b10156133ef5760405162461bcd60e51b815260206004820152602560248201527f5261696e694c7076335374616b696e67506f6f6c3a206e6f7420656e6f7567746044820152640d040cae8d60db1b6064820152608401610acc565b336000908152600f602052604090205461341a908290600160801b90046001600160801b0316614bc0565b336000908152600f6020526040812080546001600160801b03938416600160801b02931692909217909155600b546134529083614bfe565b61345c9034614c88565b905080156134ce57604051600090339083908381818185875af1925050503d80600081146134a6576040519150601f19603f3d011682016040523d82523d6000602084013e6134ab565b606091505b50509050806134cc5760405162461bcd60e51b8152600401610acc90614acd565b505b60408051338152602081018490527ff69bff6f82b14616cf3bdf5d36a1504928849f54e2a949024c97f722523641ca9101610b2d565b61350f600033610838565b61352b5760405162461bcd60e51b8152600401610acc90614b12565b4781111561358c5760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a206e6f7420656e6f7567686044820152672062616c616e636560c01b6064820152608401610acc565b604051600090339083908381818185875af1925050503d80600081146135ce576040519150601f19603f3d011682016040523d82523d6000602084013e6135d3565b606091505b50509050806135f45760405162461bcd60e51b8152600401610acc90614acd565b6040518281527f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d90602001610b2d565b600260015414156136475760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161372b613a10565b6001600160401b03166020820152613741612a0f565b63ffffffff1681526001600160a01b0384161561380c57600083602001514261376a9190614c9f565b9050600061378c8685600001516001600160801b03168463ffffffff16613f27565b905080846020015161379e9190614b95565b6001600160801b031660208086019190915263ffffffff428116918701919091526004546006546137d692610d459190861690614c41565b64ffffffffff1685526137e886613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f85528386208851898701516001600160801b03918216600160801b9183168202179092558851600d8054988b0151978b0151948b01519187166001600160601b031990991698909817600160201b9790951696909602939093176001600160601b0316600160601b92909416919091028216929092179216021790556139306108e23390565b90506001811161397a5760405162461bcd60e51b81526020600482015260156024820152746e6f2072657761726420746f20776974686472617760581b6044820152606401610acc565b60018111156139c657336000818152600e60205260409020805475ffffffffffffffffffffffffff000000000000000000191690556139c6906009546001600160a01b03169083614148565b6040805133815260208101839052428183015290517fa41482a3e45841df1c6d33f45217a1cbe5ce4c6ab246e31f4e5efdef0acfeea29181900360600190a1505060018055505050565b60408051608081018252600d5463ffffffff8082168352600160201b82046001600160401b03166020840152600160601b82041692820192909252600160801b9091046001600160801b03166060820152600c5460009190613a8057602001516001600160401b03169050612a30565b600c5464e8d4a5100082606001516001600160801b0316836000015163ffffffff16613aaa612a0f565b613ab49190614c88565b613abe9190614c41565b613ac89190614c41565b613ad29190614bfe565b81602001516001600160401b0316613aea9190614bc0565b91505090565b600082815260208190526040902060010154613b0c813361171c565b61172b8383614072565b613b407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610838565b613ba15760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060448201526b3737ba10309036b4b73a32b960a11b6064820152608401610acc565b828114613bff5760405162461bcd60e51b815260206004820152602660248201527f5261696e694c7076335374616b696e67506f6f6c3a20417272617973206e6f7460448201526508195c5d585b60d21b6064820152608401610acc565b60005b83811015613dbc57828282818110613c2a57634e487b7160e01b600052603260045260246000fd5b90506020020135600f6000878785818110613c5557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613c6a91906145f5565b6001600160a01b03168152602081019190915260400160002054613c9e9190600160801b90046001600160801b0316614bc0565b600f6000878785818110613cc257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613cd791906145f5565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790557fccf7b2bbc1b9e2aff9848ffc047297bfc64f47a18d250b12da287200b15920f1858583818110613d4c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613d6191906145f5565b848484818110613d8157634e487b7160e01b600052603260045260246000fd5b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180613db481614cff565b915050613c02565b5050505050565b613dce600033610838565b613dea5760405162461bcd60e51b8152600401610acc90614b12565b60026001541415613e0d5760405162461bcd60e51b8152600401610acc90614b5e565b6002600155600d5442600160601b90910463ffffffff1610613e8d5760405162461bcd60e51b815260206004820152603360248201527f5261696e692063616e6e6f74206265207265636f7665726564207768696c65206044820152723932bbb0b932103837b7b61030b1ba34bb329760691b6064820152608401610acc565b6009546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015613ee757600080fd5b505af1158015613efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1f91906147b0565b505060018055565b600080600354620f4240613f3b9190614c41565b8460025485613f4a9190614c41565b613f549190614c41565b613f5e9190614bfe565b9050613f6b858285614178565b95945050505050565b6000818310613f835781611b65565b5090919050565b613f948282612b0a565b61194957613fac816001600160a01b031660146141b6565b613fb78360206141b6565b604051602001613fc89291906149db565b60408051601f198184030181529082905262461bcd60e51b8252610acc91600401614a9a565b613ff88282612b0a565b611949576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561402e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61407c8282612b0a565b15611949576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526141429085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614397565b50505050565b6040516001600160a01b03831660248201526044810182905261172b90849063a9059cbb60e01b9060640161410b565b6000806141858584611730565b90506064633b9aca006141988387614c41565b6141a29190614bfe565b6141ac9190614bfe565b613f6b9085614bc0565b606060006141c5836002614c41565b6141d0906002614bc0565b6001600160401b038111156141f557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561421f576020820181803683370190505b509050600360fc1b8160008151811061424857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061428557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006142a9846002614c41565b6142b4906001614bc0565b90505b6001811115614348576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106142f657634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061431a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361434181614ce8565b90506142b7565b508315611b655760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610acc565b60006143ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166144699092919063ffffffff16565b80519091501561172b578080602001905181019061440a91906147b0565b61172b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610acc565b6060612b02848460008585843b6144c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610acc565b600080866001600160a01b031685876040516144de91906149bf565b60006040518083038185875af1925050503d806000811461451b576040519150601f19603f3d011682016040523d82523d6000602084013e614520565b606091505b509150915061453082828661453b565b979650505050505050565b6060831561454a575081611b65565b82511561455a5782518084602001fd5b8160405162461bcd60e51b8152600401610acc9190614a9a565b8051610aa081614d5c565b60008083601f840112614590578081fd5b5081356001600160401b038111156145a6578182fd5b6020830191508360208260051b85010111156145c157600080fd5b9250929050565b8051610aa081614d74565b80516001600160801b0381168114610aa057600080fd5b8051610aa081614d83565b600060208284031215614606578081fd5b8135611b6581614d5c565b60008060008060808587031215614626578283fd5b843561463181614d5c565b9350602085013561464181614d5c565b92506040850135915060608501356001600160401b0380821115614663578283fd5b818701915087601f830112614676578283fd5b81358181111561468857614688614d46565b604051601f8201601f19908116603f011681019083821181831017156146b0576146b0614d46565b816040528281528a60208487010111156146c8578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156146fb578182fd5b823561470681614d5c565b946020939093013593505050565b600080600060608486031215614728578283fd5b833561473381614d5c565b95602085013595506040909401359392505050565b6000806000806040858703121561475d578384fd5b84356001600160401b0380821115614773578586fd5b61477f8883890161457f565b90965094506020870135915080821115614797578384fd5b506147a48782880161457f565b95989497509550505050565b6000602082840312156147c1578081fd5b81518015158114611b65578182fd5b6000602082840312156147e1578081fd5b5035919050565b600080604083850312156147fa578182fd5b82359150602083013561480c81614d5c565b809150509250929050565b600060208284031215614828578081fd5b81356001600160e01b031981168114611b65578182fd5b60008060408385031215614851578182fd5b823561485c81614d74565b9150602083013561480c81614d74565b60006020828403121561487d578081fd5b8135611b6581614d83565b600060208284031215614899578081fd5b5051919050565b600080604083850312156148b2578182fd5b50508035926020909101359150565b6000602082840312156148d2578081fd5b813563ffffffff81168114611b65578182fd5b6000806000806000806000806000806000806101808d8f03121561490757898afd5b8c516001600160601b038116811461491d578a8bfd5b9b5061492b60208e01614574565b9a5061493960408e01614574565b995061494760608e01614574565b985061495560808e016145ea565b975061496360a08e016145c8565b965061497160c08e016145c8565b955061497f60e08e016145d3565b94506101008d015193506101208d0151925061499e6101408e016145d3565b91506149ad6101608e016145d3565b90509295989b509295989b509295989b565b600082516149d1818460208701614cbc565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614a13816017850160208801614cbc565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614a44816028840160208801614cbc565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614a8e57835163ffffffff1683529284019291840191600101614a6c565b50909695505050505050565b6000602082528251806020840152614ab9816040850160208701614cbc565b601f01601f19169190910160400192915050565b60208082526025908201527f5261696e694c7076335374616b696e67506f6f6c3a207472616e736665722066604082015264185a5b195960da1b606082015260800190565b6020808252602c908201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060408201526b3737ba1030b71037bbb732b960a11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006001600160801b03808316818516808303821115614bb757614bb7614d1a565b01949350505050565b60008219821115614bd357614bd3614d1a565b500190565b60006001600160801b0380841680614bf257614bf2614d30565b92169190910492915050565b600082614c0d57614c0d614d30565b500490565b60006001600160801b0380831681851681830481118215151615614c3857614c38614d1a565b02949350505050565b6000816000190483118215151615614c5b57614c5b614d1a565b500290565b60006001600160801b0383811690831681811015614c8057614c80614d1a565b039392505050565b600082821015614c9a57614c9a614d1a565b500390565b600063ffffffff83811690831681811015614c8057614c80614d1a565b60005b83811015614cd7578181015183820152602001614cbf565b838111156141425750506000910152565b600081614cf757614cf7614d1a565b506000190190565b6000600019821415614d1357614d13614d1a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614d7157600080fd5b50565b8060020b8114614d7157600080fd5b62ffffff81168114614d7157600080fdfea2646970667358221220f6cc43ca86573fdfcda498fdb0dd5a0f8d6469c99559cd58843a2baf89385fbe64736f6c63430008030033000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000eb953eda0dc65e3246f43dc8fa13f35623bdd5ed000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002927a1712f3eb8ed22bbfeccabb4392fc16a4f6a
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80637b0a47ee116101ab578063ac0dc0a6116100f7578063d539139311610095578063e48b6e351161006f578063e48b6e3514610a03578063e4f9e1ea14610a19578063e7345be714610a33578063fe421e3414610a4c5761031a565b8063d53913931461098f578063d547741f146109c3578063e467f7e0146109e35761031a565b8063b09b1a51116100d1578063b09b1a5114610932578063c311d04914610945578063c885bc5814610965578063cc61bb661461097a5761031a565b8063ac0dc0a6146108c7578063ac727831146108e7578063adc3fa531461091b5761031a565b80638812e897116101645780639dc29fac1161013e5780639dc29fac14610852578063a217fddf14610872578063a24c256214610887578063a47bd496146108a75761031a565b80638812e897146107fd57806391d148541461081d5780639aec88ed1461083d5761031a565b80637b0a47ee1461074b5780637dda94c9146107615780637fcfb7c214610781578063802c13ff146107a157806380faa57d146107c157806387d3085c146107d65761031a565b80632e1a7d4d1161026a57806354c5b696116102235780636aece8c4116101fd5780636aece8c4146106a757806370a08231146106d457806372141309146106f45780637896779e1461072b5761031a565b806354c5b6961461065b5780635af123f4146106715780636132dd15146106875761031a565b80632e1a7d4d1461057c5780632f2ff15d1461059c578063308cd81a146105bc57806336568abe146105dc578063399080ec146105fc578063503ea2881461063b5761031a565b806315d21e11116102d757806319979932116102b157806319979932146104ea5780631dc27fde14610500578063248a9ca314610518578063282c51f3146105485761031a565b806315d21e1114610490578063170d236d146104b457806318160ddd146104d45761031a565b806301ffc9a71461031f578063021e79d714610354578063037c99b0146103dd5780630e5d2e21146103ff578063120df3b714610437578063150b7a021461044c575b600080fd5b34801561032b57600080fd5b5061033f61033a366004614817565b610a6c565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50600d5461039e9063ffffffff80821691600160201b81046001600160401b031691600160601b82041690600160801b90046001600160801b031684565b6040805163ffffffff95861681526001600160401b0394909416602085015291909316908201526001600160801b03909116606082015260800161034b565b3480156103e957600080fd5b506103fd6103f83660046148a0565b610aa5565b005b34801561040b57600080fd5b50600a5461041f906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b34801561044357600080fd5b506103fd610b39565b34801561045857600080fd5b50610477610467366004614611565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161034b565b34801561049c57600080fd5b506104a6600b5481565b60405190815260200161034b565b3480156104c057600080fd5b5060095461041f906001600160a01b031681565b3480156104e057600080fd5b506104a6600c5481565b3480156104f657600080fd5b506104a660055481565b34801561050c57600080fd5b506104a6633b9aca0081565b34801561052457600080fd5b506104a66105333660046147d0565b60009081526020819052604090206001015490565b34801561055457600080fd5b506104a67f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b34801561058857600080fd5b506103fd6105973660046147d0565b611065565b3480156105a857600080fd5b506103fd6105b73660046147e8565b611704565b3480156105c857600080fd5b506104a66105d73660046146e9565b611730565b3480156105e857600080fd5b506103fd6105f73660046147e8565b6118cf565b34801561060857600080fd5b506104a66106173660046145f5565b6001600160a01b03166000908152600f60205260409020546001600160801b031690565b34801561064757600080fd5b506103fd6106563660046147d0565b61194d565b34801561066757600080fd5b506104a660045481565b34801561067d57600080fd5b506104a660065481565b34801561069357600080fd5b506103fd6106a236600461483f565b6119b0565b3480156106b357600080fd5b506106c76106c23660046145f5565b611a42565b60405161034b9190614a50565b3480156106e057600080fd5b506104a66106ef3660046145f5565b611ada565b34801561070057600080fd5b5060075461071790600160301b900462ffffff1681565b60405162ffffff909116815260200161034b565b34801561073757600080fd5b5060085461041f906001600160a01b031681565b34801561075757600080fd5b506104a660025481565b34801561076d57600080fd5b506103fd61077c3660046148a0565b611b6c565b34801561078d57600080fd5b506103fd61079c3660046148c1565b612045565b3480156107ad57600080fd5b506103fd6107bc36600461486c565b612993565b3480156107cd57600080fd5b506104a6612a0f565b3480156107e257600080fd5b5060075461041f90600160481b90046001600160a01b031681565b34801561080957600080fd5b506104a66108183660046145f5565b612a33565b34801561082957600080fd5b5061033f6108383660046147e8565b612b0a565b34801561084957600080fd5b506103fd612b33565b34801561085e57600080fd5b506103fd61086d3660046146e9565b612cdf565b34801561087e57600080fd5b506104a6600081565b34801561089357600080fd5b506104a66108a2366004614714565b613110565b3480156108b357600080fd5b506103fd6108c23660046148a0565b61312e565b3480156108d357600080fd5b506104a66108e23660046145f5565b613195565b3480156108f357600080fd5b50600754610908906301000000900460020b81565b60405160029190910b815260200161034b565b34801561092757600080fd5b506104a6620f424081565b6103fd6109403660046147d0565b613326565b34801561095157600080fd5b506103fd6109603660046147d0565b613504565b34801561097157600080fd5b506103fd613624565b34801561098657600080fd5b506104a6613a10565b34801561099b57600080fd5b506104a67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109cf57600080fd5b506103fd6109de3660046147e8565b613af0565b3480156109ef57600080fd5b506103fd6109fe366004614748565b613b16565b348015610a0f57600080fd5b506104a660035481565b348015610a2557600080fd5b506007546109089060020b81565b348015610a3f57600080fd5b506104a664e8d4a5100081565b348015610a5857600080fd5b506103fd610a673660046147d0565b613dc3565b60006001600160e01b03198216637965db0b60e01b1480610a9d57506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b610ab0600033610838565b610ad55760405162461bcd60e51b8152600401610acc90614b12565b60405180910390fd5b610ae3633b9aca0083614c41565b60048190556005829055610af8908290614bfe565b60065560408051838152602081018390527f91748b9e70aede6f70ab0899def21be673bd7a3d850e142963dd688b53ecd5d391015b60405180910390a15050565b610b44600033610838565b610b605760405162461bcd60e51b8152600401610acc90614b12565b60026001541415610b835760405162461bcd60e51b8152600401610acc90614b5e565b600260015560408051608080820183527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5464ffffffffff8116835263ffffffff600160281b820481166020858101919091526001600160681b03600160481b840416858701526001600160401b03600160b01b90930483166060808701919091526000808052600f8352875180890189527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375546001600160801b038082168352600160801b918290048116838701528a519889018b52600d548088168a52600160201b810490981695890195909552600160601b8704909516988701989098529290930416918301919091529290610c9a613a10565b6001600160401b03166020820152610cb0612a0f565b63ffffffff1681526001600160a01b03841615610d93576000836020015142610cd99190614c9f565b90506000610cfb8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151610d0d9190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654610d5d92610d459190861690614c41565b8751610d58919064ffffffffff16614bc0565b613f74565b64ffffffffff168552610d6f86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f8552948390208751888601516001600160801b03918216600160801b9183168202179092558751600d80548a8901518b8901518c8c01519489166001600160601b031990931692909217600160201b9188168202176001600160601b0316600160601b92891683028616179385168602939093179182905587516080810189528288168152928204909516978201979097529286049093169382018490529093041692820192909252904210610f295760405162461bcd60e51b815260206004820152601960248201527f52657761726420706f6f6c206973206e6f7420616374697665000000000000006044820152606401610acc565b600042826040015163ffffffff16610f419190614c88565b9050600082606001516001600160801b031682610f5e9190614c41565b6009549091506001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff391906147b0565b5050600060608301525063ffffffff421660408201819052808252600d8054602090930151600160601b83026001600160801b03166001600160601b036001600160401b03909216600160201b026001600160601b031990951690931793909317929092161790555050600180555050565b600260015414156110885760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161116c613a10565b6001600160401b03166020820152611182612a0f565b63ffffffff1681526001600160a01b0384161561124d5760008360200151426111ab9190614c9f565b905060006111cd8685600001516001600160801b03168463ffffffff16613f27565b90508084602001516111df9190614b95565b6001600160801b031660208086019190915263ffffffff4281169187019190915260045460065461121792610d459190861690614c41565b64ffffffffff16855261122986613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f85528386208851898701516001600160801b03918216600160801b9183168202179092558851600d8054988b0151978b0151948b01519187166001600160601b031990991698909817600160201b9790951696909602939093176001600160601b0316600160601b9290941691909102821692909217921602179055806010816113723390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561140857602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116113cb5790505b5050505050905060005b81518110156114c2578782828151811061143c57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff1614156114b0573360009081526010602052604090208054600194508290811061148357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690556114c2565b806114ba81614cff565b915050611412565b506001821515146115215760405162461bcd60e51b815260206004820152602360248201527f5261696e694c7076335374616b696e67506f6f6c3a204e6f7420746865206f776044820152623732b960e91b6064820152608401610acc565b600754600160481b90046001600160a01b03166342842e0e306115413390565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018a9052606401600060405180830381600087803b15801561159057600080fd5b505af11580156115a4573d6000803e3d6000fd5b505060075460405163133f757160e31b8152600481018b905260009350600160481b9091046001600160a01b031691506399fbab88906024016101806040518083038186803b1580156115f657600080fd5b505afa15801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e91906148e5565b5050505097505050505050505080600f60006116473390565b6001600160a01b0316815260208101919091526040016000205461167491906001600160801b0316614c60565b336000908152600f6020526040902080546001600160801b0319166001600160801b03928316179055600c546116ac91831690614c88565b600c55604080513381526001600160801b0383166020820152428183015290517fffe903c0abe6b2dbb2f3474ef43d7a3c1fca49e5a774453423ca8e1952aabffa9181900360600190a1505060018055505050505050565b60008281526020819052604090206001015461172181335b613f8a565b61172b8383613fee565b505050565b6001600160a01b0382166000818152600e602090815260408083208151608081018352905464ffffffffff81168252600160281b810463ffffffff1682850152600160481b81046001600160681b031682840152600160b01b90046001600160401b03166060820152938352600f9091528120549091906001600160801b03166117be5760009150506118c9565b6000600454826000015164ffffffffff1610156118c0576000600654836000015164ffffffffff166004546117f39190614c88565b6117fd9190614bfe565b905080851115611874576000600282600454866000015164ffffffffff166118259190614bc0565b61182f9190614c41565b6118399190614bfe565b905060006118478388614c88565b6004546118549190614c41565b9050866118618284614bc0565b61186b9190614bfe565b935050506118ba565b6002836000015164ffffffffff16866006546118909190614c41565b85516118a3919064ffffffffff16614bc0565b6118ad9190614bc0565b6118b79190614bfe565b91505b506118c5565b506004545b9150505b92915050565b6001600160a01b038116331461193f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610acc565b6119498282614072565b5050565b611958600033610838565b6119745760405162461bcd60e51b8152600401610acc90614b12565b600b8190556040518181527fb7cf93fdd1a223f775d0ba0c876449f55dba0345d09446d623a0415546cf3aac906020015b60405180910390a150565b6119bb600033610838565b6119d75760405162461bcd60e51b8152600401610acc90614b12565b60078054600284810b62ffffff90811663010000000265ffffffffffff199093169185900b16171790556040517fb7bbb6b57b22be6ae3dd52b5b998d54e6316abe14b5997daa8be7c301b3b52ba90610b2d9083908590600292830b8152910b602082015260400190565b6001600160a01b038116600090815260106020908152604091829020805483518184028101840190945280845260609392830182828015611ace57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611a915790505b50505050509050919050565b6001600160a01b0381166000908152600f6020908152604080832054600e9092528220548291611b2c9185916001600160801b031690611b2790600160281b900463ffffffff1642614c88565b613f27565b6001600160a01b0384166000908152600f60205260409020546001600160801b039182169250611b65918391600160801b900416614bc0565b9392505050565b611b77600033610838565b611b935760405162461bcd60e51b8152600401610acc90614b12565b60026001541415611bb65760405162461bcd60e51b8152600401610acc90614b5e565b600260015560408051608080820183527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c5464ffffffffff8116835263ffffffff600160281b820481166020858101919091526001600160681b03600160481b840416858701526001600160401b03600160b01b90930483166060808701919091526000808052600f8352875180890189527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375546001600160801b038082168352600160801b918290048116838701528a519889018b52600d548088168a52600160201b810490981695890195909552600160601b8704909516988701989098529290930416918301919091529290611ccd613a10565b6001600160401b03166020820152611ce3612a0f565b63ffffffff1681526001600160a01b03841615611dae576000836020015142611d0c9190614c9f565b90506000611d2e8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151611d409190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654611d7892610d459190861690614c41565b64ffffffffff168552611d8a86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f8552948390208751888601516001600160801b03918216600160801b9183168202179092558751600d80548a8901518b8901518c8c01519489166001600160601b031990931692909217600160201b9188168202176001600160601b0316600160601b9289168302861617938516860293909317918290558751608081018952828816815292820490951697820197909752928604909316938201849052909304169282019290925290421015611f3e57600042826040015163ffffffff16611f159190614c88565b905081606001516001600160801b031681611f309190614c41565b611f3a9089614bc0565b9750505b611f56336009546001600160a01b031690308a6140d7565b611f608688614bfe565b6001600160801b03166060820152611f788642614bc0565b63ffffffff908116604080840182905242928316808552600d8054602087015160608801516001600160801b03908116600160801b02600160601b909702166001600160601b036001600160401b03909216600160201b026001600160601b031990931690941791909117169190911792909217909155517fa75222b3beec2334fd33dea12c05fdf6c4187c226b9ab605a606cc31fb5194f791612030918a918a919283526020830191909152604082015260600190565b60405180910390a15050600180555050505050565b600260015414156120685760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161214c613a10565b6001600160401b03166020820152612162612a0f565b63ffffffff1681526001600160a01b0384161561222d57600083602001514261218b9190614c9f565b905060006121ad8685600001516001600160801b03168463ffffffff16613f27565b90508084602001516121bf9190614b95565b6001600160801b031660208086019190915263ffffffff428116918701919091526004546006546121f792610d459190861690614c41565b64ffffffffff16855261220986613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b038481166000908152600e6020908152604080832087518154898501518a8501516060808d015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b03909216820267ffffffffffffffff60b01b191617600160b01b6001600160401b039586160217909455600f86528487208a518b8801516001600160801b03918216600160801b9183168202179092558a51600d8054998d01518d8a0151968e01519286166001600160601b0319909b169a909a17600160201b9a90971699909902959095176001600160601b0316600160601b948416949094028116939093179390921690910291909117909355600754915163133f757160e31b8152928a16600484015292938493849384938493849390910416906399fbab88906024016101806040518083038186803b15801561239757600080fd5b505afa1580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf91906148e5565b505050509750975097509750975097505050600760009054906101000a900460020b60020b8260020b136124555760405162461bcd60e51b815260206004820152602760248201527f5261696e694c7076335374616b696e67506f6f6c3a207469636b557070657220604482015266746f6f206c6f7760c81b6064820152608401610acc565b60075463010000009004600290810b810b9084900b126124c85760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a207469636b4c6f776572206044820152670e8dede40d0d2ced60c31b6064820152608401610acc565b600a546001600160a01b0387811691161480156124f257506009546001600160a01b038681169116145b806125225750600a546001600160a01b03868116911614801561252257506009546001600160a01b038781169116145b6125835760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a204e465420746f6b656e7360448201526b081b9bdd0818dbdc9c9958dd60a21b6064820152608401610acc565b60075462ffffff858116600160301b90920416146125f45760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a2066656520213d2066656560448201526714995c5d5a5c995960c21b6064820152608401610acc565b600754600160481b90046001600160a01b03166342842e0e6126133390565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015263ffffffff8e166044820152606401600060405180830381600087803b15801561266657600080fd5b505af115801561267a573d6000803e3d6000fd5b5050505060006010600061268b3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561272157602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116126e45790505b505050505090506000805b82518110156127eb5782818151811061275557634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16600014156127d95733600090815260106020526040902080548f91908390811061279d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550600191506127eb565b806127e381614cff565b91505061272c565b50806128635760106000336001600160a01b03166001600160a01b031681526020019081526020016000208d90806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff1602179055505b826001600160801b0316600c5461287a9190614bc0565b600c55336000908152600f60205260409020546001600160801b03166128a08482614b95565b336000908152600f6020526040902080546001600160801b0319166001600160801b03929092169190911790556128d78482614b95565b336000908152600e60205260409020546128f990839064ffffffffff16614c12565b6129039190614bd8565b336000818152600e60205260409020805464ffffffffff191664ffffffffff93909316929092179091557fdd2a19c3bdd089cbe77c04f5655f83de0504d6140d12c8667646f55d0557c4dc90604080516001600160a01b0390921682526001600160801b0387166020830152429082015260600160405180910390a1505060018055505050505050505050505050565b61299e600033610838565b6129ba5760405162461bcd60e51b8152600401610acc90614b12565b6007805468ffffff0000000000001916600160301b62ffffff8416908102919091179091556040519081527f150007d835ba6a879365dbd0ec151d80c05fec6bcb4b7a21f22e3ba2115dd227906020016119a5565b600d54600090612a2d904290600160601b900463ffffffff16613f74565b90505b90565b6001600160a01b0381166000818152600e602090815260408083208151608081018352905464ffffffffff81168252600160281b810463ffffffff1682850152600160481b81046001600160681b031682840152600160b01b90046001600160401b03166060820152938352600f9091528120549091906001600160801b0316612ac1576000915050610aa0565b6000816020015163ffffffff1642612ad99190614c88565b9050612b0260045482600654612aef9190614c41565b8451610d58919064ffffffffff16614bc0565b949350505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6008546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbf9190614888565b6008549091506001600160a01b0316639dc29fac336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b5050505080600f6000612c403390565b6001600160a01b03168152602081019190915260400160002054612c749190600160801b90046001600160801b0316614bc0565b336000818152600f6020526040902080546001600160801b03938416600160801b029316929092179091557fccf7b2bbc1b9e2aff9848ffc047297bfc64f47a18d250b12da287200b15920f190604080516001600160a01b03909216825260208201849052016119a5565b60026001541415612d025760405162461bcd60e51b8152600401610acc90614b5e565b6002600155612d317f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833610838565b612d925760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060448201526b3737ba103090313ab93732b960a11b6064820152608401610acc565b6001600160a01b0382166000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152978752600f8652958490208451808601865290546001600160801b038082168352600160801b9182900481168389015286519586018752600d54808a168752600160201b810490941697860197909752600160601b8304909716948401949094529490940490921693820193909352849290612e7d613a10565b6001600160401b03166020820152612e93612a0f565b63ffffffff1681526001600160a01b03841615612f5e576000836020015142612ebc9190614c9f565b90506000612ede8685600001516001600160801b03168463ffffffff16613f27565b9050808460200151612ef09190614b95565b6001600160801b031660208086019190915263ffffffff42811691870191909152600454600654612f2892610d459190861690614c41565b64ffffffffff168552612f3a86613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b038481166000908152600e6020908152604080832087518154898501518a8501516060808d015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f855283862089518a8701516001600160801b03918216600160801b9183168202179092558951600d8054988c01518c890151958d01519288166001600160601b0319909a1699909917600160201b9990961698909802949094176001600160601b0316600160601b9390951692909202821693909317918116830291909117909355938a16835290912054613096928892910416614c88565b6001600160a01b0387166000818152600f602090815260409182902080546001600160801b03958616600160801b0295169490941790935580519182529181018790527f2dcfcb8dd7f92a1441a21ffa64ff110b029b8c14727dc57c22d5e3a7dad20b72910160405180910390a150506001805550505050565b600061311d848484613f27565b6001600160801b0316949350505050565b613139600033610838565b6131555760405162461bcd60e51b8152600401610acc90614b12565b6002829055600381905560408051838152602081018390527fb1364803920b7aa08b58c240c989062d8ebd96ab4bd352792350afbab26c82399101610b2d565b6001600160a01b0381166000818152600e602090815260408083208151608081018352905464ffffffffff8116825263ffffffff600160281b820416828501526001600160681b03600160481b820481168385019081526001600160401b03600160b01b909304831660608501908152978752600f86528487208551808701909652546001600160801b038082168752600160801b909104169585019590955293519551949591949293869392169164e8d4a510009116613254613a10565b61325e9190614c88565b845161327391906001600160801b0316614c41565b61327d9190614bfe565b6132879190614bc0565b6009546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156132d057600080fd5b505afa1580156132e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133089190614888565b90508082111561331d579350610aa092505050565b50949350505050565b600081116133845760405162461bcd60e51b815260206004820152602560248201527f5261696e694c7076335374616b696e67506f6f6c3a205f616d6f756e74206973604482015264207a65726f60d81b6064820152608401610acc565b80600b54346133939190614c41565b10156133ef5760405162461bcd60e51b815260206004820152602560248201527f5261696e694c7076335374616b696e67506f6f6c3a206e6f7420656e6f7567746044820152640d040cae8d60db1b6064820152608401610acc565b336000908152600f602052604090205461341a908290600160801b90046001600160801b0316614bc0565b336000908152600f6020526040812080546001600160801b03938416600160801b02931692909217909155600b546134529083614bfe565b61345c9034614c88565b905080156134ce57604051600090339083908381818185875af1925050503d80600081146134a6576040519150601f19603f3d011682016040523d82523d6000602084013e6134ab565b606091505b50509050806134cc5760405162461bcd60e51b8152600401610acc90614acd565b505b60408051338152602081018490527ff69bff6f82b14616cf3bdf5d36a1504928849f54e2a949024c97f722523641ca9101610b2d565b61350f600033610838565b61352b5760405162461bcd60e51b8152600401610acc90614b12565b4781111561358c5760405162461bcd60e51b815260206004820152602860248201527f5261696e694c7076335374616b696e67506f6f6c3a206e6f7420656e6f7567686044820152672062616c616e636560c01b6064820152608401610acc565b604051600090339083908381818185875af1925050503d80600081146135ce576040519150601f19603f3d011682016040523d82523d6000602084013e6135d3565b606091505b50509050806135f45760405162461bcd60e51b8152600401610acc90614acd565b6040518281527f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d90602001610b2d565b600260015414156136475760405162461bcd60e51b8152600401610acc90614b5e565b6002600155336000818152600e60209081526040808320815160808082018452915464ffffffffff8116825263ffffffff600160281b82048116838701526001600160681b03600160481b830416838601526001600160401b03600160b01b9092048216606080850191909152888852600f8752968590208551808701875290546001600160801b038082168352600160801b918290048116838a015287519687018852600d548085168852600160201b810490951698870198909852600160601b840490921695850195909552900490931693810193909352909161372b613a10565b6001600160401b03166020820152613741612a0f565b63ffffffff1681526001600160a01b0384161561380c57600083602001514261376a9190614c9f565b9050600061378c8685600001516001600160801b03168463ffffffff16613f27565b905080846020015161379e9190614b95565b6001600160801b031660208086019190915263ffffffff428116918701919091526004546006546137d692610d459190861690614c41565b64ffffffffff1685526137e886613195565b6001600160681b03166040860152505060208101516001600160401b031660608401525b6001600160a01b0384166000908152600e602090815260408083208651815488850151898501516060808c015164ffffffffff90951668ffffffffffffffffff1990941693909317600160281b63ffffffff9384160217600160481b600160f01b031916600160481b6001600160681b039092169190910267ffffffffffffffff60b01b191617600160b01b6001600160401b039485160217909355600f85528386208851898701516001600160801b03918216600160801b9183168202179092558851600d8054988b0151978b0151948b01519187166001600160601b031990991698909817600160201b9790951696909602939093176001600160601b0316600160601b92909416919091028216929092179216021790556139306108e23390565b90506001811161397a5760405162461bcd60e51b81526020600482015260156024820152746e6f2072657761726420746f20776974686472617760581b6044820152606401610acc565b60018111156139c657336000818152600e60205260409020805475ffffffffffffffffffffffffff000000000000000000191690556139c6906009546001600160a01b03169083614148565b6040805133815260208101839052428183015290517fa41482a3e45841df1c6d33f45217a1cbe5ce4c6ab246e31f4e5efdef0acfeea29181900360600190a1505060018055505050565b60408051608081018252600d5463ffffffff8082168352600160201b82046001600160401b03166020840152600160601b82041692820192909252600160801b9091046001600160801b03166060820152600c5460009190613a8057602001516001600160401b03169050612a30565b600c5464e8d4a5100082606001516001600160801b0316836000015163ffffffff16613aaa612a0f565b613ab49190614c88565b613abe9190614c41565b613ac89190614c41565b613ad29190614bfe565b81602001516001600160401b0316613aea9190614bc0565b91505090565b600082815260208190526040902060010154613b0c813361171c565b61172b8383614072565b613b407f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610838565b613ba15760405162461bcd60e51b815260206004820152602c60248201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060448201526b3737ba10309036b4b73a32b960a11b6064820152608401610acc565b828114613bff5760405162461bcd60e51b815260206004820152602660248201527f5261696e694c7076335374616b696e67506f6f6c3a20417272617973206e6f7460448201526508195c5d585b60d21b6064820152608401610acc565b60005b83811015613dbc57828282818110613c2a57634e487b7160e01b600052603260045260246000fd5b90506020020135600f6000878785818110613c5557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613c6a91906145f5565b6001600160a01b03168152602081019190915260400160002054613c9e9190600160801b90046001600160801b0316614bc0565b600f6000878785818110613cc257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613cd791906145f5565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790557fccf7b2bbc1b9e2aff9848ffc047297bfc64f47a18d250b12da287200b15920f1858583818110613d4c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190613d6191906145f5565b848484818110613d8157634e487b7160e01b600052603260045260246000fd5b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a180613db481614cff565b915050613c02565b5050505050565b613dce600033610838565b613dea5760405162461bcd60e51b8152600401610acc90614b12565b60026001541415613e0d5760405162461bcd60e51b8152600401610acc90614b5e565b6002600155600d5442600160601b90910463ffffffff1610613e8d5760405162461bcd60e51b815260206004820152603360248201527f5261696e692063616e6e6f74206265207265636f7665726564207768696c65206044820152723932bbb0b932103837b7b61030b1ba34bb329760691b6064820152608401610acc565b6009546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015613ee757600080fd5b505af1158015613efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f1f91906147b0565b505060018055565b600080600354620f4240613f3b9190614c41565b8460025485613f4a9190614c41565b613f549190614c41565b613f5e9190614bfe565b9050613f6b858285614178565b95945050505050565b6000818310613f835781611b65565b5090919050565b613f948282612b0a565b61194957613fac816001600160a01b031660146141b6565b613fb78360206141b6565b604051602001613fc89291906149db565b60408051601f198184030181529082905262461bcd60e51b8252610acc91600401614a9a565b613ff88282612b0a565b611949576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561402e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61407c8282612b0a565b15611949576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526141429085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614397565b50505050565b6040516001600160a01b03831660248201526044810182905261172b90849063a9059cbb60e01b9060640161410b565b6000806141858584611730565b90506064633b9aca006141988387614c41565b6141a29190614bfe565b6141ac9190614bfe565b613f6b9085614bc0565b606060006141c5836002614c41565b6141d0906002614bc0565b6001600160401b038111156141f557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561421f576020820181803683370190505b509050600360fc1b8160008151811061424857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061428557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006142a9846002614c41565b6142b4906001614bc0565b90505b6001811115614348576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106142f657634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061431a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361434181614ce8565b90506142b7565b508315611b655760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610acc565b60006143ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166144699092919063ffffffff16565b80519091501561172b578080602001905181019061440a91906147b0565b61172b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610acc565b6060612b02848460008585843b6144c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610acc565b600080866001600160a01b031685876040516144de91906149bf565b60006040518083038185875af1925050503d806000811461451b576040519150601f19603f3d011682016040523d82523d6000602084013e614520565b606091505b509150915061453082828661453b565b979650505050505050565b6060831561454a575081611b65565b82511561455a5782518084602001fd5b8160405162461bcd60e51b8152600401610acc9190614a9a565b8051610aa081614d5c565b60008083601f840112614590578081fd5b5081356001600160401b038111156145a6578182fd5b6020830191508360208260051b85010111156145c157600080fd5b9250929050565b8051610aa081614d74565b80516001600160801b0381168114610aa057600080fd5b8051610aa081614d83565b600060208284031215614606578081fd5b8135611b6581614d5c565b60008060008060808587031215614626578283fd5b843561463181614d5c565b9350602085013561464181614d5c565b92506040850135915060608501356001600160401b0380821115614663578283fd5b818701915087601f830112614676578283fd5b81358181111561468857614688614d46565b604051601f8201601f19908116603f011681019083821181831017156146b0576146b0614d46565b816040528281528a60208487010111156146c8578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156146fb578182fd5b823561470681614d5c565b946020939093013593505050565b600080600060608486031215614728578283fd5b833561473381614d5c565b95602085013595506040909401359392505050565b6000806000806040858703121561475d578384fd5b84356001600160401b0380821115614773578586fd5b61477f8883890161457f565b90965094506020870135915080821115614797578384fd5b506147a48782880161457f565b95989497509550505050565b6000602082840312156147c1578081fd5b81518015158114611b65578182fd5b6000602082840312156147e1578081fd5b5035919050565b600080604083850312156147fa578182fd5b82359150602083013561480c81614d5c565b809150509250929050565b600060208284031215614828578081fd5b81356001600160e01b031981168114611b65578182fd5b60008060408385031215614851578182fd5b823561485c81614d74565b9150602083013561480c81614d74565b60006020828403121561487d578081fd5b8135611b6581614d83565b600060208284031215614899578081fd5b5051919050565b600080604083850312156148b2578182fd5b50508035926020909101359150565b6000602082840312156148d2578081fd5b813563ffffffff81168114611b65578182fd5b6000806000806000806000806000806000806101808d8f03121561490757898afd5b8c516001600160601b038116811461491d578a8bfd5b9b5061492b60208e01614574565b9a5061493960408e01614574565b995061494760608e01614574565b985061495560808e016145ea565b975061496360a08e016145c8565b965061497160c08e016145c8565b955061497f60e08e016145d3565b94506101008d015193506101208d0151925061499e6101408e016145d3565b91506149ad6101608e016145d3565b90509295989b509295989b509295989b565b600082516149d1818460208701614cbc565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351614a13816017850160208801614cbc565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614a44816028840160208801614cbc565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614a8e57835163ffffffff1683529284019291840191600101614a6c565b50909695505050505050565b6000602082528251806020840152614ab9816040850160208701614cbc565b601f01601f19169190910160400192915050565b60208082526025908201527f5261696e694c7076335374616b696e67506f6f6c3a207472616e736665722066604082015264185a5b195960da1b606082015260800190565b6020808252602c908201527f5261696e694c7076335374616b696e67506f6f6c3a2063616c6c65722069732060408201526b3737ba1030b71037bbb732b960a11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006001600160801b03808316818516808303821115614bb757614bb7614d1a565b01949350505050565b60008219821115614bd357614bd3614d1a565b500190565b60006001600160801b0380841680614bf257614bf2614d30565b92169190910492915050565b600082614c0d57614c0d614d30565b500490565b60006001600160801b0380831681851681830481118215151615614c3857614c38614d1a565b02949350505050565b6000816000190483118215151615614c5b57614c5b614d1a565b500290565b60006001600160801b0383811690831681811015614c8057614c80614d1a565b039392505050565b600082821015614c9a57614c9a614d1a565b500390565b600063ffffffff83811690831681811015614c8057614c80614d1a565b60005b83811015614cd7578181015183820152602001614cbf565b838111156141425750506000910152565b600081614cf757614cf7614d1a565b506000190190565b6000600019821415614d1357614d13614d1a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614d7157600080fd5b50565b8060020b8114614d7157600080fd5b62ffffff81168114614d7157600080fdfea2646970667358221220f6cc43ca86573fdfcda498fdb0dd5a0f8d6469c99559cd58843a2baf89385fbe64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000eb953eda0dc65e3246f43dc8fa13f35623bdd5ed000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002927a1712f3eb8ed22bbfeccabb4392fc16a4f6a
-----Decoded View---------------
Arg [0] : _rainiLpNFT (address): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
Arg [1] : _rainiToken (address): 0xeB953eDA0DC65e3246f43DC8fa13f35623bDd5eD
Arg [2] : _exchangeToken (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _v2Pool (address): 0x2927a1712f3Eb8ED22bBFeccaBB4392fC16A4f6A
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88
Arg [1] : 000000000000000000000000eb953eda0dc65e3246f43dc8fa13f35623bdd5ed
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000002927a1712f3eb8ed22bbfeccabb4392fc16a4f6a
Deployed Bytecode Sourcemap
37541:17056:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17264:217;;;;;;;;;;-1:-1:-1;17264:217:0;;;;;:::i;:::-;;:::i;:::-;;;12210:14:1;;12203:22;12185:41;;12173:2;12158:18;17264:217:0;;;;;;;;38696:42;;;;;;;;;;-1:-1:-1;38696:42:0;;;;;;;;;-1:-1:-1;;;38696:42:0;;-1:-1:-1;;;;;38696:42:0;;-1:-1:-1;;;38696:42:0;;;;-1:-1:-1;;;38696:42:0;;-1:-1:-1;;;;;38696:42:0;;;;;;;24326:10:1;24363:15;;;24345:34;;-1:-1:-1;;;;;24415:31:1;;;;24410:2;24395:18;;24388:59;24483:15;;;;24463:18;;;24456:43;-1:-1:-1;;;;;24535:47:1;;;24530:2;24515:18;;24508:75;24303:3;24288:19;38696:42:0;24270:319:1;44695:275:0;;;;;;;;;;-1:-1:-1;44695:275:0;;;;;:::i;:::-;;:::i;:::-;;38397:35;;;;;;;;;;-1:-1:-1;38397:35:0;;;;-1:-1:-1;;;;;38397:35:0;;;;;;-1:-1:-1;;;;;9550:32:1;;;9532:51;;9520:2;9505:18;38397:35:0;9487:102:1;52850:733:0;;;;;;;;;;;;;:::i;36648:164::-;;;;;;;;;;-1:-1:-1;36648:164:0;;;;;:::i;:::-;-1:-1:-1;;;36648:164:0;;;;;;;;;;-1:-1:-1;;;;;;12581:33:1;;;12563:52;;12551:2;12536:18;36648:164:0;12518:103:1;38439:27:0;;;;;;;;;;;;;;;;;;;12383:25:1;;;12371:2;12356:18;38439:27:0;12338:76:1;38366:24:0;;;;;;;;;;-1:-1:-1;38366:24:0;;;;-1:-1:-1;;;;;38366:24:0;;;38501:26;;;;;;;;;;;;;;;;37981:28;;;;;;;;;;;;;;;;38043:51;;;;;;;;;;;;38084:10;38043:51;;18575:123;;;;;;;;;;-1:-1:-1;18575:123:0;;;;;:::i;:::-;18641:7;18668:12;;;;;;;;;;:22;;;;18575:123;37624:62;;;;;;;;;;;;37662:24;37624:62;;47199:1170;;;;;;;;;;-1:-1:-1;47199:1170:0;;;;;:::i;:::-;;:::i;18960:147::-;;;;;;;;;;-1:-1:-1;18960:147:0;;;;;:::i;:::-;;:::i;43325:963::-;;;;;;;;;;-1:-1:-1;43325:963:0;;;;;:::i;:::-;;:::i;20008:218::-;;;;;;;;;;-1:-1:-1;20008:218:0;;;;;:::i;:::-;;:::i;42385:118::-;;;;;;;;;;-1:-1:-1;42385:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;42471:19:0;42446:7;42471:19;;;:11;:19;;;;;:26;-1:-1:-1;;;;;42471:26:0;;42385:118;44522:167;;;;;;;;;;-1:-1:-1;44522:167:0;;;;;:::i;:::-;;:::i;37953:23::-;;;;;;;;;;;;;;;;38014:24;;;;;;;;;;;;;;;;44974:224;;;;;;;;;;-1:-1:-1;44974:224:0;;;;;:::i;:::-;;:::i;42509:127::-;;;;;;;;;;-1:-1:-1;42509:127:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42644:268::-;;;;;;;;;;-1:-1:-1;42644:268:0;;;;;:::i;:::-;;:::i;38229:25::-;;;;;;;;;;-1:-1:-1;38229:25:0;;;;-1:-1:-1;;;38229:25:0;;;;;;;;;23113:8:1;23101:21;;;23083:40;;23071:2;23056:18;38229:25:0;23038:91:1;38313:48:0;;;;;;;;;;-1:-1:-1;38313:48:0;;;;-1:-1:-1;;;;;38313:48:0;;;37833:25;;;;;;;;;;;;;;;;51997:847;;;;;;;;;;-1:-1:-1;51997:847:0;;;;;:::i;:::-;;:::i;45364:1827::-;;;;;;;;;;-1:-1:-1;45364:1827:0;;;;;:::i;:::-;;:::i;45204:154::-;;;;;;;;;;-1:-1:-1;45204:154:0;;;;;:::i;:::-;;:::i;50686:145::-;;;;;;;;;;;;;:::i;38263:45::-;;;;;;;;;;-1:-1:-1;38263:45:0;;;;-1:-1:-1;;;38263:45:0;;-1:-1:-1;;;;;38263:45:0;;;42918:401;;;;;;;;;;-1:-1:-1;42918:401:0;;;;;:::i;:::-;;:::i;17573:139::-;;;;;;;;;;-1:-1:-1;17573:139:0;;;;;:::i;:::-;;:::i;54263:331::-;;;;;;;;;;;;;:::i;49835:271::-;;;;;;;;;;-1:-1:-1;49835:271:0;;;;;:::i;:::-;;:::i;15538:49::-;;;;;;;;;;-1:-1:-1;15538:49:0;15583:4;15538:49;;42198:181;;;;;;;;;;-1:-1:-1;42198:181:0;;;;;:::i;:::-;;:::i;44294:222::-;;;;;;;;;;-1:-1:-1;44294:222:0;;;;;:::i;:::-;;:::i;51293:698::-;;;;;;;;;;-1:-1:-1;51293:698:0;;;;;:::i;:::-;;:::i;38199:25::-;;;;;;;;;;-1:-1:-1;38199:25:0;;;;;;;;;;;;;;13501:1:1;13490:21;;;;13472:40;;13460:2;13445:18;38199:25:0;13427:91:1;37897:49:0;;;;;;;;;;;;37939:7;37897:49;;49185:640;;;;;;:::i;:::-;;:::i;48375:330::-;;;;;;;;;;-1:-1:-1;48375:330:0;;;;;:::i;:::-;;:::i;53840:391::-;;;;;;;;;;;;;:::i;50837:450::-;;;;;;;;;;;;;:::i;37691:62::-;;;;;;;;;;;;37729:24;37691:62;;19352:149;;;;;;;;;;-1:-1:-1;19352:149:0;;;;;:::i;:::-;;:::i;48713:464::-;;;;;;;;;;-1:-1:-1;48713:464:0;;;;;:::i;:::-;;:::i;37863:29::-;;;;;;;;;;;;;;;;38169:25;;;;;;;;;;-1:-1:-1;38169:25:0;;;;;;;;38101:61;;;;;;;;;;;;38149:13;38101:61;;53589:245;;;;;;;;;;-1:-1:-1;53589:245:0;;;;;:::i;:::-;;:::i;17264:217::-;17349:4;-1:-1:-1;;;;;;17373:47:0;;-1:-1:-1;;;17373:47:0;;:100;;-1:-1:-1;;;;;;;;;;12425:40:0;;;17437:36;17366:107;;17264:217;;;;:::o;44695:275::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;;;;;;;;;44800:26:::1;38084:10;44800:9:::0;:26:::1;:::i;:::-;44789:8;:37:::0;;;44835:13:::1;:30:::0;;;44886:25:::1;::::0;44851:14;;44886:25:::1;:::i;:::-;44874:9;:37:::0;44927::::1;::::0;;23490:25:1;;;23546:2;23531:18;;23524:34;;;44927:37:0::1;::::0;23463:18:1;44927:37:0::1;;;;;;;;44695:275:::0;;:::o;52850:733::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;23381:1:::1;23978:7;;:19;;23970:63;;;;-1:-1:-1::0;;;23970:63:0::1;;;;;;;:::i;:::-;23381:1;24111:7;:18:::0;41051:25;41005:71;;::::2;::::0;;::::2;::::0;;41051:25;41005:71;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;;41005:71:0;::::2;::::0;::::2;41051:25;41005:71:::0;;::::2;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;::::2;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::2;::::0;::::2;::::0;;;;;;;;52936:1:::2;41117:19:::0;;;:11:::2;:19:::0;;41083:53;;;;::::2;::::0;;41117:19;41083:53;-1:-1:-1;;;;;41083:53:0;;::::2;::::0;;-1:-1:-1;;;41083:53:0;;;::::2;::::0;::::2;::::0;;::::2;::::0;41143:63;;;;::::2;::::0;;41189:17:::2;41143:63:::0;;;::::2;::::0;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;;::::0;;;;;;;52936:1;41083:53;41291:21:::2;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::2;:44;::::0;::::2;:76:::0;41363:26:::2;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::2;::::0;41399:637:::2;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::2;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::2;:27;::::0;;::::2;:66:::0;;;;41676:56:::2;41716:15;41676:56:::0;::::2;:30:::0;;::::2;:56:::0;;;;41788:8:::2;::::0;41829:9:::2;::::0;41779:71:::2;::::0;41829:20:::2;::::0;;;::::2;::::0;::::2;:::i;:::-;41798:28:::0;;:51:::2;::::0;;::::2;;;:::i;:::-;41779:8;:71::i;:::-;41741:110;;::::0;;41910:19:::2;41922:6:::0;41910:11:::2;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::2;:31;::::0;::::2;:62:::0;-1:-1:-1;;41984:44:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;41939:89:0::2;:42;::::0;::::2;:89:::0;41399:637:::2;-1:-1:-1::0;;;;;42044:25:0;::::2;;::::0;;;:17:::2;:25;::::0;;;;;;;:46;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::2;::::0;;::::2;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::2;;;::::0;;;42097:11:::2;:19:::0;;;;;;:34;;;;::::2;::::0;-1:-1:-1;;;;;42097:34:0;;::::2;-1:-1:-1::0;;;42097:34:0;;::::2;::::0;::::2;;::::0;;;42138:38;;:17:::2;:38:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;::::2;::::0;::::2;;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;52951:63;;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;::::3;::::0;;::::3;::::0;;::::3;::::0;;;;;;::::3;::::0;;::::3;::::0;;;;;;;;::::3;;::::0;;;;;;;;53068:15:::3;-1:-1:-1::0;53025:88:0::3;;;::::0;-1:-1:-1;;;53025:88:0;;18847:2:1;53025:88:0::3;::::0;::::3;18829:21:1::0;18886:2;18866:18;;;18859:30;18925:27;18905:18;;;18898:55;18970:18;;53025:88:0::3;18819:175:1::0;53025:88:0::3;53130:21;53188:15;53154:18;:31;;;:49;;;;;;:::i;:::-;53130:73;;53212:23;53254:18;:34;;;-1:-1:-1::0;;;;;53238:50:0::3;:13;:50;;;;:::i;:::-;53297:10;::::0;53212:76;;-1:-1:-1;;;;;;53297:10:0::3;:19;681:10:::0;53297:50:::3;::::0;-1:-1:-1;;;;;;53297:50:0::3;::::0;;;;;;-1:-1:-1;;;;;10953:32:1;;;53297:50:0::3;::::0;::::3;10935:51:1::0;11002:18;;;10995:34;;;10908:18;;53297:50:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;53395:1:0::3;53358:34;::::0;::::3;:38:::0;-1:-1:-1;53405:57:0::3;53446:15;53405:57;:31;::::0;::::3;:57:::0;;;53471:59;;;53539:17:::3;:38:::0;;-1:-1:-1;53539:38:0;;::::3;::::0;-1:-1:-1;;;53539:38:0;::::3;-1:-1:-1::0;;;;;53539:38:0;-1:-1:-1;;;;;;;;;;53539:38:0;;::::3;-1:-1:-1::0;;;53539:38:0::3;-1:-1:-1::0;;;;;;53539:38:0;;;;;;;;;::::3;::::0;;;;;;;-1:-1:-1;;53539:38:0;24290:22;;-1:-1:-1;;52850:733:0:o;47199:1170::-;23381:1;23978:7;;:19;;23970:63;;;;-1:-1:-1;;;23970:63:0;;;;;;;:::i;:::-;23381:1;24111:7;:18;681:10;41005:43:::1;41051:25:::0;;;:17:::1;:25;::::0;;;;;;;41005:71;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;41005:71:0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;41005:71:0;::::1;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::1;::::0;::::1;::::0;;;;;;;;41117:19;;;:11:::1;:19:::0;;;;;;41083:53;;;;::::1;::::0;;;;-1:-1:-1;;;;;41083:53:0;;::::1;::::0;;-1:-1:-1;;;41083:53:0;;;::::1;::::0;::::1;::::0;;::::1;::::0;41143:63;;;;::::1;::::0;;41189:17:::1;41143:63:::0;;;::::1;::::0;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;41005:71;;41291:21:::1;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::1;:44;::::0;::::1;:76:::0;41363:26:::1;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::1;::::0;41399:637:::1;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::1;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::1;:27;::::0;;::::1;:66:::0;;;;41676:56:::1;41716:15;41676:56:::0;::::1;:30:::0;;::::1;:56:::0;;;;41788:8:::1;::::0;41829:9:::1;::::0;41779:71:::1;::::0;41829:20:::1;::::0;;;::::1;::::0;::::1;:::i;41779:71::-;41741:110;;::::0;;41910:19:::1;41922:6:::0;41910:11:::1;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::1;:31;::::0;::::1;:62:::0;-1:-1:-1;;41984:44:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;41939:89:0::1;:42;::::0;::::1;:89:::0;41399:637:::1;-1:-1:-1::0;;;;;42044:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:46;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::1;::::0;;::::1;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::1;;;::::0;;;42097:11:::1;:19:::0;;;;;:34;;;;::::1;::::0;-1:-1:-1;;;;;42097:34:0;;::::1;-1:-1:-1::0;;;42097:34:0;;::::1;::::0;::::1;;::::0;;;42138:38;;:17:::1;:38:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;;;::::0;;42044:25;42097:34:::1;42044:25:::0;47364:12:::2;681:10:::0;601:98;;47364:12:::2;-1:-1:-1::0;;;;;47353:24:0::2;-1:-1:-1::0;;;;;47353:24:0::2;;;;;;;;;;;;47330:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47391:6;47386:188;47407:4;:11;47403:1;:15;47386:188;;;47451:8;47440:4;47445:1;47440:7;;;;;;-1:-1:-1::0;;;47440:7:0::2;;;;;;;;;;;;;;;:19;;;47436:129;;;681:10:::0;47508:24:::2;::::0;;;:10:::2;:24;::::0;;;;:27;;47484:4:::2;::::0;-1:-1:-1;47533:1:0;;47508:27;::::2;;;-1:-1:-1::0;;;47508:27:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;47501:34;;;;;;;;;;;47548:5;;47436:129;47420:3:::0;::::2;::::0;::::2;:::i;:::-;;;;47386:188;;;-1:-1:-1::0;47601:4:0::2;47590:15:::0;::::2;;;47582:63;;;::::0;-1:-1:-1;;;47582:63:0;;20429:2:1;47582:63:0::2;::::0;::::2;20411:21:1::0;20468:2;20448:18;;;20441:30;20507:34;20487:18;;;20480:62;-1:-1:-1;;;20558:18:1;;;20551:33;20601:19;;47582:63:0::2;20401:225:1::0;47582:63:0::2;47656:10;::::0;-1:-1:-1;;;47656:10:0;::::2;-1:-1:-1::0;;;;;47656:10:0::2;:27;47692:4;47699:12;681:10:::0;601:98;;47699:12:::2;47656:66;::::0;-1:-1:-1;;;;;;47656:66:0::2;::::0;;;;;;-1:-1:-1;;;;;9852:15:1;;;47656:66:0::2;::::0;::::2;9834:34:1::0;9904:15;;9884:18;;;9877:43;9936:18;;;9929:34;;;9769:18;;47656:66:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;48124:10:0::2;::::0;:30:::2;::::0;-1:-1:-1;;;48124:30:0;;::::2;::::0;::::2;12383:25:1::0;;;47938:17:0::2;::::0;-1:-1:-1;;;;48124:10:0;;::::2;-1:-1:-1::0;;;;;48124:10:0::2;::::0;-1:-1:-1;48124:20:0::2;::::0;12356:18:1;;48124:30:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47733:421;;;;;;;;;;;;;48235:9;48200:11;:25;48212:12;681:10:::0;601:98;;48212:12:::2;-1:-1:-1::0;;;;;48200:25:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;48200:25:0;:32;:44:::2;::::0;;-1:-1:-1;;;;;48200:32:0::2;:44;:::i;:::-;681:10:::0;48165:25:::2;::::0;;;:11:::2;:25;::::0;;;;:79;;-1:-1:-1;;;;;;48165:79:0::2;-1:-1:-1::0;;;;;48165:79:0;;::::2;;::::0;;48267:11:::2;::::0;:23:::2;::::0;;::::2;::::0;::::2;:::i;:::-;48253:11;:37:::0;48306:57:::2;::::0;;681:10;10572:51:1;;-1:-1:-1;;;;;10659:47:1;;10654:2;10639:18;;10632:75;48347:15:0::2;10723:18:1::0;;;10716:34;48306:57:0;;::::2;::::0;;;;10560:2:1;48306:57:0;;::::2;-1:-1:-1::0;;23337:1:0;24290:22;;-1:-1:-1;;;;;;47199:1170:0:o;18960:147::-;18641:7;18668:12;;;;;;;;;;:22;;;17142:30;17153:4;681:10;17159:12;17142:10;:30::i;:::-;19074:25:::1;19085:4;19091:7;19074:10;:25::i;:::-;18960:147:::0;;;:::o;43325:963::-;-1:-1:-1;;;;;43477:25:0;;43413:7;43477:25;;;:17;:25;;;;;;;;43431:71;;;;;;;;;;;;;;-1:-1:-1;;;43431:71:0;;;;;;;;-1:-1:-1;;;43431:71:0;;-1:-1:-1;;;;;43431:71:0;;;;;-1:-1:-1;;;43431:71:0;;-1:-1:-1;;;;;43431:71:0;;;;;43516:19;;;:11;:19;;;;;:26;43413:7;;43431:71;-1:-1:-1;;;;;43516:26:0;43513:65;;43567:1;43560:8;;;;;43513:65;43587:16;43646:8;;43615:18;:28;;;:39;;;43612:647;;;43667:23;43737:9;;43705:18;:28;;;43694:39;;:8;;:39;;;;:::i;:::-;43693:53;;;;:::i;:::-;43667:79;;43772:15;43760:9;:27;43757:447;;;43802:31;43898:1;43880:15;43868:8;;43837:18;:28;;;:39;;;;;;:::i;:::-;43836:59;;;;:::i;:::-;:63;;;;:::i;:::-;43802:97;-1:-1:-1;43912:24:0;43951:27;43963:15;43951:9;:27;:::i;:::-;43939:8;;:40;;;;:::i;:::-;43912:67;-1:-1:-1;44052:9:0;44006:42;43912:67;44006:23;:42;:::i;:::-;44005:56;;;;:::i;:::-;43994:67;;43757:447;;;;;44191:1;44159:18;:28;;;44104:83;;44147:9;44135;;:21;;;;:::i;:::-;44104:28;;:52;;;;;;:::i;:::-;:83;;;;:::i;:::-;44103:89;;;;:::i;:::-;44092:100;;43757:447;43612:647;;;;-1:-1:-1;44241:8:0;;43612:647;44274:8;-1:-1:-1;;43325:963:0;;;;;:::o;20008:218::-;-1:-1:-1;;;;;20104:23:0;;681:10;20104:23;20096:83;;;;-1:-1:-1;;;20096:83:0;;22725:2:1;20096:83:0;;;22707:21:1;22764:2;22744:18;;;22737:30;22803:34;22783:18;;;22776:62;-1:-1:-1;;;22854:18:1;;;22847:45;22909:19;;20096:83:0;22697:237:1;20096:83:0;20192:26;20204:4;20210:7;20192:11;:26::i;:::-;20008:218;;:::o;44522:167::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;44603:12:::1;:28:::0;;;44653:30:::1;::::0;12383:25:1;;;44653:30:0::1;::::0;12371:2:1;12356:18;44653:30:0::1;;;;;;;;44522:167:::0;:::o;44974:224::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;45071:12:::1;:28:::0;;::::1;45108::::0;;::::1;45071;45108::::0;;::::1;::::0;::::1;-1:-1:-1::0;;45108:28:0;;;45071;;;::::1;;45108::::0;::::1;::::0;;45150:42:::1;::::0;::::1;::::0;::::1;::::0;45086:13;;45123;;13718:1:1;13707:21;;;13689:40;;13765:21;;13760:2;13745:18;;13738:49;13677:2;13662:18;;13644:149;42509:127:0;-1:-1:-1;;;;;42612:18:0;;;;;;:10;:18;;;;;;;;;42605:25;;;;;;;;;;;;;;;;;42579:15;;42605:25;;;42612:18;42605:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42509:127;;;:::o;42644:268::-;-1:-1:-1;;;;;42763:19:0;;42704:7;42763:19;;;:11;:19;;;;;;;;:26;42809:17;:25;;;;;:37;42704:7;;42739:108;;42763:19;;-1:-1:-1;;;;;42763:26:0;;42791:55;;-1:-1:-1;;;42809:37:0;;;;42791:15;:55;:::i;:::-;42739:15;:108::i;:::-;-1:-1:-1;;;;;42863:19:0;;;;;;:11;:19;;;;;:34;-1:-1:-1;;;;;42722:125:0;;;;-1:-1:-1;42863:43:0;;42722:125;;-1:-1:-1;;;42863:34:0;;;:43;:::i;:::-;42856:50;42644:268;-1:-1:-1;;;42644:268:0:o;51997:847::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;23381:1:::1;23978:7;;:19;;23970:63;;;;-1:-1:-1::0;;;23970:63:0::1;;;;;;;:::i;:::-;23381:1;24111:7;:18:::0;41051:25;41005:71;;::::2;::::0;;::::2;::::0;;41051:25;41005:71;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;;41005:71:0;::::2;::::0;::::2;41051:25;41005:71:::0;;::::2;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;::::2;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::2;::::0;::::2;::::0;;;;;;;;52120:1:::2;41117:19:::0;;;:11:::2;:19:::0;;41083:53;;;;::::2;::::0;;41117:19;41083:53;-1:-1:-1;;;;;41083:53:0;;::::2;::::0;;-1:-1:-1;;;41083:53:0;;;::::2;::::0;::::2;::::0;;::::2;::::0;41143:63;;;;::::2;::::0;;41189:17:::2;41143:63:::0;;;::::2;::::0;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;;::::0;;;;;;;52120:1;41083:53;41291:21:::2;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::2;:44;::::0;::::2;:76:::0;41363:26:::2;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::2;::::0;41399:637:::2;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::2;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::2;:27;::::0;;::::2;:66:::0;;;;41676:56:::2;41716:15;41676:56:::0;::::2;:30:::0;;::::2;:56:::0;;;;41788:8:::2;::::0;41829:9:::2;::::0;41779:71:::2;::::0;41829:20:::2;::::0;;;::::2;::::0;::::2;:::i;41779:71::-;41741:110;;::::0;;41910:19:::2;41922:6:::0;41910:11:::2;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::2;:31;::::0;::::2;:62:::0;-1:-1:-1;;41984:44:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;41939:89:0::2;:42;::::0;::::2;:89:::0;41399:637:::2;-1:-1:-1::0;;;;;42044:25:0;::::2;;::::0;;;:17:::2;:25;::::0;;;;;;;:46;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::2;::::0;;::::2;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::2;;;::::0;;;42097:11:::2;:19:::0;;;;;;:34;;;;::::2;::::0;-1:-1:-1;;;;;42097:34:0;;::::2;-1:-1:-1::0;;;42097:34:0;;::::2;::::0;::::2;;::::0;;;42138:38;;:17:::2;:38:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;::::2;::::0;::::2;;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;52135:63;;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;::::3;::::0;;::::3;::::0;;::::3;::::0;;;;;;::::3;::::0;;::::3;::::0;;;;;;;;::::3;;::::0;;;;;;;;52247:15:::3;-1:-1:-1::0;52209:221:0::3;;;52275:21;52333:15;52299:18;:31;;;:49;;;;;;:::i;:::-;52275:73;;52386:18;:34;;;-1:-1:-1::0;;;;;52370:50:0::3;:13;:50;;;;:::i;:::-;52359:61;::::0;;::::3;:::i;:::-;;;52209:221;;52440:65;681:10:::0;52440::::3;::::0;-1:-1:-1;;;;;52440:10:0::3;::::0;52490:4:::3;52497:7:::0;52440:27:::3;:65::i;:::-;52559:19;52569:9:::0;52559:7;:19:::3;:::i;:::-;-1:-1:-1::0;;;;;52514:65:0::3;:34;::::0;::::3;:65:::0;52629:27:::3;52647:9:::0;52629:15:::3;:27;:::i;:::-;52588:69;::::0;;::::3;:31;::::0;;::::3;:69:::0;;;52709:15:::3;52666:59:::0;;::::3;::::0;;;52734:17:::3;:38:::0;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;-1:-1:-1;;;;;52734:38:0;;::::3;-1:-1:-1::0;;;52734:38:0::3;-1:-1:-1::0;;;52734:38:0;;::::3;::::0;-1:-1:-1;;;;;;;;;;52734:38:0;;::::3;-1:-1:-1::0;;;52734:38:0::3;-1:-1:-1::0;;;;;;52734:38:0;;;;;;;;;::::3;::::0;;;;;;;;::::3;::::0;;;52786:52;::::3;::::0;::::3;::::0;52802:7;;52811:9;;23771:25:1;;;23827:2;23812:18;;23805:34;;;;23870:2;23855:18;;23848:34;23759:2;23744:18;;23726:162;52786:52:0::3;;;;;;;;-1:-1:-1::0;;23337:1:0::1;24290:22:::0;;-1:-1:-1;;;;;51997:847:0:o;45364:1827::-;23381:1;23978:7;;:19;;23970:63;;;;-1:-1:-1;;;23970:63:0;;;;;;;:::i;:::-;23381:1;24111:7;:18;681:10;41005:43:::1;41051:25:::0;;;:17:::1;:25;::::0;;;;;;;41005:71;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;41005:71:0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;41005:71:0;::::1;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::1;::::0;::::1;::::0;;;;;;;;41117:19;;;:11:::1;:19:::0;;;;;;41083:53;;;;::::1;::::0;;;;-1:-1:-1;;;;;41083:53:0;;::::1;::::0;;-1:-1:-1;;;41083:53:0;;;::::1;::::0;::::1;::::0;;::::1;::::0;41143:63;;;;::::1;::::0;;41189:17:::1;41143:63:::0;;;::::1;::::0;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;41005:71;;41291:21:::1;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::1;:44;::::0;::::1;:76:::0;41363:26:::1;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::1;::::0;41399:637:::1;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::1;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::1;:27;::::0;;::::1;:66:::0;;;;41676:56:::1;41716:15;41676:56:::0;::::1;:30:::0;;::::1;:56:::0;;;;41788:8:::1;::::0;41829:9:::1;::::0;41779:71:::1;::::0;41829:20:::1;::::0;;;::::1;::::0;::::1;:::i;41779:71::-;41741:110;;::::0;;41910:19:::1;41922:6:::0;41910:11:::1;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::1;:31;::::0;::::1;:62:::0;-1:-1:-1;;41984:44:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;41939:89:0::1;:42;::::0;::::1;:89:::0;41399:637:::1;-1:-1:-1::0;;;;;42044:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:46;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::1;::::0;;::::1;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::1;;;::::0;;;42097:11:::1;:19:::0;;;;;:34;;;;::::1;::::0;-1:-1:-1;;;;;42097:34:0;;::::1;-1:-1:-1::0;;;42097:34:0;;::::1;::::0;::::1;;::::0;;;42138:38;;:17:::1;:38:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;45836:10:::2;::::0;:30;;-1:-1:-1;;;45836:30:0;;24056:23:1;;;42138:38:0::1;45836:30:::0;::::2;24038:42:1::0;42044:25:0;;;;;;;;;;;;45836:10;;::::2;;::::0;:20:::2;::::0;24011:18:1;;45836:30:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45460:406;;;;;;;;;;;;;;;;;;45897:12;;;;;;;;;;;45885:24;;:9;:24;;;45877:76;;;::::0;-1:-1:-1;;;45877:76:0;;18439:2:1;45877:76:0::2;::::0;::::2;18421:21:1::0;18478:2;18458:18;;;18451:30;18517:34;18497:18;;;18490:62;-1:-1:-1;;;18568:18:1;;;18561:37;18615:19;;45877:76:0::2;18411:229:1::0;45877:76:0::2;45982:12;::::0;;;::::2;;::::0;;::::2;45970:24:::0;::::2;::::0;;;::::2;;45962:77;;;::::0;-1:-1:-1;;;45962:77:0;;19201:2:1;45962:77:0::2;::::0;::::2;19183:21:1::0;19240:2;19220:18;;;19213:30;19279:34;19259:18;;;19252:62;-1:-1:-1;;;19330:18:1;;;19323:38;19378:19;;45962:77:0::2;19173:230:1::0;45962:77:0::2;46068:20;::::0;-1:-1:-1;;;;;46057:31:0;;::::2;46068:20:::0;::::2;46057:31;:64:::0;::::2;;;-1:-1:-1::0;46110:10:0::2;::::0;-1:-1:-1;;;;;46092:29:0;;::::2;46110:10:::0;::::2;46092:29;46057:64;46056:151;;;-1:-1:-1::0;46153:20:0::2;::::0;-1:-1:-1;;;;;46142:31:0;;::::2;46153:20:::0;::::2;46142:31;:64:::0;::::2;;;-1:-1:-1::0;46195:10:0::2;::::0;-1:-1:-1;;;;;46177:29:0;;::::2;46195:10:::0;::::2;46177:29;46142:64;46048:208;;;::::0;-1:-1:-1;;;46048:208:0;;22312:2:1;46048:208:0::2;::::0;::::2;22294:21:1::0;22351:2;22331:18;;;22324:30;22390:34;22370:18;;;22363:62;-1:-1:-1;;;22441:18:1;;;22434:42;22493:19;;46048:208:0::2;22284:234:1::0;46048:208:0::2;46280:11;::::0;::::2;46273:18:::0;;::::2;-1:-1:-1::0;;;46280:11:0;;::::2;;46273:18;46265:71;;;::::0;-1:-1:-1;;;46265:71:0;;15989:2:1;46265:71:0::2;::::0;::::2;15971:21:1::0;16028:2;16008:18;;;16001:30;16067:34;16047:18;;;16040:62;-1:-1:-1;;;16118:18:1;;;16111:38;16166:19;;46265:71:0::2;15961:230:1::0;46265:71:0::2;46347:10;::::0;-1:-1:-1;;;46347:10:0;::::2;-1:-1:-1::0;;;;;46347:10:0::2;:27;46375:12;681:10:::0;601:98;;46375:12:::2;46347:66;::::0;-1:-1:-1;;;;;;46347:66:0::2;::::0;;;;;;-1:-1:-1;;;;;10231:15:1;;;46347:66:0::2;::::0;::::2;10213:34:1::0;46397:4:0::2;10263:18:1::0;;;10256:43;46347:66:0::2;10335:23:1::0;;10315:18;;;10308:51;10148:18;;46347:66:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46424:20;46447:10;:24;46458:12;681:10:::0;601:98;;46458:12:::2;-1:-1:-1::0;;;;;46447:24:0::2;-1:-1:-1::0;;;;;46447:24:0::2;;;;;;;;;;;;46424:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46480:13;46515:6:::0;46510:191:::2;46531:4;:11;46527:1;:15;46510:191;;;46565:4;46570:1;46565:7;;;;;;-1:-1:-1::0;;;46565:7:0::2;;;;;;;;;;;;;;;:12;;46576:1;46565:12;46561:131;;;681:10:::0;46593:24:::2;::::0;;;:10:::2;:24;::::0;;;;:27;;46623:8;;46593:24;46618:1;;46593:27;::::2;;;-1:-1:-1::0;;;46593:27:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;46656:4;46645:15;;46674:5;;46561:131;46544:3:::0;::::2;::::0;::::2;:::i;:::-;;;;46510:191;;;;46714:8;46709:75;;46735:10;:24;681:10:::0;-1:-1:-1;;;;;46735:24:0::2;-1:-1:-1::0;;;;;46735:24:0::2;;;;;;;;;;;;46765:8;46735:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46709:75;46828:9;-1:-1:-1::0;;;;;46814:23:0::2;:11;;:23;;;;:::i;:::-;46800:11;:37:::0;681:10;46846:20:::2;46869:25:::0;;;:11:::2;:25;::::0;;;;:32;-1:-1:-1;;;;;46869:32:0::2;46945:24;46960:9:::0;46869:32;46945:24:::2;:::i;:::-;681:10:::0;46910:25:::2;::::0;;;:11:::2;:25;::::0;;;;:59;;-1:-1:-1;;;;;;46910:59:0::2;-1:-1:-1::0;;;;;46910:59:0;;;::::2;::::0;;;::::2;::::0;;47089:24:::2;47104:9:::0;47089:12;:24:::2;:::i;:::-;681:10:::0;47029:31:::2;::::0;;;:17:::2;:31;::::0;;;;:41;:56:::2;::::0;47073:12;;47029:41:::2;;:56;:::i;:::-;:85;;;;:::i;:::-;681:10:::0;46978:31:::2;::::0;;;:17:::2;:31;::::0;;;;:137;;-1:-1:-1;;46978:137:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;47131:54:::2;::::0;::::2;::::0;;-1:-1:-1;;;;;10590:32:1;;;10572:51;;-1:-1:-1;;;;;10659:47:1;;10654:2;10639:18;;10632:75;47169:15:0::2;10723:18:1::0;;;10716:34;10560:2;10545:18;47131:54:0::2;;;;;;;-1:-1:-1::0;;23337:1:0;24290:22;;-1:-1:-1;;;;;;;;;;;;45364:1827:0:o;45204:154::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;45282:11:::1;:26:::0;;-1:-1:-1;;45282:26:0::1;-1:-1:-1::0;;;45282:26:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;45324:28:::1;::::0;23083:40:1;;;45324:28:0::1;::::0;23071:2:1;23056:18;45324:28:0::1;23038:91:1::0;50686:145:0;50794:17;:30;50743:7;;50768:57;;50777:15;;-1:-1:-1;;;50794:30:0;;;;50768:8;:57::i;:::-;50761:64;;50686:145;;:::o;42918:401::-;-1:-1:-1;;;;;43049:25:0;;42985:7;43049:25;;;:17;:25;;;;;;;;43003:71;;;;;;;;;;;;;;-1:-1:-1;;;43003:71:0;;;;;;;;-1:-1:-1;;;43003:71:0;;-1:-1:-1;;;;;43003:71:0;;;;;-1:-1:-1;;;43003:71:0;;-1:-1:-1;;;;;43003:71:0;;;;;43088:19;;;:11;:19;;;;;:26;42985:7;;43003:71;-1:-1:-1;;;;;43088:26:0;43085:65;;43139:1;43132:8;;;;;43085:65;43159:16;43196:18;:30;;;43178:48;;:15;:48;;;;:::i;:::-;43159:67;;43242:71;43251:8;;43304;43292:9;;:20;;;;:::i;:::-;43261:28;;:51;;;;;;:::i;43242:71::-;43235:78;42918:401;-1:-1:-1;;;;42918:401:0:o;17573:139::-;17651:4;17675:12;;;;;;;;;;;-1:-1:-1;;;;;17675:29:0;;;;;;;;;;;;;;;17573:139::o;54263:331::-;54326:20;;54308:15;;-1:-1:-1;;;;;54326:20:0;:30;681:10;54326:44;;-1:-1:-1;;;;;;54326:44:0;;;;;;;-1:-1:-1;;;;;9550:32:1;;;54326:44:0;;;9532:51:1;9505:18;;54326:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54377:20;;54308:62;;-1:-1:-1;;;;;;54377:20:0;:25;681:10;54377:48;;-1:-1:-1;;;;;;54377:48:0;;;;;;;-1:-1:-1;;;;;10953:32:1;;;54377:48:0;;;10935:51:1;11002:18;;;10995:34;;;10908:18;;54377:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54526:7;54483:11;:25;54495:12;681:10;601:98;;54495:12;-1:-1:-1;;;;;54483:25:0;;;;;;;;;;;;-1:-1:-1;54483:25:0;:40;:50;;;-1:-1:-1;;;54483:40:0;;-1:-1:-1;;;;;54483:40:0;:50;:::i;:::-;681:10;54432:25;;;;:11;:25;;;;;:102;;-1:-1:-1;;;;;54432:102:0;;;-1:-1:-1;;;54432:102:0;;;;;;;;;;54546:42;;;;;-1:-1:-1;;;;;10953:32:1;;;10935:51;;11017:2;11002:18;;10995:34;;;10908:18;54546:42:0;10890:145:1;49835:271:0;23381:1;23978:7;;:19;;23970:63;;;;-1:-1:-1;;;23970:63:0;;;;;;;:::i;:::-;23381:1;24111:7;:18;40712:34:::1;37662:24;681:10:::0;40733:12:::1;601:98:::0;40712:34:::1;40704:91;;;::::0;-1:-1:-1;;;40704:91:0;;20016:2:1;40704:91:0::1;::::0;::::1;19998:21:1::0;20055:2;20035:18;;;20028:30;20094:34;20074:18;;;20067:62;-1:-1:-1;;;20145:18:1;;;20138:42;20197:19;;40704:91:0::1;19988:234:1::0;40704:91:0::1;-1:-1:-1::0;;;;;41051:25:0;::::2;41005:43;41051:25:::0;;;:17:::2;:25;::::0;;;;;;;41005:71;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;;41005:71:0;::::2;::::0;::::2;::::0;;::::2;::::0;-1:-1:-1;;;;;;;;41005:71:0;::::2;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::2;::::0;::::2;::::0;;;;;;;;41117:19;;;:11:::2;:19:::0;;;;;;41083:53;;;;::::2;::::0;;;;-1:-1:-1;;;;;41083:53:0;;::::2;::::0;;-1:-1:-1;;;41083:53:0;;;::::2;::::0;::::2;::::0;;::::2;::::0;41143:63;;;;::::2;::::0;;41189:17:::2;41143:63:::0;;;::::2;::::0;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;41143:63:0;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;49935:6;;41083:53;41291:21:::2;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::2;:44;::::0;::::2;:76:::0;41363:26:::2;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::2;::::0;41399:637:::2;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::2;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::2;:27;::::0;;::::2;:66:::0;;;;41676:56:::2;41716:15;41676:56:::0;::::2;:30:::0;;::::2;:56:::0;;;;41788:8:::2;::::0;41829:9:::2;::::0;41779:71:::2;::::0;41829:20:::2;::::0;;;::::2;::::0;::::2;:::i;41779:71::-;41741:110;;::::0;;41910:19:::2;41922:6:::0;41910:11:::2;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::2;:31;::::0;::::2;:62:::0;-1:-1:-1;;41984:44:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;41939:89:0::2;:42;::::0;::::2;:89:::0;41399:637:::2;-1:-1:-1::0;;;;;42044:25:0;;::::2;;::::0;;;:17:::2;:25;::::0;;;;;;;:46;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::2;::::0;;::::2;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::2;;;::::0;;;42097:11:::2;:19:::0;;;;;:34;;;;::::2;::::0;-1:-1:-1;;;;;42097:34:0;;::::2;-1:-1:-1::0;;;42097:34:0;;::::2;::::0;::::2;;::::0;;;42138:38;;:17:::2;:38:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;;::::2;::::0;;;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;49997:19;;::::3;::::0;;;;;:34;:44:::3;::::0;50034:7;;49997:34;::::3;;:44;:::i;:::-;-1:-1:-1::0;;;;;49952:19:0;::::3;;::::0;;;:11:::3;:19;::::0;;;;;;;;:90;;-1:-1:-1;;;;;49952:90:0;;::::3;-1:-1:-1::0;;;49952:90:0::3;::::0;::::3;::::0;;;::::3;::::0;;;50064:36;;10935:51:1;;;11002:18;;;10995:34;;;50064:36:0::3;::::0;10908:18:1;50064:36:0::3;;;;;;;-1:-1:-1::0;;23337:1:0;24290:22;;-1:-1:-1;;;;49835:271:0:o;42198:181::-;42305:7;42330:43;42346:6;42354:7;42363:9;42330:15;:43::i;:::-;-1:-1:-1;;;;;42323:50:0;;42198:181;-1:-1:-1;;;;42198:181:0:o;44294:222::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;44392:10:::1;:24:::0;;;44425:14:::1;:32:::0;;;44473:37:::1;::::0;;23490:25:1;;;23546:2;23531:18;;23524:34;;;44473:37:0::1;::::0;23463:18:1;44473:37:0::1;23445:119:1::0;51293:698:0;-1:-1:-1;;;;;51414:26:0;;51352:7;51414:26;;;:17;:26;;;;;;;;51368:72;;;;;;;;;;;;;;;-1:-1:-1;;;51368:72:0;;;;;;;-1:-1:-1;;;;;;;;51368:72:0;;;;;;;;;;-1:-1:-1;;;;;;;;51368:72:0;;;;;;;;;;;51481:20;;;:11;:20;;;;;51447:54;;;;;;;;;-1:-1:-1;;;;;51447:54:0;;;;;-1:-1:-1;;;51447:54:0;;;;;;;;;;;51669:31;;51598:42;;51352:7;;51368:72;;51447:54;;51352:7;;51541:159;;;38149:13;;51574:66;:21;:19;:21::i;:::-;:66;;;;:::i;:::-;51550:19;;51542:99;;;-1:-1:-1;;;;;51542:28:0;:99;:::i;:::-;51541:125;;;;:::i;:::-;:159;;;;:::i;:::-;51729:10;;:35;;-1:-1:-1;;;51729:35:0;;51758:4;51729:35;;;9532:51:1;51514:186:0;;-1:-1:-1;51707:19:0;;-1:-1:-1;;;;;51729:10:0;;;;:20;;9505:18:1;;51729:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51707:57;;51924:11;51905:16;:30;51901:54;;;51944:11;-1:-1:-1;51937:18:0;;-1:-1:-1;;;51937:18:0;51901:54;-1:-1:-1;51969:16:0;51293:698;-1:-1:-1;;;;51293:698:0:o;49185:640::-;49272:1;49262:7;:11;49254:61;;;;-1:-1:-1;;;49254:61:0;;19610:2:1;49254:61:0;;;19592:21:1;19649:2;19629:18;;;19622:30;19688:34;19668:18;;;19661:62;-1:-1:-1;;;19739:18:1;;;19732:35;19784:19;;49254:61:0;19582:227:1;49254:61:0;49360:7;49344:12;;49332:9;:24;;;;:::i;:::-;:35;;49324:85;;;;-1:-1:-1;;;49324:85:0;;16804:2:1;49324:85:0;;;16786:21:1;16843:2;16823:18;;;16816:30;16882:34;16862:18;;;16855:62;-1:-1:-1;;;16933:18:1;;;16926:35;16978:19;;49324:85:0;16776:227:1;49324:85:0;681:10;49471:25;;;;:11;:25;;;;;:40;:50;;49514:7;;-1:-1:-1;;;49471:40:0;;-1:-1:-1;;;;;49471:40:0;:50;:::i;:::-;681:10;49420:25;;;;:11;:25;;;;;:102;;-1:-1:-1;;;;;49420:102:0;;;-1:-1:-1;;;49420:102:0;;;;;;;;;;49573:12;;49563:22;;:7;:22;:::i;:::-;49550:36;;:9;:36;:::i;:::-;49533:53;-1:-1:-1;49598:10:0;;49595:161;;49640:38;;49622:12;;681:10;;49666:6;;49622:12;49640:38;49622:12;49640:38;49666:6;681:10;49640:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49621:57;;;49697:7;49689:57;;;;-1:-1:-1;;;49689:57:0;;;;;;;:::i;:::-;49595:161;;49777:42;;;681:10;10935:51:1;;11017:2;11002:18;;10995:34;;;49777:42:0;;10908:18:1;49777:42:0;10890:145:1;48375:330:0;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;48465:21:::1;48454:7;:32;;48446:85;;;::::0;-1:-1:-1;;;48446:85:0;;17617:2:1;48446:85:0::1;::::0;::::1;17599:21:1::0;17656:2;17636:18;;;17629:30;17695:34;17675:18;;;17668:62;-1:-1:-1;;;17746:18:1;;;17739:38;17794:19;;48446:85:0::1;17589:230:1::0;48446:85:0::1;48559:39;::::0;48541:12:::1;::::0;681:10;;48585:7;;48541:12;48559:39;48541:12;48559:39;48585:7;681:10;48559:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48540:58;;;48615:7;48607:57;;;;-1:-1:-1::0;;;48607:57:0::1;;;;;;;:::i;:::-;48678:21;::::0;12383:25:1;;;48678:21:0::1;::::0;12371:2:1;12356:18;48678:21:0::1;12338:76:1::0;53840:391:0;23381:1;23978:7;;:19;;23970:63;;;;-1:-1:-1;;;23970:63:0;;;;;;;:::i;:::-;23381:1;24111:7;:18;681:10;41005:43:::1;41051:25:::0;;;:17:::1;:25;::::0;;;;;;;41005:71;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;41005:71:0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;41005:71:0;::::1;;::::0;;;;-1:-1:-1;;;;;;;;41005:71:0;;::::1;::::0;::::1;::::0;;;;;;;;41117:19;;;:11:::1;:19:::0;;;;;;41083:53;;;;::::1;::::0;;;;-1:-1:-1;;;;;41083:53:0;;::::1;::::0;;-1:-1:-1;;;41083:53:0;;;::::1;::::0;::::1;::::0;;::::1;::::0;41143:63;;;;::::1;::::0;;41189:17:::1;41143:63:::0;;;::::1;::::0;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;41143:63:0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;41005:71;;41291:21:::1;:19;:21::i;:::-;-1:-1:-1::0;;;;;41237:76:0::1;:44;::::0;::::1;:76:::0;41363:26:::1;:24;:26::i;:::-;41320:70;;::::0;;-1:-1:-1;;;;;41403:20:0;::::1;::::0;41399:637:::1;;41434:15;41478:18;:30;;;41459:15;41452:56;;;;:::i;:::-;41434:74;;41517:14;41534:54;41550:6;41558:12;:19;;;-1:-1:-1::0;;;;;41534:54:0::1;41579:8;41534:54;;:15;:54::i;:::-;41517:71;;41661:6;41631:12;:27;;;:36;;;;:::i;:::-;-1:-1:-1::0;;;;;41601:66:0::1;:27;::::0;;::::1;:66:::0;;;;41676:56:::1;41716:15;41676:56:::0;::::1;:30:::0;;::::1;:56:::0;;;;41788:8:::1;::::0;41829:9:::1;::::0;41779:71:::1;::::0;41829:20:::1;::::0;;;::::1;::::0;::::1;:::i;41779:71::-;41741:110;;::::0;;41910:19:::1;41922:6:::0;41910:11:::1;:19::i;:::-;-1:-1:-1::0;;;;;41868:62:0::1;:31;::::0;::::1;:62:::0;-1:-1:-1;;41984:44:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;41939:89:0::1;:42;::::0;::::1;:89:::0;41399:637:::1;-1:-1:-1::0;;;;;42044:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:46;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;42044:46:0;;;;;;;-1:-1:-1;;;42044:46:0::1;::::0;;::::1;;;-1:-1:-1::0;;;;;;;;42044:46:0;-1:-1:-1;;;;;;;;42044:46:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;42044:46:0;;-1:-1:-1;;;;;;;;42044:46:0;;::::1;;;::::0;;;42097:11:::1;:19:::0;;;;;:34;;;;::::1;::::0;-1:-1:-1;;;;;42097:34:0;;::::1;-1:-1:-1::0;;;42097:34:0;;::::1;::::0;::::1;;::::0;;;42138:38;;:17:::1;:38:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;42138:38:0;;;;;;;-1:-1:-1;;;42138:38:0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;42138:38:0;-1:-1:-1;;;42138:38:0;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;;;::::0;;53940:25:::2;53952:12;681:10:::0;601:98;;53940:25:::2;53923:42;;53989:1;53980:6;:10;53972:44;;;::::0;-1:-1:-1;;;53972:44:0;;20833:2:1;53972:44:0::2;::::0;::::2;20815:21:1::0;20872:2;20852:18;;;20845:30;-1:-1:-1;;;20891:18:1;;;20884:51;20952:18;;53972:44:0::2;20805:171:1::0;53972:44:0::2;54036:1;54027:6;:10;54023:135;;;681:10:::0;54095:1:::2;54048:31:::0;;;:17:::2;:31;::::0;;;;:48;;-1:-1:-1;;54048:48:0::2;::::0;;54105:45:::2;::::0;:10:::2;::::0;-1:-1:-1;;;;;54105:10:0::2;::::0;54143:6;54105:23:::2;:45::i;:::-;54171:54;::::0;;681:10;11242:51:1;;11324:2;11309:18;;11302:34;;;54209:15:0::2;11352:18:1::0;;;11345:34;54171:54:0;;::::2;::::0;;;;11230:2:1;54171:54:0;;::::2;-1:-1:-1::0;;23337:1:0;24290:22;;-1:-1:-1;;;53840:391:0:o;50837:450::-;50905:63;;;;;;;;50951:17;50905:63;;;;;;;-1:-1:-1;;;50905:63:0;;-1:-1:-1;;;;;50905:63:0;;;;;-1:-1:-1;;;50905:63:0;;;;;;;;;;-1:-1:-1;;;50905:63:0;;;-1:-1:-1;;;;;50905:63:0;;;;;;50981:11;-1:-1:-1;;50905:63:0;50977:90;;51015:44;;;-1:-1:-1;;;;;51008:51:0;;-1:-1:-1;51008:51:0;;50977:90;51270:11;;38149:13;51208:18;:34;;;-1:-1:-1;;;;;51134:108:0;51171:18;:33;;;51142:62;;:26;:24;:26::i;:::-;:62;;;;:::i;:::-;51134:108;;;;:::i;:::-;:132;;;;:::i;:::-;51133:148;;;;:::i;:::-;51086:18;:44;;;-1:-1:-1;;;;;51086:195:0;;;;;:::i;:::-;51079:202;;;50837:450;:::o;19352:149::-;18641:7;18668:12;;;;;;;;;;:22;;;17142:30;17153:4;681:10;17159:12;601:98;17142:30;19467:26:::1;19479:4;19485:7;19467:11;:26::i;48713:464::-:0;40852:34;37729:24;681:10;40873:12;601:98;40852:34;40844:91;;;;-1:-1:-1;;;40844:91:0;;15169:2:1;40844:91:0;;;15151:21:1;15208:2;15188:18;;;15181:30;15247:34;15227:18;;;15220:62;-1:-1:-1;;;15298:18:1;;;15291:42;15350:19;;40844:91:0;15141:234:1;40844:91:0;48829:35;;::::1;48821:86;;;::::0;-1:-1:-1;;;48821:86:0;;15582:2:1;48821:86:0::1;::::0;::::1;15564:21:1::0;15621:2;15601:18;;;15594:30;15660:34;15640:18;;;15633:62;-1:-1:-1;;;15711:18:1;;;15704:36;15757:19;;48821:86:0::1;15554:228:1::0;48821:86:0::1;48929:9;48924:248;48944:21:::0;;::::1;48924:248;;;49079:7;;49087:1;49079:10;;;;;-1:-1:-1::0;;;49079:10:0::1;;;;;;;;;;;;;;;49035:11;:26;49047:10;;49058:1;49047:13;;;;;-1:-1:-1::0;;;49047:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49035:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49035:26:0;:41;:54:::1;::::0;;-1:-1:-1;;;49035:41:0;::::1;-1:-1:-1::0;;;;;49035:41:0::1;:54;:::i;:::-;48983:11;:26;48995:10;;49006:1;48995:13;;;;;-1:-1:-1::0;;;48995:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48983:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48983:26:0;:107;;-1:-1:-1;;;;;48983:107:0;;::::1;-1:-1:-1::0;;;48983:107:0::1;::::0;::::1;::::0;;;::::1;::::0;;49116:46:::1;49136:10:::0;;49147:1;49136:13;;::::1;;;-1:-1:-1::0;;;49136:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49151:7;;49159:1;49151:10;;;;;-1:-1:-1::0;;;49151:10:0::1;;;;;;;;;49116:46;::::0;;-1:-1:-1;;;;;10953:32:1;;;10935:51;;49151:10:0::1;::::0;;::::1;::::0;;;::::1;;11002:18:1::0;;;10995:34;-1:-1:-1;10908:18:1;49116:46:0::1;;;;;;;48967:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48924:248;;;;48713:464:::0;;;;:::o;53589:245::-;40565:41;15583:4;681:10;40593:12;601:98;40565:41;40557:98;;;;-1:-1:-1;;;40557:98:0;;;;;;;:::i;:::-;23381:1:::1;23978:7;;:19;;23970:63;;;;-1:-1:-1::0;;;23970:63:0::1;;;;;;;:::i;:::-;23381:1;24111:7;:18:::0;53675:17:::2;:30:::0;53708:15:::2;-1:-1:-1::0;;;53675:30:0;;::::2;;;:48;53667:112;;;::::0;-1:-1:-1;;;53667:112:0;;14388:2:1;53667:112:0::2;::::0;::::2;14370:21:1::0;14427:2;14407:18;;;14400:30;14466:34;14446:18;;;14439:62;-1:-1:-1;;;14517:18:1;;;14510:49;14576:19;;53667:112:0::2;14360:241:1::0;53667:112:0::2;53786:10;::::0;-1:-1:-1;;;;;53786:10:0::2;:19;681:10:::0;53786:42:::2;::::0;-1:-1:-1;;;;;;53786:42:0::2;::::0;;;;;;-1:-1:-1;;;;;10953:32:1;;;53786:42:0::2;::::0;::::2;10935:51:1::0;11002:18;;;10995:34;;;10908:18;;53786:42:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;23337:1:0::1;24290:22:::0;;53589:245::o;50116:273::-;50220:7;50238:14;50309;;37939:7;50291:32;;;;:::i;:::-;50280:7;50267:10;;50255:9;:22;;;;:::i;:::-;:32;;;;:::i;:::-;:69;;;;:::i;:::-;50238:86;;50342:41;50357:6;50365;50373:9;50342:14;:41::i;:::-;50335:48;50116:273;-1:-1:-1;;;;;50116:273:0:o;12827:106::-;12885:7;12916:1;12912;:5;:13;;12924:1;12912:13;;;-1:-1:-1;12920:1:0;;12905:20;-1:-1:-1;12827:106:0:o;18002:384::-;18082:22;18090:4;18096:7;18082;:22::i;:::-;18078:301;;18214:41;18242:7;-1:-1:-1;;;;;18214:41:0;18252:2;18214:19;:41::i;:::-;18312:38;18340:4;18347:2;18312:19;:38::i;:::-;18135:230;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18135:230:0;;;;;;;;;;-1:-1:-1;;;18121:246:0;;;;;;;:::i;21256:229::-;21331:22;21339:4;21345:7;21331;:22::i;:::-;21326:152;;21370:6;:12;;;;;;;;;;;-1:-1:-1;;;;;21370:29:0;;;;;;;;;:36;;-1:-1:-1;;21370:36:0;21402:4;21370:36;;;21453:12;681:10;601:98;;21453:12;-1:-1:-1;;;;;21426:40:0;21444:7;-1:-1:-1;;;;;21426:40:0;21438:4;21426:40;;;;;;;;;;21256:229;;:::o;21493:230::-;21568:22;21576:4;21582:7;21568;:22::i;:::-;21564:152;;;21639:5;21607:12;;;;;;;;;;;-1:-1:-1;;;;;21607:29:0;;;;;;;;;;:37;;-1:-1:-1;;21607:37:0;;;21664:40;681:10;;21607:12;;21664:40;;21639:5;21664:40;21493:230;;:::o;25038:205::-;25166:68;;-1:-1:-1;;;;;9852:15:1;;;25166:68:0;;;9834:34:1;9904:15;;9884:18;;;9877:43;9936:18;;;9929:34;;;25139:96:0;;25159:5;;-1:-1:-1;;;25189:27:0;9769:18:1;;25166:68:0;;;;-1:-1:-1;;25166:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25166:68:0;-1:-1:-1;;;;;;25166:68:0;;;;;;;;;;25139:19;:96::i;:::-;25038:205;;;;:::o;24853:177::-;24963:58;;-1:-1:-1;;;;;10953:32:1;;24963:58:0;;;10935:51:1;11002:18;;;10995:34;;;24936:86:0;;24956:5;;-1:-1:-1;;;24986:23:0;10908:18:1;;24963:58:0;10890:145:1;50395:259:0;50497:7;50515:16;50534:37;50553:6;50561:9;50534:18;:37::i;:::-;50515:56;-1:-1:-1;50644:3:0;38084:10;50605:18;50515:56;50605:7;:18;:::i;:::-;:36;;;;:::i;:::-;:42;;;;:::i;:::-;50595:52;;:7;:52;:::i;2472:447::-;2547:13;2573:19;2605:10;2609:6;2605:1;:10;:::i;:::-;:14;;2618:1;2605:14;:::i;:::-;-1:-1:-1;;;;;2595:25:0;;;;;-1:-1:-1;;;2595:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2595:25:0;;2573:47;;-1:-1:-1;;;2631:6:0;2638:1;2631:9;;;;;;-1:-1:-1;;;2631:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;2631:15:0;;;;;;;;;-1:-1:-1;;;2657:6:0;2664:1;2657:9;;;;;;-1:-1:-1;;;2657:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;2657:15:0;;;;;;;;-1:-1:-1;2688:9:0;2700:10;2704:6;2700:1;:10;:::i;:::-;:14;;2713:1;2700:14;:::i;:::-;2688:26;;2683:131;2720:1;2716;:5;2683:131;;;-1:-1:-1;;;2764:5:0;2772:3;2764:11;2755:21;;;;;-1:-1:-1;;;2755:21:0;;;;;;;;;;;;2743:6;2750:1;2743:9;;;;;;-1:-1:-1;;;2743:9:0;;;;;;;;;;;;:33;-1:-1:-1;;;;;2743:33:0;;;;;;;;-1:-1:-1;2801:1:0;2791:11;;;;;2723:3;;;:::i;:::-;;;2683:131;;;-1:-1:-1;2832:10:0;;2824:55;;;;-1:-1:-1;;;2824:55:0;;14808:2:1;2824:55:0;;;14790:21:1;;;14827:18;;;14820:30;14886:34;14866:18;;;14859:62;14938:18;;2824:55:0;14780:182:1;27287:761:0;27711:23;27737:69;27765:4;27737:69;;;;;;;;;;;;;;;;;27745:5;-1:-1:-1;;;;;27737:27:0;;;:69;;;;;:::i;:::-;27821:17;;27711:95;;-1:-1:-1;27821:21:0;27817:224;;27963:10;27952:30;;;;;;;;;;;;:::i;:::-;27944:85;;;;-1:-1:-1;;;27944:85:0;;21541:2:1;27944:85:0;;;21523:21:1;21580:2;21560:18;;;21553:30;21619:34;21599:18;;;21592:62;-1:-1:-1;;;21670:18:1;;;21663:40;21720:19;;27944:85:0;21513:232:1;6527:195:0;6630:12;6662:52;6684:6;6692:4;6698:1;6701:12;6630;3976:20;;7823:60;;;;-1:-1:-1;;;7823:60:0;;21183:2:1;7823:60:0;;;21165:21:1;21222:2;21202:18;;;21195:30;21261:31;21241:18;;;21234:59;21310:18;;7823:60:0;21155:179:1;7823:60:0;7957:12;7971:23;7998:6;-1:-1:-1;;;;;7998:11:0;8018:5;8026:4;7998:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7956:75;;;;8049:52;8067:7;8076:10;8088:12;8049:17;:52::i;:::-;8042:59;7579:530;-1:-1:-1;;;;;;;7579:530:0:o;10119:742::-;10234:12;10263:7;10259:595;;;-1:-1:-1;10294:10:0;10287:17;;10259:595;10408:17;;:21;10404:439;;10671:10;10665:17;10732:15;10719:10;10715:2;10711:19;10704:44;10619:148;10814:12;10807:20;;-1:-1:-1;;;10807:20:0;;;;;;;;:::i;14:138:1:-;93:13;;115:31;93:13;115:31;:::i;157:391::-;;;284:3;277:4;269:6;265:17;261:27;251:2;;307:6;299;292:22;251:2;-1:-1:-1;335:20:1;;-1:-1:-1;;;;;367:30:1;;364:2;;;417:8;407;400:26;364:2;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:2;;;538:1;535;528:12;475:2;241:307;;;;;:::o;553:134::-;630:13;;652:29;630:13;652:29;:::i;692:192::-;771:13;;-1:-1:-1;;;;;813:46:1;;803:57;;793:2;;874:1;871;864:12;889:136;967:13;;989:30;967:13;989:30;:::i;1030:257::-;;1142:2;1130:9;1121:7;1117:23;1113:32;1110:2;;;1163:6;1155;1148:22;1110:2;1207:9;1194:23;1226:31;1251:5;1226:31;:::i;1292:1311::-;;;;;1464:3;1452:9;1443:7;1439:23;1435:33;1432:2;;;1486:6;1478;1471:22;1432:2;1530:9;1517:23;1549:31;1574:5;1549:31;:::i;:::-;1599:5;-1:-1:-1;1656:2:1;1641:18;;1628:32;1669:33;1628:32;1669:33;:::i;:::-;1721:7;-1:-1:-1;1775:2:1;1760:18;;1747:32;;-1:-1:-1;1830:2:1;1815:18;;1802:32;-1:-1:-1;;;;;1883:14:1;;;1880:2;;;1915:6;1907;1900:22;1880:2;1958:6;1947:9;1943:22;1933:32;;2003:7;1996:4;1992:2;1988:13;1984:27;1974:2;;2030:6;2022;2015:22;1974:2;2071;2058:16;2093:2;2089;2086:10;2083:2;;;2099:18;;:::i;:::-;2174:2;2168:9;2142:2;2228:13;;-1:-1:-1;;2224:22:1;;;2248:2;2220:31;2216:40;2204:53;;;2272:18;;;2292:22;;;2269:46;2266:2;;;2318:18;;:::i;:::-;2358:10;2354:2;2347:22;2393:2;2385:6;2378:18;2433:7;2428:2;2423;2419;2415:11;2411:20;2408:33;2405:2;;;2459:6;2451;2444:22;2405:2;2520;2515;2511;2507:11;2502:2;2494:6;2490:15;2477:46;2543:15;;;2560:2;2539:24;2532:40;;;;1422:1181;;;;-1:-1:-1;1422:1181:1;;-1:-1:-1;;;;1422:1181:1:o;2608:325::-;;;2737:2;2725:9;2716:7;2712:23;2708:32;2705:2;;;2758:6;2750;2743:22;2705:2;2802:9;2789:23;2821:31;2846:5;2821:31;:::i;:::-;2871:5;2923:2;2908:18;;;;2895:32;;-1:-1:-1;;;2695:238:1:o;2938:393::-;;;;3084:2;3072:9;3063:7;3059:23;3055:32;3052:2;;;3105:6;3097;3090:22;3052:2;3149:9;3136:23;3168:31;3193:5;3168:31;:::i;:::-;3218:5;3270:2;3255:18;;3242:32;;-1:-1:-1;3321:2:1;3306:18;;;3293:32;;3042:289;-1:-1:-1;;;3042:289:1:o;3336:803::-;;;;;3535:2;3523:9;3514:7;3510:23;3506:32;3503:2;;;3556:6;3548;3541:22;3503:2;3601:9;3588:23;-1:-1:-1;;;;;3671:2:1;3663:6;3660:14;3657:2;;;3692:6;3684;3677:22;3657:2;3736:70;3798:7;3789:6;3778:9;3774:22;3736:70;:::i;:::-;3825:8;;-1:-1:-1;3710:96:1;-1:-1:-1;3913:2:1;3898:18;;3885:32;;-1:-1:-1;3929:16:1;;;3926:2;;;3963:6;3955;3948:22;3926:2;;4007:72;4071:7;4060:8;4049:9;4045:24;4007:72;:::i;:::-;3493:646;;;;-1:-1:-1;4098:8:1;-1:-1:-1;;;;3493:646:1:o;4144:297::-;;4264:2;4252:9;4243:7;4239:23;4235:32;4232:2;;;4285:6;4277;4270:22;4232:2;4322:9;4316:16;4375:5;4368:13;4361:21;4354:5;4351:32;4341:2;;4402:6;4394;4387:22;4446:190;;4558:2;4546:9;4537:7;4533:23;4529:32;4526:2;;;4579:6;4571;4564:22;4526:2;-1:-1:-1;4607:23:1;;4516:120;-1:-1:-1;4516:120:1:o;4641:325::-;;;4770:2;4758:9;4749:7;4745:23;4741:32;4738:2;;;4791:6;4783;4776:22;4738:2;4832:9;4819:23;4809:33;;4892:2;4881:9;4877:18;4864:32;4905:31;4930:5;4905:31;:::i;:::-;4955:5;4945:15;;;4728:238;;;;;:::o;4971:306::-;;5082:2;5070:9;5061:7;5057:23;5053:32;5050:2;;;5103:6;5095;5088:22;5050:2;5134:23;;-1:-1:-1;;;;;;5186:32:1;;5176:43;;5166:2;;5238:6;5230;5223:22;5282:390;;;5407:2;5395:9;5386:7;5382:23;5378:32;5375:2;;;5428:6;5420;5413:22;5375:2;5472:9;5459:23;5491:29;5514:5;5491:29;:::i;:::-;5539:5;-1:-1:-1;5596:2:1;5581:18;;5568:32;5609:31;5568:32;5609:31;:::i;5677:255::-;;5788:2;5776:9;5767:7;5763:23;5759:32;5756:2;;;5809:6;5801;5794:22;5756:2;5853:9;5840:23;5872:30;5896:5;5872:30;:::i;6132:194::-;;6255:2;6243:9;6234:7;6230:23;6226:32;6223:2;;;6276:6;6268;6261:22;6223:2;-1:-1:-1;6304:16:1;;6213:113;-1:-1:-1;6213:113:1:o;6331:258::-;;;6460:2;6448:9;6439:7;6435:23;6431:32;6428:2;;;6481:6;6473;6466:22;6428:2;-1:-1:-1;;6509:23:1;;;6579:2;6564:18;;;6551:32;;-1:-1:-1;6418:171:1:o;6594:296::-;;6705:2;6693:9;6684:7;6680:23;6676:32;6673:2;;;6726:6;6718;6711:22;6673:2;6770:9;6757:23;6820:10;6813:5;6809:22;6802:5;6799:33;6789:2;;6851:6;6843;6836:22;6895:1206;;;;;;;;;;;;;7201:3;7189:9;7180:7;7176:23;7172:33;7169:2;;;7223:6;7215;7208:22;7169:2;7260:9;7254:16;-1:-1:-1;;;;;7303:5:1;7299:38;7292:5;7289:49;7279:2;;7357:6;7349;7342:22;7279:2;7385:5;-1:-1:-1;7409:49:1;7454:2;7439:18;;7409:49;:::i;:::-;7399:59;;7477:49;7522:2;7511:9;7507:18;7477:49;:::i;:::-;7467:59;;7545:49;7590:2;7579:9;7575:18;7545:49;:::i;:::-;7535:59;;7613:49;7657:3;7646:9;7642:19;7613:49;:::i;:::-;7603:59;;7681:48;7724:3;7713:9;7709:19;7681:48;:::i;:::-;7671:58;;7748:48;7791:3;7780:9;7776:19;7748:48;:::i;:::-;7738:58;;7815:50;7860:3;7849:9;7845:19;7815:50;:::i;:::-;7805:60;;7905:3;7894:9;7890:19;7884:26;7874:36;;7950:3;7939:9;7935:19;7929:26;7919:36;;7975:50;8020:3;8009:9;8005:19;7975:50;:::i;:::-;7964:61;;8045:50;8090:3;8079:9;8075:19;8045:50;:::i;:::-;8034:61;;7159:942;;;;;;;;;;;;;;:::o;8106:274::-;;8273:6;8267:13;8289:53;8335:6;8330:3;8323:4;8315:6;8311:17;8289:53;:::i;:::-;8358:16;;;;;8243:137;-1:-1:-1;;8243:137:1:o;8595:786::-;;9006:25;9001:3;8994:38;9061:6;9055:13;9077:62;9132:6;9127:2;9122:3;9118:12;9111:4;9103:6;9099:17;9077:62;:::i;:::-;-1:-1:-1;;;9198:2:1;9158:16;;;9190:11;;;9183:40;9248:13;;9270:63;9248:13;9319:2;9311:11;;9304:4;9292:17;;9270:63;:::i;:::-;9353:17;9372:2;9349:26;;8984:397;-1:-1:-1;;;;8984:397:1:o;11390:650::-;11559:2;11611:21;;;11681:13;;11584:18;;;11703:22;;;11390:650;;11559:2;11782:15;;;;11756:2;11741:18;;;11390:650;11828:186;11842:6;11839:1;11836:13;11828:186;;;11907:13;;11922:10;11903:30;11891:43;;11989:15;;;;11954:12;;;;11864:1;11857:9;11828:186;;;-1:-1:-1;12031:3:1;;11539:501;-1:-1:-1;;;;;;11539:501:1:o;13798:383::-;;13947:2;13936:9;13929:21;13979:6;13973:13;14022:6;14017:2;14006:9;14002:18;13995:34;14038:66;14097:6;14092:2;14081:9;14077:18;14072:2;14064:6;14060:15;14038:66;:::i;:::-;14165:2;14144:15;-1:-1:-1;;14140:29:1;14125:45;;;;14172:2;14121:54;;13919:262;-1:-1:-1;;13919:262:1:o;16196:401::-;16398:2;16380:21;;;16437:2;16417:18;;;16410:30;16476:34;16471:2;16456:18;;16449:62;-1:-1:-1;;;16542:2:1;16527:18;;16520:35;16587:3;16572:19;;16370:227::o;17824:408::-;18026:2;18008:21;;;18065:2;18045:18;;;18038:30;18104:34;18099:2;18084:18;;18077:62;-1:-1:-1;;;18170:2:1;18155:18;;18148:42;18222:3;18207:19;;17998:234::o;21750:355::-;21952:2;21934:21;;;21991:2;21971:18;;;21964:30;22030:33;22025:2;22010:18;;22003:61;22096:2;22081:18;;21924:181::o;24594:253::-;;-1:-1:-1;;;;;24723:2:1;24720:1;24716:10;24753:2;24750:1;24746:10;24784:3;24780:2;24776:12;24771:3;24768:21;24765:2;;;24792:18;;:::i;:::-;24828:13;;24642:205;-1:-1:-1;;;;24642:205:1:o;24852:128::-;;24923:1;24919:6;24916:1;24913:13;24910:2;;;24929:18;;:::i;:::-;-1:-1:-1;24965:9:1;;24900:80::o;24985:216::-;;-1:-1:-1;;;;;25112:2:1;25109:1;25105:10;25134:3;25124:2;;25141:18;;:::i;:::-;25179:10;;25175:20;;;;;25031:170;-1:-1:-1;;25031:170:1:o;25206:120::-;;25272:1;25262:2;;25277:18;;:::i;:::-;-1:-1:-1;25311:9:1;;25252:74::o;25331:287::-;;-1:-1:-1;;;;;25464:2:1;25461:1;25457:10;25494:2;25491:1;25487:10;25550:3;25546:2;25542:12;25537:3;25534:21;25527:3;25520:11;25513:19;25509:47;25506:2;;;25559:18;;:::i;:::-;25599:13;;25383:235;-1:-1:-1;;;;25383:235:1:o;25623:168::-;;25729:1;25725;25721:6;25717:14;25714:1;25711:21;25706:1;25699:9;25692:17;25688:45;25685:2;;;25736:18;;:::i;:::-;-1:-1:-1;25776:9:1;;25675:116::o;25796:246::-;;-1:-1:-1;;;;;25949:10:1;;;;25919;;25971:12;;;25968:2;;;25986:18;;:::i;:::-;26023:13;;25845:197;-1:-1:-1;;;25845:197:1:o;26047:125::-;;26115:1;26112;26109:8;26106:2;;;26120:18;;:::i;:::-;-1:-1:-1;26157:9:1;;26096:76::o;26177:221::-;;26245:10;26305;;;;26275;;26327:12;;;26324:2;;;26342:18;;:::i;26403:258::-;26475:1;26485:113;26499:6;26496:1;26493:13;26485:113;;;26575:11;;;26569:18;26556:11;;;26549:39;26521:2;26514:10;26485:113;;;26616:6;26613:1;26610:13;26607:2;;;-1:-1:-1;;26651:1:1;26633:16;;26626:27;26456:205::o;26666:136::-;;26733:5;26723:2;;26742:18;;:::i;:::-;-1:-1:-1;;;26778:18:1;;26713:89::o;26807:135::-;;-1:-1:-1;;26867:17:1;;26864:2;;;26887:18;;:::i;:::-;-1:-1:-1;26934:1:1;26923:13;;26854:88::o;26947:127::-;27008:10;27003:3;26999:20;26996:1;26989:31;27039:4;27036:1;27029:15;27063:4;27060:1;27053:15;27079:127;27140:10;27135:3;27131:20;27128:1;27121:31;27171:4;27168:1;27161:15;27195:4;27192:1;27185:15;27211:127;27272:10;27267:3;27263:20;27260:1;27253:31;27303:4;27300:1;27293:15;27327:4;27324:1;27317:15;27343:131;-1:-1:-1;;;;;27418:31:1;;27408:42;;27398:2;;27464:1;27461;27454:12;27398:2;27388:86;:::o;27479:118::-;27566:5;27563:1;27552:20;27545:5;27542:31;27532:2;;27587:1;27584;27577:12;27602:119;27687:8;27680:5;27676:20;27669:5;27666:31;27656:2;;27711:1;27708;27701:12
Swarm Source
ipfs://f6cc43ca86573fdfcda498fdb0dd5a0f8d6469c99559cd58843a2baf89385fbe
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.