Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 37 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Stake With Vac | 21486107 | 448 days ago | IN | 0 ETH | 0.0012163 | ||||
| Stake With Vac | 21486062 | 448 days ago | IN | 0 ETH | 0.00109322 | ||||
| Stake With Vac | 21486041 | 448 days ago | IN | 0 ETH | 0.00109462 | ||||
| Stake With Vac | 21485986 | 448 days ago | IN | 0 ETH | 0.00023619 | ||||
| Stake With Vac | 21485780 | 448 days ago | IN | 0 ETH | 0.00120208 | ||||
| Stake With Vac | 20642681 | 565 days ago | IN | 0 ETH | 0.00065297 | ||||
| Stake With Vac | 20528558 | 581 days ago | IN | 0 ETH | 0.00096175 | ||||
| Stake With Vac | 20528552 | 581 days ago | IN | 0 ETH | 0.00106254 | ||||
| Stake With Vac | 20528545 | 581 days ago | IN | 0 ETH | 0.00119287 | ||||
| Stake With Vac | 20528542 | 581 days ago | IN | 0 ETH | 0.00113992 | ||||
| Stake With Vac | 20528532 | 581 days ago | IN | 0 ETH | 0.00153186 | ||||
| Stake With Vac | 20528522 | 581 days ago | IN | 0 ETH | 0.00148726 | ||||
| Stake With Vac | 20073950 | 645 days ago | IN | 0 ETH | 0.00123906 | ||||
| Stake With Vac | 20073924 | 645 days ago | IN | 0 ETH | 0.00121524 | ||||
| Stake With Vac | 20068297 | 646 days ago | IN | 0 ETH | 0.00225025 | ||||
| Stake With Vac | 20068285 | 646 days ago | IN | 0 ETH | 0.00209215 | ||||
| Stake With Vac | 20067015 | 646 days ago | IN | 0 ETH | 0.00174983 | ||||
| Stake With Vac | 20061810 | 646 days ago | IN | 0 ETH | 0.0021099 | ||||
| Stake With Vac | 20061794 | 646 days ago | IN | 0 ETH | 0.00215102 | ||||
| Stake With Vac | 20016538 | 653 days ago | IN | 0 ETH | 0.00151524 | ||||
| Stake With Vac | 20011742 | 653 days ago | IN | 0 ETH | 0.00448724 | ||||
| Stake With Vac | 20007017 | 654 days ago | IN | 0 ETH | 0.00287103 | ||||
| Stake With Usd | 20003631 | 655 days ago | IN | 0 ETH | 0.00288537 | ||||
| Stake With Vac | 19996766 | 656 days ago | IN | 0 ETH | 0.00125966 | ||||
| Stake With Vac | 19996758 | 656 days ago | IN | 0 ETH | 0.00136835 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VACPublicSavingBook
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-05-30
*/
/**
*Submitted for verification at Etherscan.io on 2024-05-30
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
/*
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender)
external
view
returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
/**
* @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 External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @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 {AccessControl-_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 Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account)
external
view
returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @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) external;
/**
* @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) external;
/**
* @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) external;
}
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index)
external
view
returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastValue;
// Update the index for the moved value
set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value)
private
view
returns (bool)
{
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index)
private
view
returns (bytes32)
{
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value)
internal
returns (bool)
{
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value)
internal
view
returns (bool)
{
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index)
internal
view
returns (bytes32)
{
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set)
internal
view
returns (bytes32[] memory)
{
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value)
internal
returns (bool)
{
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index)
internal
view
returns (address)
{
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set)
internal
view
returns (address[] memory)
{
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value)
internal
returns (bool)
{
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value)
internal
view
returns (bool)
{
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index)
internal
view
returns (uint256)
{
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set)
internal
view
returns (uint256[] memory)
{
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionCallWithValue(
target,
data,
0,
"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"
);
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return
verifyCallResultFromTarget(
target,
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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return
verifyCallResultFromTarget(
target,
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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return
verifyCallResultFromTarget(
target,
success,
returndata,
errorMessage
);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage)
private
pure
{
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(
oldAllowance >= value,
"SafeERC20: decreased allowance below zero"
);
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(
nonceAfter == nonceBefore + 1,
"SafeERC20: permit did not succeed"
);
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
// Return data is optional
require(
abi.decode(returndata, (bool)),
"SafeERC20: ERC20 operation did not succeed"
);
}
}
}
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV // Deprecated in v4.8
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature)
internal
pure
returns (address, RecoverError)
{
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature)
internal
pure
returns (address)
{
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs &
bytes32(
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (
uint256(s) >
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
) {
return (address(0), RecoverError.InvalidSignatureS);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s)
internal
pure
returns (bytes32)
{
return
keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n",
Strings.toString(s.length),
s
)
);
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
internal
pure
returns (bytes32)
{
return
keccak256(
abi.encodePacked("\x19\x01", domainSeparator, structHash)
);
}
}
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @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.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding)
internal
pure
returns (uint256)
{
unchecked {
uint256 result = sqrt(a);
return
result +
(rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding)
internal
pure
returns (uint256)
{
unchecked {
uint256 result = log2(value);
return
result +
(rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding)
internal
pure
returns (uint256)
{
unchecked {
uint256 result = log10(value);
return
result +
(rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding)
internal
pure
returns (uint256)
{
unchecked {
uint256 result = log256(value);
return
result +
(rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @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] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
/**
* @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 Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
/**
* @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 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]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @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
virtual
override
returns (bool)
{
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @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]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" 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
virtual
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.
*
* May emit a {RoleGranted} event.
*/
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.
*
* May emit a {RoleRevoked} event.
*/
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 revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
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.
*
* May emit a {RoleGranted} event.
*
* [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}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
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 {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerable is
IAccessControlEnumerable,
AccessControl
{
using EnumerableSet for EnumerableSet.AddressSet;
mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool)
{
return
interfaceId == type(IAccessControlEnumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index)
public
view
virtual
override
returns (address)
{
return _roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role)
public
view
virtual
override
returns (uint256)
{
return _roleMembers[role].length();
}
/**
* @dev Overload {_grantRole} to track enumerable memberships
*/
function _grantRole(bytes32 role, address account)
internal
virtual
override
{
super._grantRole(role, account);
_roleMembers[role].add(account);
}
/**
* @dev Overload {_revokeRole} to track enumerable memberships
*/
function _revokeRole(bytes32 role, address account)
internal
virtual
override
{
super._revokeRole(role, account);
_roleMembers[role].remove(account);
}
}
interface IBuyToken {
function swap(
address _token,
uint256 _vacTokenPerToken,
uint256 _tokenAmount,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external payable;
}
abstract contract Blacklist {
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private _blackList;
event AddedToBlackList(address indexed account, uint256 indexed timestamp);
event RemovedFromBlackList(
address indexed account,
uint256 indexed timestamp
);
modifier onlyNonBlackListed(address account) {
require(!isBlackListed(account), "BlackList: Blacklisted");
_;
}
function blackListLength() external view returns (uint256) {
return _blackList.length();
}
function blackListByIndex(uint256 index) external view returns (address) {
return _blackList.at(index);
}
function wholeBlackList() external view returns (address[] memory) {
return _blackList.values();
}
function isBlackListed(address account) public view returns (bool) {
return _blackList.contains(account);
}
function _addToBlackList(address account) internal {
require(account != address(0), "addToBlackList: Zero Address");
require(!isBlackListed(account), "addToBlackList: Already BlackListed");
_blackList.add(account);
emit AddedToBlackList(account, block.timestamp);
}
function _removeFromBlackList(address account) internal {
require(account != address(0), "removeFromBlackList: Zero Address");
require(isBlackListed(account), "removeFromBlackList: Not BlackListed");
_blackList.remove(account);
emit RemovedFromBlackList(account, block.timestamp);
}
function _addToBlackListBatch(address[] calldata account) internal {
uint256 length = account.length;
require(length != 0, "addToBlackListBatch: No address available");
for (uint256 i; i < length; i++) {
_addToBlackList(account[i]);
}
}
function _removeFromBlackListBatch(address[] calldata account) internal {
uint256 length = account.length;
require(length != 0, "removeFromBlackListBatch: No address available");
for (uint256 i; i < length; i++) {
_removeFromBlackList(account[i]);
}
}
}
abstract contract StorageVault {
enum Flag {
ClaimReward,
ClaimVandCReward,
ClaimCaptial,
ClaimVac,
ShareRefferalReward
}
enum PlanType {
Silver,
Gold,
Platinum
}
struct OwnerData {
uint256 totalDeposited;
uint256 totalWithdrawed;
uint256[] depositedAmountById;
uint256[] withdrawAmountById;
}
struct Plan {
uint256 minimumAmount;
uint256 planDuration;
}
struct userPlanData {
PlanType planType;
uint256 stakedAmount;
uint256 stakedTime;
uint256 expiryTime;
bool isCapitalClaimed;
bool isVandC;
uint256 vAndCAmount;
}
struct User {
bool isExist;
uint256 userId;
uint256 referrerID;
address[] referral;
uint256 numPlans;
bool isActiveUser;
address[] activeUsers;
mapping(uint256 => userPlanData) userPlanList;
}
bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE");
uint256 public constant PER_MONTH_SECONDS = 2592000;
uint256 public constant PER_DAY_SECONDS = 86400;
uint256 public constant DIVISOR = 100e18;
uint256 public currUserId;
uint256 public fee;
address public treasury;
address public signer;
address public usd;
address public vac;
IBuyToken public buyToken;
OwnerData public ownerData;
mapping(Flag => mapping(address => uint256)) public nonce;
mapping(PlanType => uint256) public vAndCRewardPercentage;
mapping(PlanType => Plan) public planDetails;
mapping(uint256 => address) public userList;
mapping(address => User) public userData;
mapping(address => mapping(PlanType => uint256)) public deposits;
mapping(address => mapping(PlanType => uint256)) public claimedAmount;
event Deposit(
uint256 planType,
uint256 indexed amount,
uint256 indexed timestamp
);
event Withdraw(
address indexed token,
address indexed to,
uint256 indexed amount
);
event Stake(
uint256 indexed refId,
address indexed user,
uint256 planType,
uint256 indexed amount,
bool isVandC,
uint256 timestamp
);
event ClaimReward(
address user,
uint256 userPlanId,
uint256 indexed treasuryFee,
uint256 indexed rewardAmount,
uint256 timestamp
);
event ClaimVandCReward(
address indexed user,
uint256 indexed userPlanId,
uint256 indexed amount,
uint256 timestamp
);
event ClaimCaptial(
address indexed user,
uint256 indexed userPlanId,
uint256 indexed amount,
uint256 timestamp
);
event ClaimAmount(
address indexed token,
address indexed to,
uint256 indexed amount,
uint256 timestamp
);
event UpdatePercentage(
uint256 indexed flag,
uint256 indexed oldPercentage,
uint256 indexed newPercentage
);
event UpdateAddress(
uint256 indexed flag,
address indexed oldAddress,
address indexed newAddress
);
event UpdateVAndCRewardPercentage(
PlanType indexed planType,
uint256 indexed oldPercentage,
uint256 indexed newPercentage
);
event OwnerEvent(
bool indexed isDeposit,
address indexed account,
uint256 indexed amount,
uint256 timestamp
);
}
abstract contract ModControl is StorageVault {
modifier onlyValidEoaAddr(address account) {
require(
account != address(0) && !Address.isContract(account),
"Invalid EOA Address"
);
_;
}
modifier onlyValidContractAddr(address account) {
require(Address.isContract(account), "Invalid Contract Address");
_;
}
modifier onlyValidAddr(address account) {
require(account != address(0), "Invalid Address");
_;
}
modifier onlyValidAmt(uint256 amount) {
require(amount > 0, "Invalid amount");
_;
}
modifier onlyValidExpiry(uint256 timestamp) {
require(timestamp >= block.timestamp, "Expired!");
_;
}
}
abstract contract Utils is StorageVault {
using ECDSA for bytes32;
function getOwnerDataById(bool isDepositedAmount, uint256 index)
external
view
returns (uint256)
{
if (isDepositedAmount) return ownerData.depositedAmountById[index];
else return ownerData.withdrawAmountById[index];
}
function activeUserLength(address account) external view returns (uint256) {
return userData[account].activeUsers.length;
}
function activeUsers(address account)
external
view
returns (address[] memory)
{
return userData[account].activeUsers;
}
function viewReferrals(address account)
external
view
returns (address[] memory)
{
return userData[account].referral;
}
function viewReferralByIndex(address account, uint256 index)
external
view
returns (address)
{
return userData[account].referral[index];
}
function viewReferrerAddress(address account)
external
view
returns (address)
{
return userList[userData[account].referrerID];
}
function userPlanDetails(address account, uint256 userPlanId)
public
view
returns (userPlanData memory)
{
return userData[account].userPlanList[userPlanId];
}
function isActiveUser(address account) public view returns (bool) {
return userData[account].isActiveUser;
}
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
// Modifier to check if an address is not a contract address
modifier onlyContract(address account) {
require(!isContract(account), "Address is a contract");
_;
}
function prepareHash(
uint256 userPlanId,
address account,
uint256 vAndCAmount,
uint256 expiry,
Flag flag
) public view returns (bytes32) {
return
keccak256(
abi.encodePacked(
userPlanId,
account,
vAndCAmount,
expiry,
nonce[flag][account],
flag,
address(this)
)
);
}
function _validateSignature(
uint256 userPlanId,
address account,
uint256 amount,
uint256 expiry,
Flag flag,
bytes calldata signature
) internal view {
require(
signer ==
prepareHash(userPlanId, account, amount, expiry, flag)
.toEthSignedMessageHash()
.recover(signature),
"VS: I S"
);
}
}
abstract contract AdminControl is
StorageVault,
ModControl,
Utils,
AccessControlEnumerable,
Pausable,
Blacklist
{
using SafeERC20 for IERC20;
function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {
_pause();
}
function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {
_unpause();
}
function addToBlackListBatch(address[] calldata account)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_addToBlackListBatch(account);
}
function removeFromBlackListBatch(address[] calldata account)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_removeFromBlackListBatch(account);
}
function updateUsd(address _newUsd) external onlyRole(DEFAULT_ADMIN_ROLE) {
_updateUsd(_newUsd);
}
function updateSigner(address account)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_updateSigner(account);
}
function updateVac(address _newVac) external onlyRole(DEFAULT_ADMIN_ROLE) {
_updateVac(_newVac);
}
function updateTreasury(address newTreasury)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_updateTreasury(newTreasury);
}
function updateRoot(address _newRoot)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_updateRoot(_newRoot);
}
function updateFee(uint256 _newFee) external onlyRole(DEFAULT_ADMIN_ROLE) {
_updateFee(_newFee);
}
function updatePlan(
PlanType planType,
uint256 minimumAmount,
uint256 planDuration
) external onlyRole(DEFAULT_ADMIN_ROLE) {
_updatePlan(planType, minimumAmount, planDuration);
}
function updateVAndCRewardPercentage(
PlanType planType,
uint256 rewardPercentage
) external onlyRole(DEFAULT_ADMIN_ROLE) {
_updateVAndCRewardPercentage(planType, rewardPercentage);
}
function updateBuyToken(address newBuyTokenAddress)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
_updateBuyToken(newBuyTokenAddress);
}
function retrieve(
address token,
address to,
uint256 amount
)
external
onlyRole(DEFAULT_ADMIN_ROLE)
onlyValidAddr(to)
onlyValidAmt(amount)
{
require(!isBlackListed(to), "withdraw: to is Blacklisted");
if (token == address(0)) Address.sendValue(payable(to), amount);
else {
require(
IERC20(token).balanceOf(address(this)) >= amount,
"withdraw: Insufficient balance"
);
SafeERC20.safeTransfer(IERC20(token), to, amount);
}
emit Withdraw(token, to, amount);
}
function _updateFee(uint256 _newFee) internal {
require(_newFee <= DIVISOR, "UF: Invalid Fee");
emit UpdatePercentage(1, fee, _newFee);
fee = _newFee;
}
function _updateVAndCRewardPercentage(
PlanType planType,
uint256 rewardPercentage
) internal {
emit UpdateVAndCRewardPercentage(
planType,
vAndCRewardPercentage[planType],
rewardPercentage
);
vAndCRewardPercentage[planType] = rewardPercentage;
}
function _updateSigner(address account) internal onlyValidEoaAddr(account) {
emit UpdateAddress(2, signer, account);
signer = account;
}
function _updateVac(address _newVac)
internal
onlyValidContractAddr(_newVac)
{
emit UpdateAddress(3, vac, _newVac);
vac = _newVac;
}
function _updateUsd(address _newUsd)
internal
onlyValidContractAddr(_newUsd)
{
emit UpdateAddress(4, usd, _newUsd);
usd = _newUsd;
}
function _updateTreasury(address _newTreasury)
internal
onlyValidAddr(_newTreasury)
{
emit UpdateAddress(5, treasury, _newTreasury);
treasury = _newTreasury;
}
function _updateRoot(address _newRoot) internal onlyValidAddr(_newRoot) {
address oldAddress = userList[0];
User storage OldRoot = userData[oldAddress];
User storage newRoot = userData[_newRoot];
require(!newRoot.isExist, "UR: A E");
newRoot.isExist = true;
newRoot.userId = 0;
newRoot.referrerID = 0;
newRoot.referral = OldRoot.referral;
newRoot.activeUsers = OldRoot.activeUsers;
userList[0] = _newRoot;
emit UpdateAddress(6, oldAddress, _newRoot);
}
function _updateBuyToken(address newBuyTokenAddress)
internal
onlyValidAddr(newBuyTokenAddress)
{
emit UpdateAddress(8, address(buyToken), newBuyTokenAddress);
buyToken = IBuyToken(newBuyTokenAddress);
}
function _updatePlan(
PlanType planType,
uint256 minimumAmount,
uint256 planDurationMonths
) internal onlyValidAmt(minimumAmount) onlyValidAmt(planDurationMonths) {
Plan storage plan = planDetails[planType];
plan.minimumAmount = minimumAmount;
plan.planDuration = PER_MONTH_SECONDS * planDurationMonths;
}
}
contract VACPublicSavingBook is AdminControl {
using SafeERC20 for IERC20;
using ECDSA for bytes32;
constructor(
address newRoot,
address newSigner,
address newUsd,
address newVac,
address newTreasury,
address owner,
address buyToken
) {
_updateRoot(newRoot);
_updateSigner(newSigner);
_updateUsd(newUsd);
_updateVac(newVac);
_updateTreasury(newTreasury);
_updateBuyToken(buyToken);
_updatePlan(PlanType(0), 1e18, 24);
_updatePlan(PlanType(1), 1e18, 36);
_updatePlan(PlanType(2), 1e18, 48);
_updateVAndCRewardPercentage(PlanType(0), 20e18);
_updateVAndCRewardPercentage(PlanType(1), 40e18);
_updateVAndCRewardPercentage(PlanType(2), 60e18);
_grantRole(DEFAULT_ADMIN_ROLE, owner);
}
function stakeWithUsd(
address userAddress,
uint256 refId,
PlanType planType,
uint256 amount,
bool isVandC,
uint256 vacTokenPerToken,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
)
external
whenNotPaused
onlyContract(userAddress)
onlyNonBlackListed(userAddress)
{
Plan memory plan = planDetails[planType];
require(refId <= currUserId, "buy: I R ID");
uint256[2] memory vacBal;
vacBal[0] = IERC20(vac).balanceOf(address(this));
IERC20(usd).safeTransferFrom(userAddress, address(this), amount);
IERC20(usd).safeApprove(address(buyToken), amount);
buyToken.swap(address(usd), vacTokenPerToken, amount, expiry, v, r, s);
vacBal[1] = IERC20(vac).balanceOf(address(this)) - vacBal[0];
require(
vacBal[1] >= plan.minimumAmount && plan.minimumAmount > 0,
"buy: I A || I P M A"
);
_stakeWithVac(userAddress, refId, planType, vacBal[1], isVandC, false);
}
function stakeWithVac(
address userAddress,
uint256 refId,
PlanType planType,
uint256 amount,
bool isVandC
)
external
whenNotPaused
onlyContract(userAddress)
onlyNonBlackListed(userAddress)
{
_stakeWithVac(userAddress, refId, planType, amount, isVandC, true);
}
function _stakeWithVac(
address userAddress,
uint256 refId,
PlanType planType,
uint256 amount,
bool isVandC,
bool isStake
) private {
require(refId <= currUserId, "buy: I R ID");
Plan memory plan = planDetails[planType];
require(
amount >= plan.minimumAmount && plan.minimumAmount > 0,
"buy: I A || I P M A"
);
if (isStake)
IERC20(vac).safeTransferFrom(userAddress, address(this), amount);
User storage user = userData[userAddress];
User storage refData = userData[userList[refId]];
if (!user.isExist) {
uint256 userId = ++currUserId;
user.isExist = true;
user.userId = userId;
user.referrerID = refId;
userList[userId] = userAddress;
refData.referral.push(userAddress);
}
if (PlanType.Platinum == planType && !isActiveUser(userAddress)) {
user.isActiveUser = true;
refData.activeUsers.push(userAddress);
}
uint256 currentTime = block.timestamp;
uint256 userPlanId = ++user.numPlans;
user.userPlanList[userPlanId].planType = planType;
user.userPlanList[userPlanId].stakedAmount = amount;
user.userPlanList[userPlanId].stakedTime = currentTime;
user.userPlanList[userPlanId].expiryTime =
currentTime +
plan.planDuration;
user.userPlanList[userPlanId].isVandC = isVandC;
if (isVandC)
user.userPlanList[userPlanId].vAndCAmount =
(amount * vAndCRewardPercentage[planType]) /
DIVISOR;
emit Stake(
user.referrerID,
userAddress,
uint256(planType),
amount,
isVandC,
currentTime
);
}
function claimReward(
uint256 amount,
uint256 userPlanId,
uint256 expiry,
bytes calldata signature
)
external
whenNotPaused
onlyNonBlackListed(_msgSender())
onlyValidExpiry(expiry)
onlyValidAmt(amount)
{
address msgSender = _msgSender();
userPlanData storage user = userData[msgSender].userPlanList[
userPlanId
];
require(user.stakedAmount > 0, "CR: I S || A R C");
require(!user.isCapitalClaimed, "CC: C A C");
_validateSignature(
userPlanId,
msgSender,
amount,
expiry,
Flag.ClaimReward,
signature
);
nonce[Flag.ClaimReward][msgSender]++;
uint256 feeAmount = (amount * fee) / DIVISOR;
uint256 rewardAmount = amount - feeAmount;
if (feeAmount > 0) {
require(
feeAmount <= IERC20(vac).balanceOf(address(this)),
"CR: I F F!"
);
IERC20(vac).safeTransfer(treasury, feeAmount);
}
require(
rewardAmount <= IERC20(vac).balanceOf(address(this)),
"CR: I R F!"
);
claimedAmount[msgSender][user.planType] += rewardAmount;
IERC20(vac).safeTransfer(msgSender, rewardAmount);
emit ClaimReward(
msgSender,
userPlanId,
feeAmount,
rewardAmount,
block.timestamp
);
}
function claimVandCReward(
uint256 userPlanId,
uint256 vAndCAmount,
uint256 expiry,
bytes calldata signature
)
external
whenNotPaused
onlyValidAmt(vAndCAmount)
onlyValidExpiry(expiry)
onlyNonBlackListed(_msgSender())
{
address msgSender = _msgSender();
userPlanData storage user = userData[msgSender].userPlanList[
userPlanId
];
require(user.isVandC, "CVandC: N VandC !");
require(user.vAndCAmount >= vAndCAmount, "CVandC: I VandC R");
_validateSignature(
userPlanId,
msgSender,
vAndCAmount,
expiry,
Flag.ClaimVandCReward,
signature
);
nonce[Flag.ClaimVandCReward][msgSender]++;
user.vAndCAmount -= vAndCAmount;
require(
vAndCAmount <= IERC20(vac).balanceOf(address(this)),
"CVandC: I F!"
);
IERC20(vac).safeTransfer(msgSender, vAndCAmount);
emit ClaimVandCReward(
msgSender,
userPlanId,
vAndCAmount,
block.timestamp
);
}
function claimCapital(
uint256 userPlanId,
uint256 expiry,
bytes calldata signature
)
external
whenNotPaused
onlyValidExpiry(expiry)
onlyNonBlackListed(_msgSender())
{
address msgSender = _msgSender();
userPlanData storage user = userData[msgSender].userPlanList[
userPlanId
];
require(!user.isCapitalClaimed, "CC: C A C");
require(block.timestamp >= user.expiryTime, "CC: C time N R");
_validateSignature(
userPlanId,
msgSender,
0,
expiry,
Flag.ClaimCaptial,
signature
);
nonce[Flag.ClaimCaptial][msgSender]++;
user.isCapitalClaimed = true;
uint256 stakedAmount = user.stakedAmount;
require(
stakedAmount <= IERC20(vac).balanceOf(address(this)),
"CC: I F!"
);
IERC20(vac).safeTransfer(msgSender, stakedAmount);
emit ClaimCaptial(msgSender, userPlanId, stakedAmount, block.timestamp);
}
function claimVac(
address to,
uint256 amount,
uint256 expiry,
bytes calldata signature
)
external
whenNotPaused
onlyValidAddr(to)
onlyNonBlackListed(to)
onlyValidAmt(amount)
onlyValidExpiry(expiry)
onlyNonBlackListed(_msgSender())
{
require(userData[to].isExist, "CV: N A U");
_validateSignature(0, to, amount, expiry, Flag.ClaimVac, signature);
nonce[Flag.ClaimVac][to]++;
require(amount <= IERC20(vac).balanceOf(address(this)), "CV: I F!");
IERC20(vac).safeTransfer(to, amount);
emit ClaimAmount(vac, to, amount, block.timestamp);
}
function shareRefferalReward(
address to,
uint256 amount,
uint256 expiry,
bytes calldata signature
)
external
whenNotPaused
onlyValidAddr(to)
onlyNonBlackListed(to)
onlyValidAmt(amount)
onlyValidExpiry(expiry)
onlyNonBlackListed(_msgSender())
{
require(userData[to].isExist, "SRR: N A U");
_validateSignature(
0,
to,
amount,
expiry,
Flag.ShareRefferalReward,
signature
);
nonce[Flag.ShareRefferalReward][to]++;
require(amount <= IERC20(vac).balanceOf(address(this)), "SRR: I F!");
IERC20(vac).safeTransfer(to, amount);
emit ClaimAmount(vac, to, amount, block.timestamp);
}
function deposit(PlanType planType, uint256 amount)
external
whenNotPaused
onlyRole(DEPOSITOR_ROLE)
onlyValidAmt(amount)
{
IERC20(vac).safeTransferFrom(_msgSender(), address(this), amount);
deposits[_msgSender()][planType] += amount;
emit Deposit(uint256(planType), amount, block.timestamp);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"newRoot","type":"address"},{"internalType":"address","name":"newSigner","type":"address"},{"internalType":"address","name":"newUsd","type":"address"},{"internalType":"address","name":"newVac","type":"address"},{"internalType":"address","name":"newTreasury","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"buyToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddedToBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"userPlanId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimCaptial","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"userPlanId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"treasuryFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"userPlanId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimVandCReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"planType","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"isDeposit","type":"bool"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RemovedFromBlackList","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":true,"internalType":"uint256","name":"refId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"planType","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isVandC","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"flag","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"UpdateAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"flag","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldPercentage","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"UpdatePercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"oldPercentage","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"UpdateVAndCRewardPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_DAY_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_MONTH_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"activeUserLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"activeUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"addToBlackListBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"blackListByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyToken","outputs":[{"internalType":"contract IBuyToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"userPlanId","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimCapital","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userPlanId","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimVac","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"userPlanId","type":"uint256"},{"internalType":"uint256","name":"vAndCAmount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimVandCReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum StorageVault.PlanType","name":"","type":"uint8"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currUserId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum StorageVault.PlanType","name":"","type":"uint8"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isDepositedAmount","type":"bool"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOwnerDataById","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isActiveUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StorageVault.Flag","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerData","outputs":[{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StorageVault.PlanType","name":"","type":"uint8"}],"name":"planDetails","outputs":[{"internalType":"uint256","name":"minimumAmount","type":"uint256"},{"internalType":"uint256","name":"planDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"userPlanId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"vAndCAmount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"enum StorageVault.Flag","name":"flag","type":"uint8"}],"name":"prepareHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"}],"name":"removeFromBlackListBatch","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":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieve","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"shareRefferalReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"refId","type":"uint256"},{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isVandC","type":"bool"},{"internalType":"uint256","name":"vacTokenPerToken","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"stakeWithUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"refId","type":"uint256"},{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isVandC","type":"bool"}],"name":"stakeWithVac","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBuyTokenAddress","type":"address"}],"name":"updateBuyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"minimumAmount","type":"uint256"},{"internalType":"uint256","name":"planDuration","type":"uint256"}],"name":"updatePlan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRoot","type":"address"}],"name":"updateRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newUsd","type":"address"}],"name":"updateUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"rewardPercentage","type":"uint256"}],"name":"updateVAndCRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newVac","type":"address"}],"name":"updateVac","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userData","outputs":[{"internalType":"bool","name":"isExist","type":"bool"},{"internalType":"uint256","name":"userId","type":"uint256"},{"internalType":"uint256","name":"referrerID","type":"uint256"},{"internalType":"uint256","name":"numPlans","type":"uint256"},{"internalType":"bool","name":"isActiveUser","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"userPlanId","type":"uint256"}],"name":"userPlanDetails","outputs":[{"components":[{"internalType":"enum StorageVault.PlanType","name":"planType","type":"uint8"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"stakedTime","type":"uint256"},{"internalType":"uint256","name":"expiryTime","type":"uint256"},{"internalType":"bool","name":"isCapitalClaimed","type":"bool"},{"internalType":"bool","name":"isVandC","type":"bool"},{"internalType":"uint256","name":"vAndCAmount","type":"uint256"}],"internalType":"struct StorageVault.userPlanData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StorageVault.PlanType","name":"","type":"uint8"}],"name":"vAndCRewardPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vac","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"viewReferralByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewReferrals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewReferrerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wholeBlackList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620054bc380380620054bc83398101604081905262000034916200093e565b6014805460ff19169055620000498762000121565b620000548662000288565b6200005f8562000347565b6200006a84620003f0565b620000758362000499565b620000808162000533565b620000976000670de0b6b3a76400006018620005cd565b620000ae6001670de0b6b3a76400006024620005cd565b620000c56002670de0b6b3a76400006030620005cd565b620000db60006801158e460913d00000620006b5565b620000f1600168022b1c8c1227a00000620006b5565b620001076002680340aad21b3b700000620006b5565b6200011460008362000773565b5050505050505062000a0f565b806001600160a01b038116620001705760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b60448201526064015b60405180910390fd5b6000805160206200549c833981519152546001600160a01b039081166000818152600f602052604080822093861682529020805491929160ff1615620001e35760405162461bcd60e51b815260206004820152600760248201526655523a2041204560c81b604482015260640162000167565b805460ff1916600190811782556000908201819055600282015560038083018054620002139284019190620008b5565b50600680830180546200022a9284019190620008b5565b506000808052600e6020526000805160206200549c83398151915280546001600160a01b0319166001600160a01b038881169182179092556040519092918616916006916000805160206200547c8339815191529190a45050505050565b806001600160a01b03811615801590620002aa57506001600160a01b0381163b155b620002f85760405162461bcd60e51b815260206004820152601360248201527f496e76616c696420454f41204164647265737300000000000000000000000000604482015260640162000167565b6003546040516001600160a01b038085169216906002906000805160206200547c83398151915290600090a450600380546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b0381163b620003a15760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420436f6e747261637420416464726573730000000000000000604482015260640162000167565b600480546040516001600160a01b0380861693921691906000805160206200547c83398151915290600090a450600480546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b0381163b6200044a5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420436f6e747261637420416464726573730000000000000000604482015260640162000167565b6005546040516001600160a01b038085169216906003906000805160206200547c83398151915290600090a450600580546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b038116620004e45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640162000167565b6002546040516001600160a01b038085169216906005906000805160206200547c83398151915290600090a450600280546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b0381166200057e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b604482015260640162000167565b6006546040516001600160a01b038085169216906008906000805160206200547c83398151915290600090a450600680546001600160a01b0319166001600160a01b0392909216919091179055565b8160008111620006115760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640162000167565b8160008111620006555760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640162000167565b6000600d6000876002811115620006705762000670620009d3565b6002811115620006845762000684620009d3565b815260208101919091526040016000208581559050620006a88462278d00620009e9565b6001909101555050505050565b80600c6000846002811115620006cf57620006cf620009d3565b6002811115620006e357620006e3620009d3565b815260200190815260200160002054836002811115620007075762000707620009d3565b6040517f76cae5445af327a902fc39c5ef423722fb33aa4a13fa9ec898fa7ea4ff7005df90600090a480600c60008460028111156200074a576200074a620009d3565b60028111156200075e576200075e620009d3565b81526020810191909152604001600020555050565b6200077f82826200079e565b600082815260136020526040902062000799908262000843565b505050565b60008281526012602090815260408083206001600160a01b038516845290915290205460ff166200083f5760008281526012602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620007fe3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200085a836001600160a01b03841662000863565b90505b92915050565b6000818152600183016020526040812054620008ac575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200085d565b5060006200085d565b828054828255906000526020600020908101928215620008f85760005260206000209182015b82811115620008f8578254825591600101919060010190620008db565b50620009069291506200090a565b5090565b5b808211156200090657600081556001016200090b565b80516001600160a01b03811681146200093957600080fd5b919050565b600080600080600080600060e0888a0312156200095a57600080fd5b620009658862000921565b9650620009756020890162000921565b9550620009856040890162000921565b9450620009956060890162000921565b9350620009a56080890162000921565b9250620009b560a0890162000921565b9150620009c560c0890162000921565b905092959891949750929550565b634e487b7160e01b600052602160045260246000fd5b80820281158282048414176200085d57634e487b7160e01b600052601160045260246000fd5b614a5d8062000a1f6000396000f3fe608060405234801561001057600080fd5b50600436106103d05760003560e01c80639012c4a8116101ff578063c2d468851161011a578063d63a6ccd116100ad578063e47d60601161007c578063e47d6060146109a4578063eb0eb8ab146109b7578063f01f8c78146109ca578063f4d4c9d7146109dd57600080fd5b8063d63a6ccd1461094f578063d707982914610962578063ddca3f4314610970578063e3c313661461097957600080fd5b8063cb955879116100e9578063cb95587914610903578063d32d6e9414610916578063d547741f14610929578063d5aeda571461093c57600080fd5b8063c2d468851461084f578063c891091314610862578063ca15c873146108d0578063ca699f25146108e357600080fd5b8063a7ecd37e11610192578063b1f3b34911610161578063b1f3b34914610816578063b222934714610829578063baca2e3e14610832578063c053df901461084557600080fd5b8063a7ecd37e146107bd578063acb30418146107d0578063b136f4d7146107f0578063b14907dd1461080357600080fd5b8063a217fddf116101ce578063a217fddf14610773578063a3b0b5a31461077b578063a4821719146107a2578063a5c8b23f146107b557600080fd5b80639012c4a81461071157806391d1485414610724578063998c7119146107375780639f4216e81461074a57600080fd5b806341a3bcb8116102ef57806361d027b3116102825780637f51bb1f116102515780637f51bb1f146106d05780638456cb59146106e35780638e6ee4de146106eb5780639010d07c146106fe57600080fd5b806361d027b3146106435780636209deb41461065657806362534ddf1461066957806375c955bf1461069457600080fd5b806345a72e7d116102be57806345a72e7d146105e657806348ee6709146105f95780635c975abb1461060c578063601c1b981461061757600080fd5b806341a3bcb81461057e5780634202d21414610591578063439eb435146105c057806344f43743146105d357600080fd5b80632f2ff15d1161036757806336568abe1161033657806336568abe1461051f57806339c1d464146105325780633cc49d641461053a5780633f4ba83a1461057657600080fd5b80632f2ff15d146104d6578063307ee3b1146104e95780633410fe6e146104fc57806335e4cefe1461050c57600080fd5b8063248a9ca3116103a3578063248a9ca31461046b57806326bcff7d1461048e57806328c4e24c146104ae5780632b1669eb146104c357600080fd5b806301ffc9a7146103d5578063029b5499146103fd578063137e45fe14610415578063238ac93314610440575b600080fd5b6103e86103e3366004614102565b6109f0565b60405190151581526020015b60405180910390f35b61040762278d0081565b6040519081526020016103f4565b610407610423366004614157565b601060209081526000928352604080842090915290825290205481565b600354610453906001600160a01b031681565b6040516001600160a01b0390911681526020016103f4565b61040761047936600461418a565b60009081526012602052604090206001015490565b6104a161049c3660046141a3565b610a1b565b6040516103f491906141be565b6104c16104bc36600461420b565b610a94565b005b6104536104d1366004614247565b610c6f565b6104c16104e4366004614271565b610cb8565b6104c16104f7366004614294565b610ce2565b61040768056bc75e2d6310000081565b61040761051a366004614317565b610cf7565b6104c161052d366004614271565b610d39565b610407610db7565b6104536105483660046141a3565b6001600160a01b039081166000908152600f60209081526040808320600201548352600e9091529020541690565b6104c1610dc8565b6104c161058c366004614335565b610dde565b6103e861059f3660046141a3565b6001600160a01b03166000908152600f602052604090206005015460ff1690565b6104c16105ce366004614294565b610dfa565b6104c16105e1366004614368565b610e0f565b6104c16105f4366004614404565b611170565b6104c16106073660046144a1565b611208565b60145460ff166103e8565b6104076106253660046141a3565b6001600160a01b03166000908152600f602052604090206006015490565b600254610453906001600160a01b031681565b6104c16106643660046144a1565b6114ae565b610407610677366004614511565b600b60209081526000928352604080842090915290825290205481565b6106bb6106a236600461453b565b600d602052600090815260409020805460019091015482565b604080519283526020830191909152016103f4565b6104c16106de3660046141a3565b611895565b6104c16118a9565b6104c16106f9366004614556565b6118bc565b61045361070c366004614572565b6118d1565b6104c161071f36600461418a565b6118f0565b6103e8610732366004614271565b611904565b6104c16107453660046141a3565b61192f565b61045361075836600461418a565b600e602052600090815260409020546001600160a01b031681565b610407600081565b6104077f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b600654610453906001600160a01b031681565b6104a1611943565b6104c16107cb3660046141a3565b61194f565b6107e36107de366004614247565b611963565b6040516103f491906145aa565b6104c16107fe36600461460b565b611a54565b6104c16108113660046141a3565b611cc1565b610407610824366004614656565b611cd5565b61040760005481565b6104c16108403660046141a3565b611d5e565b6104076201518081565b600554610453906001600160a01b031681565b6108a46108703660046141a3565b600f602052600090815260409020805460018201546002830154600484015460059094015460ff9384169492939192911685565b60408051951515865260208601949094529284019190915260608301521515608082015260a0016103f4565b6104076108de36600461418a565b611d72565b6104076108f136600461453b565b600c6020526000908152604090205481565b61045361091136600461418a565b611d89565b6104c16109243660046141a3565b611d96565b6104c1610937366004614271565b611daa565b6104c161094a3660046146a6565b611dcf565b600454610453906001600160a01b031681565b6007546008546106bb919082565b61040760015481565b610407610987366004614157565b601160209081526000928352604080842090915290825290205481565b6103e86109b23660046141a3565b612042565b6104a16109c53660046141a3565b61204f565b6104c16109d836600461460b565b6120c6565b6104c16109eb366004614556565b6122da565b60006001600160e01b03198216635a05180f60e01b1480610a155750610a15826123e8565b92915050565b6001600160a01b0381166000908152600f6020908152604091829020600301805483518184028101840190945280845260609392830182828015610a8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a6a575b50505050509050919050565b6000610a9f8161241d565b826001600160a01b038116610acf5760405162461bcd60e51b8152600401610ac6906146f9565b60405180910390fd5b8260008111610af05760405162461bcd60e51b8152600401610ac690614722565b610af985612042565b15610b465760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a20746f20697320426c61636b6c697374656400000000006044820152606401610ac6565b6001600160a01b038616610b6357610b5e8585612427565b610c26565b6040516370a0823160e01b815230600482015284906001600160a01b038816906370a0823190602401602060405180830381865afa158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd919061474a565b1015610c1b5760405162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ac6565b610c26868686612540565b83856001600160a01b0316876001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb60405160405180910390a4505050505050565b6001600160a01b0382166000908152600f60205260408120600301805483908110610c9c57610c9c614763565b6000918252602090912001546001600160a01b03169392505050565b600082815260126020526040902060010154610cd38161241d565b610cdd83836125a3565b505050565b6000610ced8161241d565b610cdd83836125c5565b60008215610d25576009805483908110610d1357610d13614763565b90600052602060002001549050610a15565b600a805483908110610d1357610d13614763565b6001600160a01b0381163314610da95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610ac6565b610db3828261267a565b5050565b6000610dc3601561269c565b905090565b6000610dd38161241d565b610ddb6126a6565b50565b6000610de98161241d565b610df48484846126f8565b50505050565b6000610e058161241d565b610cdd8383612792565b610e17612842565b896001600160a01b0381163b15610e685760405162461bcd60e51b81526020600482015260156024820152741059191c995cdcc81a5cc8184818dbdb9d1c9858dd605a1b6044820152606401610ac6565b8a610e7281612042565b15610e8f5760405162461bcd60e51b8152600401610ac690614779565b6000600d60008c6002811115610ea757610ea7614594565b6002811115610eb857610eb8614594565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000548c1115610f275760405162461bcd60e51b815260206004820152600b60248201526a189d5e4e8812481488125160aa1b6044820152606401610ac6565b610f2f61407f565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b919061474a565b8152600454610fb5906001600160a01b03168f308e61288a565b600654600454610fd2916001600160a01b0391821691168d6128c2565b60065460048054604051636ccf368160e01b81526001600160a01b0391821692810192909252602482018c9052604482018e9052606482018b905260ff8a16608483015260a4820189905260c4820188905290911690636ccf36819060e401600060405180830381600087803b15801561104b57600080fd5b505af115801561105f573d6000803e3d6000fd5b505050508060006002811061107657611076614763565b60200201516005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e7919061474a565b6110f191906147bf565b602082018190528251118015906111085750815115155b61114a5760405162461bcd60e51b81526020600482015260136024820152726275793a20492041207c7c20492050204d204160681b6044820152606401610ac6565b6111608e8e8e84600160200201518e60006129d7565b5050505050505050505050505050565b611178612842565b846001600160a01b0381163b156111c95760405162461bcd60e51b81526020600482015260156024820152741059191c995cdcc81a5cc8184818dbdb9d1c9858dd605a1b6044820152606401610ac6565b856111d381612042565b156111f05760405162461bcd60e51b8152600401610ac690614779565b6111ff878787878760016129d7565b50505050505050565b611210612842565b83600081116112315760405162461bcd60e51b8152600401610ac690614722565b83428110156112525760405162461bcd60e51b8152600401610ac6906147d2565b3361125c81612042565b156112795760405162461bcd60e51b8152600401610ac690614779565b336000818152600f602090815260408083208c845260070190915290206004810154610100900460ff166112e35760405162461bcd60e51b81526020600482015260116024820152704356616e64433a204e2056616e6443202160781b6044820152606401610ac6565b888160050154101561132b5760405162461bcd60e51b815260206004820152601160248201527021ab30b732219d1024902b30b73221902960791b6044820152606401610ac6565b61133b8a838b8b60018c8c612dab565b6001600160a01b03821660009081527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf6020526040812080549161137e836147f4565b91905055508881600501600082825461139791906147bf565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061474a565b8911156114465760405162461bcd60e51b815260206004820152600c60248201526b4356616e64433a204920462160a01b6044820152606401610ac6565b60055461145d906001600160a01b0316838b612540565b888a836001600160a01b03167f2d1723e9447bfa05e9b15c1fe9ef8c230e47bdd1cd340c244b6dae7336502add4260405161149a91815260200190565b60405180910390a450505050505050505050565b6114b6612842565b336114c081612042565b156114dd5760405162461bcd60e51b8152600401610ac690614779565b83428110156114fe5760405162461bcd60e51b8152600401610ac6906147d2565b866000811161151f5760405162461bcd60e51b8152600401610ac690614722565b336000818152600f602090815260408083208b8452600701909152902060018101546115805760405162461bcd60e51b815260206004820152601060248201526f43523a20492053207c7c20412052204360801b6044820152606401610ac6565b600481015460ff16156115c15760405162461bcd60e51b815260206004820152600960248201526843433a20432041204360b81b6044820152606401610ac6565b6115d189838c8b60008c8c612dab565b6001600160a01b03821660009081527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7660205260408120805491611614836147f4565b9190505550600068056bc75e2d631000006001548c611633919061480d565b61163d9190614824565b9050600061164b828d6147bf565b90508115611718576005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061474a565b8211156116fb5760405162461bcd60e51b815260206004820152600a60248201526943523a2049204620462160b01b6044820152606401610ac6565b600254600554611718916001600160a01b03918216911684612540565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611760573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611784919061474a565b8111156117c05760405162461bcd60e51b815260206004820152600a60248201526943523a2049205220462160b01b6044820152606401610ac6565b6001600160a01b0384166000908152601160205260408120845483929060ff1660028111156117f1576117f1614594565b600281111561180257611802614594565b8152602001908152602001600020600082825461181f9190614846565b909155505060055461183b906001600160a01b03168583612540565b604080516001600160a01b0386168152602081018d905242818301529051829184917f483e3ca361c7b5e5a1f600e9c06025be8c62aa815785f54efa3b1847610909669181900360600190a3505050505050505050505050565b60006118a08161241d565b610db382612e97565b60006118b48161241d565b610ddb612f0c565b60006118c78161241d565b610cdd8383612f49565b60008281526013602052604081206118e99083612ff8565b9392505050565b60006118fb8161241d565b610db382613004565b60009182526012602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061193a8161241d565b610db382613084565b6060610dc36015613125565b600061195a8161241d565b610db382613132565b6119a86040805160e081019091528060008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600081525090565b6001600160a01b0383166000908152600f6020908152604080832085845260070190915290819020815160e081019092528054829060ff1660028111156119f1576119f1614594565b6002811115611a0257611a02614594565b8152600182015460208201526002820154604082015260038201546060820152600482015460ff8082161515608084015261010090910416151560a082015260059091015460c0909101529392505050565b611a5c612842565b846001600160a01b038116611a835760405162461bcd60e51b8152600401610ac6906146f9565b85611a8d81612042565b15611aaa5760405162461bcd60e51b8152600401610ac690614779565b8560008111611acb5760405162461bcd60e51b8152600401610ac690614722565b8542811015611aec5760405162461bcd60e51b8152600401610ac6906147d2565b33611af681612042565b15611b135760405162461bcd60e51b8152600401610ac690614779565b6001600160a01b038a166000908152600f602052604090205460ff16611b675760405162461bcd60e51b815260206004820152600960248201526843563a204e2041205560b81b6044820152606401610ac6565b611b7860008b8b8b60038c8c612dab565b6001600160a01b038a1660009081527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e60205260408120805491611bbb836147f4565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c919061474a565b891115611c665760405162461bcd60e51b815260206004820152600860248201526743563a204920462160c01b6044820152606401610ac6565b600554611c7d906001600160a01b03168b8b612540565b6005546040514281528a916001600160a01b038d8116929116907f58299c5be170e02a81f2b7e59fa4e4e61ce9820cb357a29eb3d59397803f1ba69060200161149a565b6000611ccc8161241d565b610db3826131e3565b600085858585600b6000876004811115611cf157611cf1614594565b6004811115611d0257611d02614594565b8152602080820192909252604090810160009081206001600160a01b038d1682528352819020549051611d3d96959493928991309101614859565b60405160208183030381529060405280519060200120905095945050505050565b6000611d698161241d565b610db38261333d565b6000818152601360205260408120610a159061269c565b6000610a15601583612ff8565b6000611da18161241d565b610db3826133b2565b600082815260126020526040902060010154611dc58161241d565b610cdd838361267a565b611dd7612842565b8242811015611df85760405162461bcd60e51b8152600401610ac6906147d2565b33611e0281612042565b15611e1f5760405162461bcd60e51b8152600401610ac690614779565b336000818152600f602090815260408083208a84526007019091529020600481015460ff1615611e7d5760405162461bcd60e51b815260206004820152600960248201526843433a20432041204360b81b6044820152606401610ac6565b8060030154421015611ec25760405162461bcd60e51b815260206004820152600e60248201526d21a19d1021903a34b6b29027102960911b6044820152606401610ac6565b611ed3888360008a60028b8b612dab565b6001600160a01b03821660009081527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163460205260408120805491611f16836147f4565b90915550506004818101805460ff191660019081179091558201546005546040516370a0823160e01b8152309381019390935290916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa1919061474a565b811115611fdb5760405162461bcd60e51b815260206004820152600860248201526743433a204920462160c01b6044820152606401610ac6565b600554611ff2906001600160a01b03168483612540565b8089846001600160a01b03167f9b6ae367e8eca958455864453cfe3ab4b0b04ef8f98c1b77cae407500d9567a94260405161202f91815260200190565b60405180910390a4505050505050505050565b6000610a15601583613453565b6001600160a01b0381166000908152600f6020908152604091829020600601805483518184028101840190945280845260609392830182828015610a88576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610a6a5750505050509050919050565b6120ce612842565b846001600160a01b0381166120f55760405162461bcd60e51b8152600401610ac6906146f9565b856120ff81612042565b1561211c5760405162461bcd60e51b8152600401610ac690614779565b856000811161213d5760405162461bcd60e51b8152600401610ac690614722565b854281101561215e5760405162461bcd60e51b8152600401610ac6906147d2565b3361216881612042565b156121855760405162461bcd60e51b8152600401610ac690614779565b6001600160a01b038a166000908152600f602052604090205460ff166121da5760405162461bcd60e51b815260206004820152600a6024820152695352523a204e2041205560b01b6044820152606401610ac6565b6121eb60008b8b8b60048c8c612dab565b6001600160a01b038a1660009081527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7846020526040812080549161222e836147f4565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f919061474a565b891115611c665760405162461bcd60e51b81526020600482015260096024820152685352523a204920462160b81b6044820152606401610ac6565b6122e2612842565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a961230c8161241d565b816000811161232d5760405162461bcd60e51b8152600401610ac690614722565b612345336005546001600160a01b031690308661288a565b336000908152601060205260408120849186600281111561236857612368614594565b600281111561237957612379614594565b815260200190815260200160002060008282546123969190614846565b90915550429050837f33da4f9b82b3e18a281ca2cabbe2f076925692abb593b7ea3f850009e8ec97708660028111156123d1576123d1614594565b60405190815260200160405180910390a350505050565b60006001600160e01b03198216637965db0b60e01b1480610a1557506301ffc9a760e01b6001600160e01b0319831614610a15565b610ddb8133613475565b804710156124775760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124c4576040519150601f19603f3d011682016040523d82523d6000602084013e6124c9565b606091505b5050905080610cdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6040516001600160a01b038316602482015260448101829052610cdd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134ce565b6125ad82826135a0565b6000828152601360205260409020610cdd9082613626565b80600081900361262e5760405162461bcd60e51b815260206004820152602e60248201527f72656d6f766546726f6d426c61636b4c69737442617463683a204e6f2061646460448201526d7265737320617661696c61626c6560901b6064820152608401610ac6565b60005b81811015610df45761266884848381811061264e5761264e614763565b905060200201602081019061266391906141a3565b61363b565b80612672816147f4565b915050612631565b6126848282613741565b6000828152601360205260409020610cdd90826137a8565b6000610a15825490565b6126ae6137bd565b6014805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b81600081116127195760405162461bcd60e51b8152600401610ac690614722565b816000811161273a5760405162461bcd60e51b8152600401610ac690614722565b6000600d600087600281111561275257612752614594565b600281111561276357612763614594565b8152602081019190915260400160002085815590506127858462278d0061480d565b6001909101555050505050565b8060008190036127f65760405162461bcd60e51b815260206004820152602960248201527f616464546f426c61636b4c69737442617463683a204e6f206164647265737320604482015268617661696c61626c6560b81b6064820152608401610ac6565b60005b81811015610df45761283084848381811061281657612816614763565b905060200201602081019061282b91906141a3565b613806565b8061283a816147f4565b9150506127f9565b60145460ff16156128885760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ac6565b565b6040516001600160a01b0380851660248301528316604482015260648101829052610df49085906323b872dd60e01b9060840161256c565b80158061293c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293a919061474a565b155b6129a75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610ac6565b6040516001600160a01b038316602482015260448101829052610cdd90849063095ea7b360e01b9060640161256c565b600054851115612a175760405162461bcd60e51b815260206004820152600b60248201526a189d5e4e8812481488125160aa1b6044820152606401610ac6565b6000600d6000866002811115612a2f57612a2f614594565b6002811115612a4057612a40614594565b815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905080600001518410158015612a835750805115155b612ac55760405162461bcd60e51b81526020600482015260136024820152726275793a20492041207c7c20492050204d204160681b6044820152606401610ac6565b8115612ae357600554612ae3906001600160a01b031688308761288a565b6001600160a01b038088166000908152600f602081815260408084208b8552600e83528185205490951684529190529020815460ff16612b995760008060008154612b2d906147f4565b9182905550835460ff191660019081178555848101829055600285018b90556000918252600e60209081526040832080546001600160a01b038f166001600160a01b03199182168117909255600387018054948501815585529190932090910180549091169091179055505b866002811115612bab57612bab614594565b6002148015612bd657506001600160a01b0389166000908152600f602052604090206005015460ff16155b15612c1d57600582018054600160ff19909116811790915560068201805491820181556000908152602090200180546001600160a01b0319166001600160a01b038b161790555b600042905060008360040160008154612c35906147f4565b91829055506000818152600786016020526040902080549192508a9160ff19166001836002811115612c6957612c69614594565b021790555060008181526007850160209081526040909120600181018a9055600201839055850151612c9b9083614846565b6000828152600786016020526040902060038101919091556004018054881580156101000261ff001990921691909117909155612d3c5768056bc75e2d63100000600c60008b6002811115612cf257612cf2614594565b6002811115612d0357612d03614594565b81526020019081526020016000205489612d1d919061480d565b612d279190614824565b60008281526007860160205260409020600501555b878b6001600160a01b031685600201547f16948db8bcc24c1451b81ce10d2455a365024ce41c6d159d937540b419479fa38c6002811115612d7f57612d7f614594565b604080519182528c15156020830152810187905260600160405180910390a45050505050505050505050565b612e5082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e4a9250612df791508b90508a8a8a8a611cd5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90613903565b6003546001600160a01b039081169116146111ff5760405162461bcd60e51b815260206004820152600760248201526656533a2049205360c81b6044820152606401610ac6565b806001600160a01b038116612ebe5760405162461bcd60e51b8152600401610ac6906146f9565b6002546040516001600160a01b03808516921690600590600080516020614a0883398151915290600090a450600280546001600160a01b0319166001600160a01b0392909216919091179055565b612f14612842565b6014805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126db3390565b80600c6000846002811115612f6057612f60614594565b6002811115612f7157612f71614594565b815260200190815260200160002054836002811115612f9257612f92614594565b6040517f76cae5445af327a902fc39c5ef423722fb33aa4a13fa9ec898fa7ea4ff7005df90600090a480600c6000846002811115612fd257612fd2614594565b6002811115612fe357612fe3614594565b81526020810191909152604001600020555050565b60006118e98383613927565b68056bc75e2d6310000081111561304f5760405162461bcd60e51b815260206004820152600f60248201526e55463a20496e76616c69642046656560881b6044820152606401610ac6565b600180546040518392907f745acddc07413883bbe627d1122e673f7090f1f1a1004e33954c221210ecaab990600090a4600155565b806001600160a01b0381163b6130d75760405162461bcd60e51b8152602060048201526018602482015277496e76616c696420436f6e7472616374204164647265737360401b6044820152606401610ac6565b6005546040516001600160a01b03808516921690600390600080516020614a0883398151915290600090a450600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060006118e983613951565b806001600160a01b0381161580159061315357506001600160a01b0381163b155b6131955760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420454f41204164647265737360681b6044820152606401610ac6565b6003546040516001600160a01b03808516921690600290600080516020614a0883398151915290600090a450600380546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b03811661320a5760405162461bcd60e51b8152600401610ac6906146f9565b7fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c546001600160a01b039081166000818152600f602052604080822093861682529020805491929160ff161561328c5760405162461bcd60e51b815260206004820152600760248201526655523a2041204560c81b6044820152606401610ac6565b805460ff19166001908117825560009082018190556002820155600380830180546132ba928401919061409d565b50600680830180546132cf928401919061409d565b506000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c80546001600160a01b0319166001600160a01b03888116918217909255604051909291861691600691600080516020614a088339815191529190a45050505050565b806001600160a01b0381166133645760405162461bcd60e51b8152600401610ac6906146f9565b6006546040516001600160a01b03808516921690600890600080516020614a0883398151915290600090a450600680546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b0381163b6134055760405162461bcd60e51b8152602060048201526018602482015277496e76616c696420436f6e7472616374204164647265737360401b6044820152606401610ac6565b600480546040516001600160a01b038086169392169190600080516020614a0883398151915290600090a450600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260018301602052604081205415156118e9565b61347f8282611904565b610db35761348c816139ac565b6134978360206139be565b6040516020016134a89291906148e3565b60408051601f198184030181529082905262461bcd60e51b8252610ac691600401614958565b6000613523826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b5a9092919063ffffffff16565b805190915015610cdd5780806020019051810190613541919061498b565b610cdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ac6565b6135aa8282611904565b610db35760008281526012602090815260408083206001600160a01b03851684529091529020805460ff191660011790556135e23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006118e9836001600160a01b038416613b71565b6001600160a01b03811661369b5760405162461bcd60e51b815260206004820152602160248201527f72656d6f766546726f6d426c61636b4c6973743a205a65726f204164647265736044820152607360f81b6064820152608401610ac6565b6136a481612042565b6136fc5760405162461bcd60e51b8152602060048201526024808201527f72656d6f766546726f6d426c61636b4c6973743a204e6f7420426c61636b4c696044820152631cdd195960e21b6064820152608401610ac6565b6137076015826137a8565b5060405142906001600160a01b038316907f0943e9e6f55a59ad16ce145d5174cb2d1be6ee7f54674be8a78f02f567f25dc790600090a350565b61374b8282611904565b15610db35760008281526012602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006118e9836001600160a01b038416613bc0565b60145460ff166128885760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ac6565b6001600160a01b03811661385c5760405162461bcd60e51b815260206004820152601c60248201527f616464546f426c61636b4c6973743a205a65726f2041646472657373000000006044820152606401610ac6565b61386581612042565b156138be5760405162461bcd60e51b815260206004820152602360248201527f616464546f426c61636b4c6973743a20416c726561647920426c61636b4c69736044820152621d195960ea1b6064820152608401610ac6565b6138c9601582613626565b5060405142906001600160a01b038316907f70d3a1ed5a2930b20cd83412155769ab6fd76cd2810cc3c21d273af4744a067190600090a350565b60008060006139128585613cb3565b9150915061391f81613cf8565b509392505050565b600082600001828154811061393e5761393e614763565b9060005260206000200154905092915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015610a8857602002820191906000526020600020905b81548152602001906001019080831161398d5750505050509050919050565b6060610a156001600160a01b03831660145b606060006139cd83600261480d565b6139d8906002614846565b67ffffffffffffffff8111156139f0576139f06149a8565b6040519080825280601f01601f191660200182016040528015613a1a576020820181803683370190505b509050600360fc1b81600081518110613a3557613a35614763565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a6457613a64614763565b60200101906001600160f81b031916908160001a9053506000613a8884600261480d565b613a93906001614846565b90505b6001811115613b0b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613ac757613ac7614763565b1a60f81b828281518110613add57613add614763565b60200101906001600160f81b031916908160001a90535060049490941c93613b04816149be565b9050613a96565b5083156118e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ac6565b6060613b698484600085613e42565b949350505050565b6000818152600183016020526040812054613bb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a15565b506000610a15565b60008181526001830160205260408120548015613ca9576000613be46001836147bf565b8554909150600090613bf8906001906147bf565b9050818114613c5d576000866000018281548110613c1857613c18614763565b9060005260206000200154905080876000018481548110613c3b57613c3b614763565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613c6e57613c6e6149d5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a15565b6000915050610a15565b6000808251604103613ce95760208301516040840151606085015160001a613cdd87828585613f1d565b94509450505050613cf1565b506000905060025b9250929050565b6000816004811115613d0c57613d0c614594565b03613d145750565b6001816004811115613d2857613d28614594565b03613d755760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ac6565b6002816004811115613d8957613d89614594565b03613dd65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ac6565b6003816004811115613dea57613dea614594565b03610ddb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ac6565b606082471015613ea35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ac6565b600080866001600160a01b03168587604051613ebf91906149eb565b60006040518083038185875af1925050503d8060008114613efc576040519150601f19603f3d011682016040523d82523d6000602084013e613f01565b606091505b5091509150613f1287838387613fe1565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613f545750600090506003613fd8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613fa8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613fd157600060019250925050613fd8565b9150600090505b94509492505050565b60608315614050578251600003614049576001600160a01b0385163b6140495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ac6565b5081613b69565b613b6983838151156140655781518083602001fd5b8060405162461bcd60e51b8152600401610ac69190614958565b60405180604001604052806002906020820280368337509192915050565b8280548282559060005260206000209081019282156140dd5760005260206000209182015b828111156140dd5782548255916001019190600101906140c2565b506140e99291506140ed565b5090565b5b808211156140e957600081556001016140ee565b60006020828403121561411457600080fd5b81356001600160e01b0319811681146118e957600080fd5b80356001600160a01b038116811461414357600080fd5b919050565b80356003811061414357600080fd5b6000806040838503121561416a57600080fd5b6141738361412c565b915061418160208401614148565b90509250929050565b60006020828403121561419c57600080fd5b5035919050565b6000602082840312156141b557600080fd5b6118e98261412c565b6020808252825182820181905260009190848201906040850190845b818110156141ff5783516001600160a01b0316835292840192918401916001016141da565b50909695505050505050565b60008060006060848603121561422057600080fd5b6142298461412c565b92506142376020850161412c565b9150604084013590509250925092565b6000806040838503121561425a57600080fd5b6142638361412c565b946020939093013593505050565b6000806040838503121561428457600080fd5b823591506141816020840161412c565b600080602083850312156142a757600080fd5b823567ffffffffffffffff808211156142bf57600080fd5b818501915085601f8301126142d357600080fd5b8135818111156142e257600080fd5b8660208260051b85010111156142f757600080fd5b60209290920196919550909350505050565b8015158114610ddb57600080fd5b6000806040838503121561432a57600080fd5b823561426381614309565b60008060006060848603121561434a57600080fd5b61435384614148565b95602085013595506040909401359392505050565b6000806000806000806000806000806101408b8d03121561438857600080fd5b6143918b61412c565b995060208b013598506143a660408c01614148565b975060608b0135965060808b01356143bd81614309565b955060a08b0135945060c08b0135935060e08b013560ff811681146143e157600080fd5b809350506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060a0868803121561441c57600080fd5b6144258661412c565b94506020860135935061443a60408701614148565b925060608601359150608086013561445181614309565b809150509295509295909350565b60008083601f84011261447157600080fd5b50813567ffffffffffffffff81111561448957600080fd5b602083019150836020828501011115613cf157600080fd5b6000806000806000608086880312156144b957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156144e557600080fd5b6144f18882890161445f565b969995985093965092949392505050565b80356005811061414357600080fd5b6000806040838503121561452457600080fd5b61452d83614502565b91506141816020840161412c565b60006020828403121561454d57600080fd5b6118e982614148565b6000806040838503121561456957600080fd5b61426383614148565b6000806040838503121561458557600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b815160e0820190600381106145c1576145c1614594565b8083525060208301516020830152604083015160408301526060830151606083015260808301511515608083015260a0830151151560a083015260c083015160c083015292915050565b60008060008060006080868803121561462357600080fd5b61462c8661412c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156144e557600080fd5b600080600080600060a0868803121561466e57600080fd5b8535945061467e6020870161412c565b9350604086013592506060860135915061469a60808701614502565b90509295509295909350565b600080600080606085870312156146bc57600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156146e157600080fd5b6146ed8782880161445f565b95989497509550505050565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b6020808252600e908201526d125b9d985b1a5908185b5bdd5b9d60921b604082015260600190565b60006020828403121561475c57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b602080825260169082015275109b1858dad31a5cdd0e88109b1858dadb1a5cdd195960521b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a1557610a156147a9565b602080825260089082015267457870697265642160c01b604082015260600190565b600060018201614806576148066147a9565b5060010190565b8082028115828204841417610a1557610a156147a9565b60008261484157634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610a1557610a156147a9565b87815260006bffffffffffffffffffffffff19808960601b1660208401528760348401528660548401528560748401526005851061489957614899614594565b60f89490941b60948301525060609190911b909116609582015260a90195945050505050565b60005b838110156148da5781810151838201526020016148c2565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161491b8160178501602088016148bf565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161494c8160288401602088016148bf565b01602801949350505050565b60208152600082518060208401526149778160408501602087016148bf565b601f01601f19169190910160400192915050565b60006020828403121561499d57600080fd5b81516118e981614309565b634e487b7160e01b600052604160045260246000fd5b6000816149cd576149cd6147a9565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516149fd8184602087016148bf565b919091019291505056fefeacf388214f81db8ed10750402dc63529c4770ccbc97a62ad880cbd71e7c4d0a26469706673582212206bae00a1d4a7175d992e50d22b7d59e37a1db7e75d68a96702b0916d0fc59f8064736f6c63430008130033feacf388214f81db8ed10750402dc63529c4770ccbc97a62ad880cbd71e7c4d0e710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c00000000000000000000000070acad64e5a7887be85bcae8365e797feedcd62300000000000000000000000034802318bb8198f56b0102cfbf765e76593f92f5000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000004dae69d9f8ae321058b19e21a2445cbcd93b2f2f00000000000000000000000082f957ed33858fbca2093c16d4b5a95d3008036900000000000000000000000070acad64e5a7887be85bcae8365e797feedcd6230000000000000000000000007669444bd038cd6dfdcc41e817013381c59f465f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103d05760003560e01c80639012c4a8116101ff578063c2d468851161011a578063d63a6ccd116100ad578063e47d60601161007c578063e47d6060146109a4578063eb0eb8ab146109b7578063f01f8c78146109ca578063f4d4c9d7146109dd57600080fd5b8063d63a6ccd1461094f578063d707982914610962578063ddca3f4314610970578063e3c313661461097957600080fd5b8063cb955879116100e9578063cb95587914610903578063d32d6e9414610916578063d547741f14610929578063d5aeda571461093c57600080fd5b8063c2d468851461084f578063c891091314610862578063ca15c873146108d0578063ca699f25146108e357600080fd5b8063a7ecd37e11610192578063b1f3b34911610161578063b1f3b34914610816578063b222934714610829578063baca2e3e14610832578063c053df901461084557600080fd5b8063a7ecd37e146107bd578063acb30418146107d0578063b136f4d7146107f0578063b14907dd1461080357600080fd5b8063a217fddf116101ce578063a217fddf14610773578063a3b0b5a31461077b578063a4821719146107a2578063a5c8b23f146107b557600080fd5b80639012c4a81461071157806391d1485414610724578063998c7119146107375780639f4216e81461074a57600080fd5b806341a3bcb8116102ef57806361d027b3116102825780637f51bb1f116102515780637f51bb1f146106d05780638456cb59146106e35780638e6ee4de146106eb5780639010d07c146106fe57600080fd5b806361d027b3146106435780636209deb41461065657806362534ddf1461066957806375c955bf1461069457600080fd5b806345a72e7d116102be57806345a72e7d146105e657806348ee6709146105f95780635c975abb1461060c578063601c1b981461061757600080fd5b806341a3bcb81461057e5780634202d21414610591578063439eb435146105c057806344f43743146105d357600080fd5b80632f2ff15d1161036757806336568abe1161033657806336568abe1461051f57806339c1d464146105325780633cc49d641461053a5780633f4ba83a1461057657600080fd5b80632f2ff15d146104d6578063307ee3b1146104e95780633410fe6e146104fc57806335e4cefe1461050c57600080fd5b8063248a9ca3116103a3578063248a9ca31461046b57806326bcff7d1461048e57806328c4e24c146104ae5780632b1669eb146104c357600080fd5b806301ffc9a7146103d5578063029b5499146103fd578063137e45fe14610415578063238ac93314610440575b600080fd5b6103e86103e3366004614102565b6109f0565b60405190151581526020015b60405180910390f35b61040762278d0081565b6040519081526020016103f4565b610407610423366004614157565b601060209081526000928352604080842090915290825290205481565b600354610453906001600160a01b031681565b6040516001600160a01b0390911681526020016103f4565b61040761047936600461418a565b60009081526012602052604090206001015490565b6104a161049c3660046141a3565b610a1b565b6040516103f491906141be565b6104c16104bc36600461420b565b610a94565b005b6104536104d1366004614247565b610c6f565b6104c16104e4366004614271565b610cb8565b6104c16104f7366004614294565b610ce2565b61040768056bc75e2d6310000081565b61040761051a366004614317565b610cf7565b6104c161052d366004614271565b610d39565b610407610db7565b6104536105483660046141a3565b6001600160a01b039081166000908152600f60209081526040808320600201548352600e9091529020541690565b6104c1610dc8565b6104c161058c366004614335565b610dde565b6103e861059f3660046141a3565b6001600160a01b03166000908152600f602052604090206005015460ff1690565b6104c16105ce366004614294565b610dfa565b6104c16105e1366004614368565b610e0f565b6104c16105f4366004614404565b611170565b6104c16106073660046144a1565b611208565b60145460ff166103e8565b6104076106253660046141a3565b6001600160a01b03166000908152600f602052604090206006015490565b600254610453906001600160a01b031681565b6104c16106643660046144a1565b6114ae565b610407610677366004614511565b600b60209081526000928352604080842090915290825290205481565b6106bb6106a236600461453b565b600d602052600090815260409020805460019091015482565b604080519283526020830191909152016103f4565b6104c16106de3660046141a3565b611895565b6104c16118a9565b6104c16106f9366004614556565b6118bc565b61045361070c366004614572565b6118d1565b6104c161071f36600461418a565b6118f0565b6103e8610732366004614271565b611904565b6104c16107453660046141a3565b61192f565b61045361075836600461418a565b600e602052600090815260409020546001600160a01b031681565b610407600081565b6104077f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b600654610453906001600160a01b031681565b6104a1611943565b6104c16107cb3660046141a3565b61194f565b6107e36107de366004614247565b611963565b6040516103f491906145aa565b6104c16107fe36600461460b565b611a54565b6104c16108113660046141a3565b611cc1565b610407610824366004614656565b611cd5565b61040760005481565b6104c16108403660046141a3565b611d5e565b6104076201518081565b600554610453906001600160a01b031681565b6108a46108703660046141a3565b600f602052600090815260409020805460018201546002830154600484015460059094015460ff9384169492939192911685565b60408051951515865260208601949094529284019190915260608301521515608082015260a0016103f4565b6104076108de36600461418a565b611d72565b6104076108f136600461453b565b600c6020526000908152604090205481565b61045361091136600461418a565b611d89565b6104c16109243660046141a3565b611d96565b6104c1610937366004614271565b611daa565b6104c161094a3660046146a6565b611dcf565b600454610453906001600160a01b031681565b6007546008546106bb919082565b61040760015481565b610407610987366004614157565b601160209081526000928352604080842090915290825290205481565b6103e86109b23660046141a3565b612042565b6104a16109c53660046141a3565b61204f565b6104c16109d836600461460b565b6120c6565b6104c16109eb366004614556565b6122da565b60006001600160e01b03198216635a05180f60e01b1480610a155750610a15826123e8565b92915050565b6001600160a01b0381166000908152600f6020908152604091829020600301805483518184028101840190945280845260609392830182828015610a8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a6a575b50505050509050919050565b6000610a9f8161241d565b826001600160a01b038116610acf5760405162461bcd60e51b8152600401610ac6906146f9565b60405180910390fd5b8260008111610af05760405162461bcd60e51b8152600401610ac690614722565b610af985612042565b15610b465760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a20746f20697320426c61636b6c697374656400000000006044820152606401610ac6565b6001600160a01b038616610b6357610b5e8585612427565b610c26565b6040516370a0823160e01b815230600482015284906001600160a01b038816906370a0823190602401602060405180830381865afa158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd919061474a565b1015610c1b5760405162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ac6565b610c26868686612540565b83856001600160a01b0316876001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb60405160405180910390a4505050505050565b6001600160a01b0382166000908152600f60205260408120600301805483908110610c9c57610c9c614763565b6000918252602090912001546001600160a01b03169392505050565b600082815260126020526040902060010154610cd38161241d565b610cdd83836125a3565b505050565b6000610ced8161241d565b610cdd83836125c5565b60008215610d25576009805483908110610d1357610d13614763565b90600052602060002001549050610a15565b600a805483908110610d1357610d13614763565b6001600160a01b0381163314610da95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610ac6565b610db3828261267a565b5050565b6000610dc3601561269c565b905090565b6000610dd38161241d565b610ddb6126a6565b50565b6000610de98161241d565b610df48484846126f8565b50505050565b6000610e058161241d565b610cdd8383612792565b610e17612842565b896001600160a01b0381163b15610e685760405162461bcd60e51b81526020600482015260156024820152741059191c995cdcc81a5cc8184818dbdb9d1c9858dd605a1b6044820152606401610ac6565b8a610e7281612042565b15610e8f5760405162461bcd60e51b8152600401610ac690614779565b6000600d60008c6002811115610ea757610ea7614594565b6002811115610eb857610eb8614594565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000548c1115610f275760405162461bcd60e51b815260206004820152600b60248201526a189d5e4e8812481488125160aa1b6044820152606401610ac6565b610f2f61407f565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b919061474a565b8152600454610fb5906001600160a01b03168f308e61288a565b600654600454610fd2916001600160a01b0391821691168d6128c2565b60065460048054604051636ccf368160e01b81526001600160a01b0391821692810192909252602482018c9052604482018e9052606482018b905260ff8a16608483015260a4820189905260c4820188905290911690636ccf36819060e401600060405180830381600087803b15801561104b57600080fd5b505af115801561105f573d6000803e3d6000fd5b505050508060006002811061107657611076614763565b60200201516005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e7919061474a565b6110f191906147bf565b602082018190528251118015906111085750815115155b61114a5760405162461bcd60e51b81526020600482015260136024820152726275793a20492041207c7c20492050204d204160681b6044820152606401610ac6565b6111608e8e8e84600160200201518e60006129d7565b5050505050505050505050505050565b611178612842565b846001600160a01b0381163b156111c95760405162461bcd60e51b81526020600482015260156024820152741059191c995cdcc81a5cc8184818dbdb9d1c9858dd605a1b6044820152606401610ac6565b856111d381612042565b156111f05760405162461bcd60e51b8152600401610ac690614779565b6111ff878787878760016129d7565b50505050505050565b611210612842565b83600081116112315760405162461bcd60e51b8152600401610ac690614722565b83428110156112525760405162461bcd60e51b8152600401610ac6906147d2565b3361125c81612042565b156112795760405162461bcd60e51b8152600401610ac690614779565b336000818152600f602090815260408083208c845260070190915290206004810154610100900460ff166112e35760405162461bcd60e51b81526020600482015260116024820152704356616e64433a204e2056616e6443202160781b6044820152606401610ac6565b888160050154101561132b5760405162461bcd60e51b815260206004820152601160248201527021ab30b732219d1024902b30b73221902960791b6044820152606401610ac6565b61133b8a838b8b60018c8c612dab565b6001600160a01b03821660009081527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf6020526040812080549161137e836147f4565b91905055508881600501600082825461139791906147bf565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061474a565b8911156114465760405162461bcd60e51b815260206004820152600c60248201526b4356616e64433a204920462160a01b6044820152606401610ac6565b60055461145d906001600160a01b0316838b612540565b888a836001600160a01b03167f2d1723e9447bfa05e9b15c1fe9ef8c230e47bdd1cd340c244b6dae7336502add4260405161149a91815260200190565b60405180910390a450505050505050505050565b6114b6612842565b336114c081612042565b156114dd5760405162461bcd60e51b8152600401610ac690614779565b83428110156114fe5760405162461bcd60e51b8152600401610ac6906147d2565b866000811161151f5760405162461bcd60e51b8152600401610ac690614722565b336000818152600f602090815260408083208b8452600701909152902060018101546115805760405162461bcd60e51b815260206004820152601060248201526f43523a20492053207c7c20412052204360801b6044820152606401610ac6565b600481015460ff16156115c15760405162461bcd60e51b815260206004820152600960248201526843433a20432041204360b81b6044820152606401610ac6565b6115d189838c8b60008c8c612dab565b6001600160a01b03821660009081527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7660205260408120805491611614836147f4565b9190505550600068056bc75e2d631000006001548c611633919061480d565b61163d9190614824565b9050600061164b828d6147bf565b90508115611718576005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061474a565b8211156116fb5760405162461bcd60e51b815260206004820152600a60248201526943523a2049204620462160b01b6044820152606401610ac6565b600254600554611718916001600160a01b03918216911684612540565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611760573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611784919061474a565b8111156117c05760405162461bcd60e51b815260206004820152600a60248201526943523a2049205220462160b01b6044820152606401610ac6565b6001600160a01b0384166000908152601160205260408120845483929060ff1660028111156117f1576117f1614594565b600281111561180257611802614594565b8152602001908152602001600020600082825461181f9190614846565b909155505060055461183b906001600160a01b03168583612540565b604080516001600160a01b0386168152602081018d905242818301529051829184917f483e3ca361c7b5e5a1f600e9c06025be8c62aa815785f54efa3b1847610909669181900360600190a3505050505050505050505050565b60006118a08161241d565b610db382612e97565b60006118b48161241d565b610ddb612f0c565b60006118c78161241d565b610cdd8383612f49565b60008281526013602052604081206118e99083612ff8565b9392505050565b60006118fb8161241d565b610db382613004565b60009182526012602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061193a8161241d565b610db382613084565b6060610dc36015613125565b600061195a8161241d565b610db382613132565b6119a86040805160e081019091528060008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600081525090565b6001600160a01b0383166000908152600f6020908152604080832085845260070190915290819020815160e081019092528054829060ff1660028111156119f1576119f1614594565b6002811115611a0257611a02614594565b8152600182015460208201526002820154604082015260038201546060820152600482015460ff8082161515608084015261010090910416151560a082015260059091015460c0909101529392505050565b611a5c612842565b846001600160a01b038116611a835760405162461bcd60e51b8152600401610ac6906146f9565b85611a8d81612042565b15611aaa5760405162461bcd60e51b8152600401610ac690614779565b8560008111611acb5760405162461bcd60e51b8152600401610ac690614722565b8542811015611aec5760405162461bcd60e51b8152600401610ac6906147d2565b33611af681612042565b15611b135760405162461bcd60e51b8152600401610ac690614779565b6001600160a01b038a166000908152600f602052604090205460ff16611b675760405162461bcd60e51b815260206004820152600960248201526843563a204e2041205560b81b6044820152606401610ac6565b611b7860008b8b8b60038c8c612dab565b6001600160a01b038a1660009081527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e60205260408120805491611bbb836147f4565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c919061474a565b891115611c665760405162461bcd60e51b815260206004820152600860248201526743563a204920462160c01b6044820152606401610ac6565b600554611c7d906001600160a01b03168b8b612540565b6005546040514281528a916001600160a01b038d8116929116907f58299c5be170e02a81f2b7e59fa4e4e61ce9820cb357a29eb3d59397803f1ba69060200161149a565b6000611ccc8161241d565b610db3826131e3565b600085858585600b6000876004811115611cf157611cf1614594565b6004811115611d0257611d02614594565b8152602080820192909252604090810160009081206001600160a01b038d1682528352819020549051611d3d96959493928991309101614859565b60405160208183030381529060405280519060200120905095945050505050565b6000611d698161241d565b610db38261333d565b6000818152601360205260408120610a159061269c565b6000610a15601583612ff8565b6000611da18161241d565b610db3826133b2565b600082815260126020526040902060010154611dc58161241d565b610cdd838361267a565b611dd7612842565b8242811015611df85760405162461bcd60e51b8152600401610ac6906147d2565b33611e0281612042565b15611e1f5760405162461bcd60e51b8152600401610ac690614779565b336000818152600f602090815260408083208a84526007019091529020600481015460ff1615611e7d5760405162461bcd60e51b815260206004820152600960248201526843433a20432041204360b81b6044820152606401610ac6565b8060030154421015611ec25760405162461bcd60e51b815260206004820152600e60248201526d21a19d1021903a34b6b29027102960911b6044820152606401610ac6565b611ed3888360008a60028b8b612dab565b6001600160a01b03821660009081527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163460205260408120805491611f16836147f4565b90915550506004818101805460ff191660019081179091558201546005546040516370a0823160e01b8152309381019390935290916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa1919061474a565b811115611fdb5760405162461bcd60e51b815260206004820152600860248201526743433a204920462160c01b6044820152606401610ac6565b600554611ff2906001600160a01b03168483612540565b8089846001600160a01b03167f9b6ae367e8eca958455864453cfe3ab4b0b04ef8f98c1b77cae407500d9567a94260405161202f91815260200190565b60405180910390a4505050505050505050565b6000610a15601583613453565b6001600160a01b0381166000908152600f6020908152604091829020600601805483518184028101840190945280845260609392830182828015610a88576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610a6a5750505050509050919050565b6120ce612842565b846001600160a01b0381166120f55760405162461bcd60e51b8152600401610ac6906146f9565b856120ff81612042565b1561211c5760405162461bcd60e51b8152600401610ac690614779565b856000811161213d5760405162461bcd60e51b8152600401610ac690614722565b854281101561215e5760405162461bcd60e51b8152600401610ac6906147d2565b3361216881612042565b156121855760405162461bcd60e51b8152600401610ac690614779565b6001600160a01b038a166000908152600f602052604090205460ff166121da5760405162461bcd60e51b815260206004820152600a6024820152695352523a204e2041205560b01b6044820152606401610ac6565b6121eb60008b8b8b60048c8c612dab565b6001600160a01b038a1660009081527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7846020526040812080549161222e836147f4565b90915550506005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f919061474a565b891115611c665760405162461bcd60e51b81526020600482015260096024820152685352523a204920462160b81b6044820152606401610ac6565b6122e2612842565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a961230c8161241d565b816000811161232d5760405162461bcd60e51b8152600401610ac690614722565b612345336005546001600160a01b031690308661288a565b336000908152601060205260408120849186600281111561236857612368614594565b600281111561237957612379614594565b815260200190815260200160002060008282546123969190614846565b90915550429050837f33da4f9b82b3e18a281ca2cabbe2f076925692abb593b7ea3f850009e8ec97708660028111156123d1576123d1614594565b60405190815260200160405180910390a350505050565b60006001600160e01b03198216637965db0b60e01b1480610a1557506301ffc9a760e01b6001600160e01b0319831614610a15565b610ddb8133613475565b804710156124775760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124c4576040519150601f19603f3d011682016040523d82523d6000602084013e6124c9565b606091505b5050905080610cdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6040516001600160a01b038316602482015260448101829052610cdd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134ce565b6125ad82826135a0565b6000828152601360205260409020610cdd9082613626565b80600081900361262e5760405162461bcd60e51b815260206004820152602e60248201527f72656d6f766546726f6d426c61636b4c69737442617463683a204e6f2061646460448201526d7265737320617661696c61626c6560901b6064820152608401610ac6565b60005b81811015610df45761266884848381811061264e5761264e614763565b905060200201602081019061266391906141a3565b61363b565b80612672816147f4565b915050612631565b6126848282613741565b6000828152601360205260409020610cdd90826137a8565b6000610a15825490565b6126ae6137bd565b6014805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b81600081116127195760405162461bcd60e51b8152600401610ac690614722565b816000811161273a5760405162461bcd60e51b8152600401610ac690614722565b6000600d600087600281111561275257612752614594565b600281111561276357612763614594565b8152602081019190915260400160002085815590506127858462278d0061480d565b6001909101555050505050565b8060008190036127f65760405162461bcd60e51b815260206004820152602960248201527f616464546f426c61636b4c69737442617463683a204e6f206164647265737320604482015268617661696c61626c6560b81b6064820152608401610ac6565b60005b81811015610df45761283084848381811061281657612816614763565b905060200201602081019061282b91906141a3565b613806565b8061283a816147f4565b9150506127f9565b60145460ff16156128885760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ac6565b565b6040516001600160a01b0380851660248301528316604482015260648101829052610df49085906323b872dd60e01b9060840161256c565b80158061293c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293a919061474a565b155b6129a75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610ac6565b6040516001600160a01b038316602482015260448101829052610cdd90849063095ea7b360e01b9060640161256c565b600054851115612a175760405162461bcd60e51b815260206004820152600b60248201526a189d5e4e8812481488125160aa1b6044820152606401610ac6565b6000600d6000866002811115612a2f57612a2f614594565b6002811115612a4057612a40614594565b815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905080600001518410158015612a835750805115155b612ac55760405162461bcd60e51b81526020600482015260136024820152726275793a20492041207c7c20492050204d204160681b6044820152606401610ac6565b8115612ae357600554612ae3906001600160a01b031688308761288a565b6001600160a01b038088166000908152600f602081815260408084208b8552600e83528185205490951684529190529020815460ff16612b995760008060008154612b2d906147f4565b9182905550835460ff191660019081178555848101829055600285018b90556000918252600e60209081526040832080546001600160a01b038f166001600160a01b03199182168117909255600387018054948501815585529190932090910180549091169091179055505b866002811115612bab57612bab614594565b6002148015612bd657506001600160a01b0389166000908152600f602052604090206005015460ff16155b15612c1d57600582018054600160ff19909116811790915560068201805491820181556000908152602090200180546001600160a01b0319166001600160a01b038b161790555b600042905060008360040160008154612c35906147f4565b91829055506000818152600786016020526040902080549192508a9160ff19166001836002811115612c6957612c69614594565b021790555060008181526007850160209081526040909120600181018a9055600201839055850151612c9b9083614846565b6000828152600786016020526040902060038101919091556004018054881580156101000261ff001990921691909117909155612d3c5768056bc75e2d63100000600c60008b6002811115612cf257612cf2614594565b6002811115612d0357612d03614594565b81526020019081526020016000205489612d1d919061480d565b612d279190614824565b60008281526007860160205260409020600501555b878b6001600160a01b031685600201547f16948db8bcc24c1451b81ce10d2455a365024ce41c6d159d937540b419479fa38c6002811115612d7f57612d7f614594565b604080519182528c15156020830152810187905260600160405180910390a45050505050505050505050565b612e5082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e4a9250612df791508b90508a8a8a8a611cd5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90613903565b6003546001600160a01b039081169116146111ff5760405162461bcd60e51b815260206004820152600760248201526656533a2049205360c81b6044820152606401610ac6565b806001600160a01b038116612ebe5760405162461bcd60e51b8152600401610ac6906146f9565b6002546040516001600160a01b03808516921690600590600080516020614a0883398151915290600090a450600280546001600160a01b0319166001600160a01b0392909216919091179055565b612f14612842565b6014805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126db3390565b80600c6000846002811115612f6057612f60614594565b6002811115612f7157612f71614594565b815260200190815260200160002054836002811115612f9257612f92614594565b6040517f76cae5445af327a902fc39c5ef423722fb33aa4a13fa9ec898fa7ea4ff7005df90600090a480600c6000846002811115612fd257612fd2614594565b6002811115612fe357612fe3614594565b81526020810191909152604001600020555050565b60006118e98383613927565b68056bc75e2d6310000081111561304f5760405162461bcd60e51b815260206004820152600f60248201526e55463a20496e76616c69642046656560881b6044820152606401610ac6565b600180546040518392907f745acddc07413883bbe627d1122e673f7090f1f1a1004e33954c221210ecaab990600090a4600155565b806001600160a01b0381163b6130d75760405162461bcd60e51b8152602060048201526018602482015277496e76616c696420436f6e7472616374204164647265737360401b6044820152606401610ac6565b6005546040516001600160a01b03808516921690600390600080516020614a0883398151915290600090a450600580546001600160a01b0319166001600160a01b0392909216919091179055565b606060006118e983613951565b806001600160a01b0381161580159061315357506001600160a01b0381163b155b6131955760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420454f41204164647265737360681b6044820152606401610ac6565b6003546040516001600160a01b03808516921690600290600080516020614a0883398151915290600090a450600380546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b03811661320a5760405162461bcd60e51b8152600401610ac6906146f9565b7fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c546001600160a01b039081166000818152600f602052604080822093861682529020805491929160ff161561328c5760405162461bcd60e51b815260206004820152600760248201526655523a2041204560c81b6044820152606401610ac6565b805460ff19166001908117825560009082018190556002820155600380830180546132ba928401919061409d565b50600680830180546132cf928401919061409d565b506000808052600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c80546001600160a01b0319166001600160a01b03888116918217909255604051909291861691600691600080516020614a088339815191529190a45050505050565b806001600160a01b0381166133645760405162461bcd60e51b8152600401610ac6906146f9565b6006546040516001600160a01b03808516921690600890600080516020614a0883398151915290600090a450600680546001600160a01b0319166001600160a01b0392909216919091179055565b806001600160a01b0381163b6134055760405162461bcd60e51b8152602060048201526018602482015277496e76616c696420436f6e7472616374204164647265737360401b6044820152606401610ac6565b600480546040516001600160a01b038086169392169190600080516020614a0883398151915290600090a450600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600090815260018301602052604081205415156118e9565b61347f8282611904565b610db35761348c816139ac565b6134978360206139be565b6040516020016134a89291906148e3565b60408051601f198184030181529082905262461bcd60e51b8252610ac691600401614958565b6000613523826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613b5a9092919063ffffffff16565b805190915015610cdd5780806020019051810190613541919061498b565b610cdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ac6565b6135aa8282611904565b610db35760008281526012602090815260408083206001600160a01b03851684529091529020805460ff191660011790556135e23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006118e9836001600160a01b038416613b71565b6001600160a01b03811661369b5760405162461bcd60e51b815260206004820152602160248201527f72656d6f766546726f6d426c61636b4c6973743a205a65726f204164647265736044820152607360f81b6064820152608401610ac6565b6136a481612042565b6136fc5760405162461bcd60e51b8152602060048201526024808201527f72656d6f766546726f6d426c61636b4c6973743a204e6f7420426c61636b4c696044820152631cdd195960e21b6064820152608401610ac6565b6137076015826137a8565b5060405142906001600160a01b038316907f0943e9e6f55a59ad16ce145d5174cb2d1be6ee7f54674be8a78f02f567f25dc790600090a350565b61374b8282611904565b15610db35760008281526012602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006118e9836001600160a01b038416613bc0565b60145460ff166128885760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ac6565b6001600160a01b03811661385c5760405162461bcd60e51b815260206004820152601c60248201527f616464546f426c61636b4c6973743a205a65726f2041646472657373000000006044820152606401610ac6565b61386581612042565b156138be5760405162461bcd60e51b815260206004820152602360248201527f616464546f426c61636b4c6973743a20416c726561647920426c61636b4c69736044820152621d195960ea1b6064820152608401610ac6565b6138c9601582613626565b5060405142906001600160a01b038316907f70d3a1ed5a2930b20cd83412155769ab6fd76cd2810cc3c21d273af4744a067190600090a350565b60008060006139128585613cb3565b9150915061391f81613cf8565b509392505050565b600082600001828154811061393e5761393e614763565b9060005260206000200154905092915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015610a8857602002820191906000526020600020905b81548152602001906001019080831161398d5750505050509050919050565b6060610a156001600160a01b03831660145b606060006139cd83600261480d565b6139d8906002614846565b67ffffffffffffffff8111156139f0576139f06149a8565b6040519080825280601f01601f191660200182016040528015613a1a576020820181803683370190505b509050600360fc1b81600081518110613a3557613a35614763565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a6457613a64614763565b60200101906001600160f81b031916908160001a9053506000613a8884600261480d565b613a93906001614846565b90505b6001811115613b0b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613ac757613ac7614763565b1a60f81b828281518110613add57613add614763565b60200101906001600160f81b031916908160001a90535060049490941c93613b04816149be565b9050613a96565b5083156118e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ac6565b6060613b698484600085613e42565b949350505050565b6000818152600183016020526040812054613bb857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a15565b506000610a15565b60008181526001830160205260408120548015613ca9576000613be46001836147bf565b8554909150600090613bf8906001906147bf565b9050818114613c5d576000866000018281548110613c1857613c18614763565b9060005260206000200154905080876000018481548110613c3b57613c3b614763565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613c6e57613c6e6149d5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a15565b6000915050610a15565b6000808251604103613ce95760208301516040840151606085015160001a613cdd87828585613f1d565b94509450505050613cf1565b506000905060025b9250929050565b6000816004811115613d0c57613d0c614594565b03613d145750565b6001816004811115613d2857613d28614594565b03613d755760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ac6565b6002816004811115613d8957613d89614594565b03613dd65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ac6565b6003816004811115613dea57613dea614594565b03610ddb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ac6565b606082471015613ea35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ac6565b600080866001600160a01b03168587604051613ebf91906149eb565b60006040518083038185875af1925050503d8060008114613efc576040519150601f19603f3d011682016040523d82523d6000602084013e613f01565b606091505b5091509150613f1287838387613fe1565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613f545750600090506003613fd8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613fa8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613fd157600060019250925050613fd8565b9150600090505b94509492505050565b60608315614050578251600003614049576001600160a01b0385163b6140495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ac6565b5081613b69565b613b6983838151156140655781518083602001fd5b8060405162461bcd60e51b8152600401610ac69190614958565b60405180604001604052806002906020820280368337509192915050565b8280548282559060005260206000209081019282156140dd5760005260206000209182015b828111156140dd5782548255916001019190600101906140c2565b506140e99291506140ed565b5090565b5b808211156140e957600081556001016140ee565b60006020828403121561411457600080fd5b81356001600160e01b0319811681146118e957600080fd5b80356001600160a01b038116811461414357600080fd5b919050565b80356003811061414357600080fd5b6000806040838503121561416a57600080fd5b6141738361412c565b915061418160208401614148565b90509250929050565b60006020828403121561419c57600080fd5b5035919050565b6000602082840312156141b557600080fd5b6118e98261412c565b6020808252825182820181905260009190848201906040850190845b818110156141ff5783516001600160a01b0316835292840192918401916001016141da565b50909695505050505050565b60008060006060848603121561422057600080fd5b6142298461412c565b92506142376020850161412c565b9150604084013590509250925092565b6000806040838503121561425a57600080fd5b6142638361412c565b946020939093013593505050565b6000806040838503121561428457600080fd5b823591506141816020840161412c565b600080602083850312156142a757600080fd5b823567ffffffffffffffff808211156142bf57600080fd5b818501915085601f8301126142d357600080fd5b8135818111156142e257600080fd5b8660208260051b85010111156142f757600080fd5b60209290920196919550909350505050565b8015158114610ddb57600080fd5b6000806040838503121561432a57600080fd5b823561426381614309565b60008060006060848603121561434a57600080fd5b61435384614148565b95602085013595506040909401359392505050565b6000806000806000806000806000806101408b8d03121561438857600080fd5b6143918b61412c565b995060208b013598506143a660408c01614148565b975060608b0135965060808b01356143bd81614309565b955060a08b0135945060c08b0135935060e08b013560ff811681146143e157600080fd5b809350506101008b013591506101208b013590509295989b9194979a5092959850565b600080600080600060a0868803121561441c57600080fd5b6144258661412c565b94506020860135935061443a60408701614148565b925060608601359150608086013561445181614309565b809150509295509295909350565b60008083601f84011261447157600080fd5b50813567ffffffffffffffff81111561448957600080fd5b602083019150836020828501011115613cf157600080fd5b6000806000806000608086880312156144b957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156144e557600080fd5b6144f18882890161445f565b969995985093965092949392505050565b80356005811061414357600080fd5b6000806040838503121561452457600080fd5b61452d83614502565b91506141816020840161412c565b60006020828403121561454d57600080fd5b6118e982614148565b6000806040838503121561456957600080fd5b61426383614148565b6000806040838503121561458557600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b815160e0820190600381106145c1576145c1614594565b8083525060208301516020830152604083015160408301526060830151606083015260808301511515608083015260a0830151151560a083015260c083015160c083015292915050565b60008060008060006080868803121561462357600080fd5b61462c8661412c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156144e557600080fd5b600080600080600060a0868803121561466e57600080fd5b8535945061467e6020870161412c565b9350604086013592506060860135915061469a60808701614502565b90509295509295909350565b600080600080606085870312156146bc57600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156146e157600080fd5b6146ed8782880161445f565b95989497509550505050565b6020808252600f908201526e496e76616c6964204164647265737360881b604082015260600190565b6020808252600e908201526d125b9d985b1a5908185b5bdd5b9d60921b604082015260600190565b60006020828403121561475c57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b602080825260169082015275109b1858dad31a5cdd0e88109b1858dadb1a5cdd195960521b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a1557610a156147a9565b602080825260089082015267457870697265642160c01b604082015260600190565b600060018201614806576148066147a9565b5060010190565b8082028115828204841417610a1557610a156147a9565b60008261484157634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610a1557610a156147a9565b87815260006bffffffffffffffffffffffff19808960601b1660208401528760348401528660548401528560748401526005851061489957614899614594565b60f89490941b60948301525060609190911b909116609582015260a90195945050505050565b60005b838110156148da5781810151838201526020016148c2565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161491b8160178501602088016148bf565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161494c8160288401602088016148bf565b01602801949350505050565b60208152600082518060208401526149778160408501602087016148bf565b601f01601f19169190910160400192915050565b60006020828403121561499d57600080fd5b81516118e981614309565b634e487b7160e01b600052604160045260246000fd5b6000816149cd576149cd6147a9565b506000190190565b634e487b7160e01b600052603160045260246000fd5b600082516149fd8184602087016148bf565b919091019291505056fefeacf388214f81db8ed10750402dc63529c4770ccbc97a62ad880cbd71e7c4d0a26469706673582212206bae00a1d4a7175d992e50d22b7d59e37a1db7e75d68a96702b0916d0fc59f8064736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000070acad64e5a7887be85bcae8365e797feedcd62300000000000000000000000034802318bb8198f56b0102cfbf765e76593f92f5000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000004dae69d9f8ae321058b19e21a2445cbcd93b2f2f00000000000000000000000082f957ed33858fbca2093c16d4b5a95d3008036900000000000000000000000070acad64e5a7887be85bcae8365e797feedcd6230000000000000000000000007669444bd038cd6dfdcc41e817013381c59f465f
-----Decoded View---------------
Arg [0] : newRoot (address): 0x70aCAd64E5A7887BE85BcAE8365E797FeEDCD623
Arg [1] : newSigner (address): 0x34802318Bb8198f56b0102CFBF765e76593f92f5
Arg [2] : newUsd (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : newVac (address): 0x4DaE69D9F8Ae321058B19E21A2445cbcd93b2f2F
Arg [4] : newTreasury (address): 0x82f957ED33858fBca2093c16D4B5A95d30080369
Arg [5] : owner (address): 0x70aCAd64E5A7887BE85BcAE8365E797FeEDCD623
Arg [6] : buyToken (address): 0x7669444bd038cd6DFDCc41E817013381C59f465f
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000070acad64e5a7887be85bcae8365e797feedcd623
Arg [1] : 00000000000000000000000034802318bb8198f56b0102cfbf765e76593f92f5
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 0000000000000000000000004dae69d9f8ae321058b19e21a2445cbcd93b2f2f
Arg [4] : 00000000000000000000000082f957ed33858fbca2093c16d4b5a95d30080369
Arg [5] : 00000000000000000000000070acad64e5a7887be85bcae8365e797feedcd623
Arg [6] : 0000000000000000000000007669444bd038cd6dfdcc41e817013381c59f465f
Deployed Bytecode Sourcemap
92875:10182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75679:290;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;75679:290:0;;;;;;;;81331:51;;81375:7;81331:51;;;;;643:25:1;;;631:2;616:18;81331:51:0;497:177:1;82004:64:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;81581:21;;;;;-1:-1:-1;;;;;81581:21:0;;;;;;-1:-1:-1;;;;;1459:32:1;;;1441:51;;1429:2;1414:18;81581:21:0;1295:203:1;71236:181:0;;;;;;:::i;:::-;71355:7;71387:12;;;:6;:12;;;;;:22;;;;71236:181;85329:165;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;89725:653::-;;;;;;:::i;:::-;;:::i;:::-;;85502:184;;;;;;:::i;:::-;;:::i;71727:188::-;;;;;;:::i;:::-;;:::i;88088:176::-;;;;;;:::i;:::-;;:::i;81443:40::-;;81477:6;81443:40;;84730:272;;;;;;:::i;:::-;;:::i;72953:287::-;;;;;;:::i;:::-;;:::i;78464:104::-;;;:::i;85694:174::-;;;;;;:::i;:::-;-1:-1:-1;;;;;85831:17:0;;;85790:7;85831:17;;;:8;:17;;;;;;;;:28;;;85822:38;;:8;:38;;;;;;;;85694:174;87820:86;;;:::i;89089:225::-;;;;;;:::i;:::-;;:::i;86088:122::-;;;;;;:::i;:::-;-1:-1:-1;;;;;86172:17:0;86148:4;86172:17;;;:8;:17;;;;;:30;;;;;;86088:122;87914:166;;;;;;:::i;:::-;;:::i;93777:1112::-;;;;;;:::i;:::-;;:::i;94897:366::-;;;;;;:::i;:::-;;:::i;98793:1220::-;;;;;;:::i;:::-;;:::i;65904:86::-;65975:7;;;;65904:86;;85010:137;;;;;;:::i;:::-;-1:-1:-1;;;;;85103:17:0;85076:7;85103:17;;;:8;:17;;;;;:29;;:36;;85010:137;81551:23;;;;;-1:-1:-1;;;;;81551:23:0;;;97218:1567;;;;;;:::i;:::-;;:::i;81728:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;81856:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8303:25:1;;;8359:2;8344:18;;8337:34;;;;8276:18;81856:44:0;8129:248:1;88661:153:0;;;;;;:::i;:::-;;:::i;87730:82::-;;;:::i;89322:220::-;;;;;;:::i;:::-;;:::i;76568:203::-;;;;;;:::i;:::-;;:::i;88969:112::-;;;;;;:::i;:::-;;:::i;69659:197::-;;;;;;:::i;:::-;;:::i;88541:112::-;;;;;;:::i;:::-;;:::i;81907:43::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;81907:43:0;;;68688:49;;68733:4;68688:49;;81256:68;;81297:27;81256:68;;81661:25;;;;;-1:-1:-1;;;;;81661:25:0;;;78703:112;;;:::i;88392:141::-;;;;;;:::i;:::-;;:::i;85876:204::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;101142:703::-;;;;;;:::i;:::-;;:::i;88822:139::-;;;;;;:::i;:::-;;:::i;86539:537::-;;;;;;:::i;:::-;;:::i;81492:25::-;;;;;;89550:167;;;;;;:::i;:::-;;:::i;81389:47::-;;81431:5;81389:47;;81636:18;;;;;-1:-1:-1;;;;;81636:18:0;;;81957:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11568:14:1;;11561:22;11543:41;;11615:2;11600:18;;11593:34;;;;11643:18;;;11636:34;;;;11701:2;11686:18;;11679:34;11757:14;11750:22;11744:3;11729:19;;11722:51;11530:3;11515:19;81957:40:0;11296:483:1;76945:192:0;;;;;;:::i;:::-;;:::i;81792:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;78576:119;;;;;;:::i;:::-;;:::i;88272:112::-;;;;;;:::i;:::-;;:::i;72208:190::-;;;;;;:::i;:::-;;:::i;100021:1113::-;;;;;;:::i;:::-;;:::i;81611:18::-;;;;;-1:-1:-1;;;;;81611:18:0;;;81693:26;;;;;;;;;;81524:18;;;;;;82075:69;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;78823:121;;;;;;:::i;:::-;;:::i;85155:166::-;;;;;;:::i;:::-;;:::i;101853:827::-;;;;;;:::i;:::-;;:::i;102688:366::-;;;;;;:::i;:::-;;:::i;75679:290::-;75809:4;-1:-1:-1;;;;;;75851:57:0;;-1:-1:-1;;;75851:57:0;;:110;;;75925:36;75949:11;75925:23;:36::i;:::-;75831:130;75679:290;-1:-1:-1;;75679:290:0:o;85329:165::-;-1:-1:-1;;;;;85460:17:0;;;;;;:8;:17;;;;;;;;;:26;;85453:33;;;;;;;;;;;;;;;;;85419:16;;85453:33;;;85460:26;85453:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;85453:33:0;;;;;;;;;;;;;;;;;;;;;;;85329:165;;;:::o;89725:653::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;89899:2;-1:-1:-1;;;;;84337:21:0;::::1;84329:49;;;;-1:-1:-1::0;;;84329:49:0::1;;;;;;;:::i;:::-;;;;;;;;;89925:6:::2;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::2;;;;;;;:::i;:::-;89958:17:::3;89972:2;89958:13;:17::i;:::-;89957:18;89949:58;;;::::0;-1:-1:-1;;;89949:58:0;;13223:2:1;89949:58:0::3;::::0;::::3;13205:21:1::0;13262:2;13242:18;;;13235:30;13301:29;13281:18;;;13274:57;13348:18;;89949:58:0::3;13021:351:1::0;89949:58:0::3;-1:-1:-1::0;;;;;90022:19:0;::::3;90018:310;;90043:38;90069:2;90074:6;90043:17;:38::i;:::-;90018:310;;;90138:38;::::0;-1:-1:-1;;;90138:38:0;;90170:4:::3;90138:38;::::0;::::3;1441:51:1::0;90180:6:0;;-1:-1:-1;;;;;90138:23:0;::::3;::::0;::::3;::::0;1414:18:1;;90138:38:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;90112:140;;;::::0;-1:-1:-1;;;90112:140:0;;13768:2:1;90112:140:0::3;::::0;::::3;13750:21:1::0;13807:2;13787:18;;;13780:30;13846:32;13826:18;;;13819:60;13896:18;;90112:140:0::3;13566:354:1::0;90112:140:0::3;90267:49;90297:5;90305:2;90309:6;90267:22;:49::i;:::-;90363:6;90359:2;-1:-1:-1::0;;;;;90343:27:0::3;90352:5;-1:-1:-1::0;;;;;90343:27:0::3;;;;;;;;;;;84389:1:::2;69206::::1;89725:653:::0;;;;:::o;85502:184::-;-1:-1:-1;;;;;85645:17:0;;85613:7;85645:17;;;:8;:17;;;;;:26;;:33;;85672:5;;85645:33;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;85645:33:0;;85502:184;-1:-1:-1;;;85502:184:0:o;71727:188::-;71355:7;71387:12;;;:6;:12;;;;;:22;;;69179:16;69190:4;69179:10;:16::i;:::-;71882:25:::1;71893:4;71899:7;71882:10;:25::i;:::-;71727:188:::0;;;:::o;88088:176::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88222:34:::1;88248:7;;88222:25;:34::i;84730:272::-:0;84845:7;84874:17;84870:124;;;84900:29;:36;;84930:5;;84900:36;;;;;;:::i;:::-;;;;;;;;;84893:43;;;;84870:124;84959:28;:35;;84988:5;;84959:35;;;;;;:::i;72953:287::-;-1:-1:-1;;;;;73095:23:0;;64261:10;73095:23;73073:120;;;;-1:-1:-1;;;73073:120:0;;14259:2:1;73073:120:0;;;14241:21:1;14298:2;14278:18;;;14271:30;14337:34;14317:18;;;14310:62;-1:-1:-1;;;14388:18:1;;;14381:45;14443:19;;73073:120:0;14057:411:1;73073:120:0;73206:26;73218:4;73224:7;73206:11;:26::i;:::-;72953:287;;:::o;78464:104::-;78514:7;78541:19;:10;:17;:19::i;:::-;78534:26;;78464:104;:::o;87820:86::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;87888:10:::1;:8;:10::i;:::-;87820:86:::0;:::o;89089:225::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;89256:50:::1;89268:8;89278:13;89293:12;89256:11;:50::i;:::-;89089:225:::0;;;;:::o;87914:166::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88043:29:::1;88064:7;;88043:20;:29::i;93777:1112::-:0;65509:19;:17;:19::i;:::-;94117:11;-1:-1:-1;;;;;86302:19:0;;;:23;86457:54:::1;;;::::0;-1:-1:-1;;;86457:54:0;;14675:2:1;86457:54:0::1;::::0;::::1;14657:21:1::0;14714:2;14694:18;;;14687:30;-1:-1:-1;;;14733:18:1;;;14726:51;14794:18;;86457:54:0::1;14473:345:1::0;86457:54:0::1;94158:11:::2;78387:22;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::2;;;;;;;:::i;:::-;94187:16:::3;94206:11;:21;94218:8;94206:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;94187:40;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;94255:10;;94246:5;:19;;94238:43;;;::::0;-1:-1:-1;;;94238:43:0;;15376:2:1;94238:43:0::3;::::0;::::3;15358:21:1::0;15415:2;15395:18;;;15388:30;-1:-1:-1;;;15434:18:1;;;15427:41;15485:18;;94238:43:0::3;15174:335:1::0;94238:43:0::3;94292:24;;:::i;:::-;94346:3;::::0;94339:36:::3;::::0;-1:-1:-1;;;94339:36:0;;94369:4:::3;94339:36;::::0;::::3;1441:51:1::0;-1:-1:-1;;;;;94346:3:0;;::::3;::::0;94339:21:::3;::::0;1414:18:1;;94339:36:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;94327:48:::0;;94393:3:::3;::::0;94386:64:::3;::::0;-1:-1:-1;;;;;94393:3:0::3;94415:11:::0;94436:4:::3;94443:6:::0;94386:28:::3;:64::i;:::-;94493:8;::::0;94468:3:::3;::::0;94461:50:::3;::::0;-1:-1:-1;;;;;94468:3:0;;::::3;::::0;94493:8:::3;94504:6:::0;94461:23:::3;:50::i;:::-;94522:8;::::0;94544:3:::3;::::0;;94522:70:::3;::::0;-1:-1:-1;;;94522:70:0;;-1:-1:-1;;;;;94544:3:0;;::::3;94522:70:::0;;::::3;15825:51:1::0;;;;15892:18;;;15885:34;;;15935:18;;;15928:34;;;15978:18;;;15971:34;;;16054:4;16042:17;;16021:19;;;16014:46;16076:19;;;16069:35;;;16120:19;;;16113:35;;;94522:8:0;;::::3;::::0;:13:::3;::::0;15797:19:1;;94522:70:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;94654:6;94661:1;94654:9;;;;;;;:::i;:::-;;;;::::0;94622:3:::3;::::0;94615:36:::3;::::0;-1:-1:-1;;;94615:36:0;;94645:4:::3;94615:36;::::0;::::3;1441:51:1::0;-1:-1:-1;;;;;94622:3:0;;::::3;::::0;94615:21:::3;::::0;1414:18:1;;94615:36:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;94603:9;::::0;::::3;:60:::0;;;94709:18;;-1:-1:-1;94696:31:0;::::3;::::0;:57:::3;;-1:-1:-1::0;94731:18:0;;:22;;94696:57:::3;94674:126;;;::::0;-1:-1:-1;;;94674:126:0;;16626:2:1;94674:126:0::3;::::0;::::3;16608:21:1::0;16665:2;16645:18;;;16638:30;-1:-1:-1;;;16684:18:1;;;16677:49;16743:18;;94674:126:0::3;16424:343:1::0;94674:126:0::3;94811:70;94825:11:::0;94838:5;94845:8;94855:6;94862:1:::3;94855:9;;;;94866:7;94875:5;94811:13;:70::i;:::-;94176:713;;86522:1:::2;65539::::1;93777:1112:::0;;;;;;;;;;:::o;94897:366::-;65509:19;:17;:19::i;:::-;95119:11;-1:-1:-1;;;;;86302:19:0;;;:23;86457:54:::1;;;::::0;-1:-1:-1;;;86457:54:0;;14675:2:1;86457:54:0::1;::::0;::::1;14657:21:1::0;14714:2;14694:18;;;14687:30;-1:-1:-1;;;14733:18:1;;;14726:51;14794:18;;86457:54:0::1;14473:345:1::0;86457:54:0::1;95160:11:::2;78387:22;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::2;;;;;;;:::i;:::-;95189:66:::3;95203:11;95216:5;95223:8;95233:6;95241:7;95250:4;95189:13;:66::i;:::-;86522:1:::2;65539::::1;94897:366:::0;;;;;:::o;98793:1220::-;65509:19;:17;:19::i;:::-;99008:11:::1;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::1;;;;;;;:::i;:::-;99046:6:::2;84596:15;84583:9;:28;;84575:49;;;;-1:-1:-1::0;;;84575:49:0::2;;;;;;;:::i;:::-;64261:10:::0;78387:22:::3;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::3;;;;;;;:::i;:::-;64261:10:::0;99112:17:::4;99183:19:::0;;;:8:::4;:19;::::0;;;;;;;:68;;;:32:::4;;:68:::0;;;;;99270:12:::4;::::0;::::4;::::0;::::4;::::0;::::4;;;99262:42;;;::::0;-1:-1:-1;;;99262:42:0;;17310:2:1;99262:42:0::4;::::0;::::4;17292:21:1::0;17349:2;17329:18;;;17322:30;-1:-1:-1;;;17368:18:1;;;17361:47;17425:18;;99262:42:0::4;17108:341:1::0;99262:42:0::4;99343:11;99323:4;:16;;;:31;;99315:61;;;::::0;-1:-1:-1;;;99315:61:0;;17656:2:1;99315:61:0::4;::::0;::::4;17638:21:1::0;17695:2;17675:18;;;17668:30;-1:-1:-1;;;17714:18:1;;;17707:47;17771:18;;99315:61:0::4;17454:341:1::0;99315:61:0::4;99389:185;99422:10;99447:9;99471:11;99497:6;99518:21;99554:9;;99389:18;:185::i;:::-;-1:-1:-1::0;;;;;99587:39:0;::::4;:28;:39:::0;;;:28;::::4;:39:::0;:28;:39;;:41;;;::::4;::::0;::::4;:::i;:::-;;;;;;99659:11;99639:4;:16;;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;99727:3:0::4;::::0;99720:36:::4;::::0;-1:-1:-1;;;99720:36:0;;99750:4:::4;99720:36;::::0;::::4;1441:51:1::0;-1:-1:-1;;;;;99727:3:0;;::::4;::::0;99720:21:::4;::::0;1414:18:1;;99720:36:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99705:11;:51;;99683:113;;;::::0;-1:-1:-1;;;99683:113:0;;18142:2:1;99683:113:0::4;::::0;::::4;18124:21:1::0;18181:2;18161:18;;;18154:30;-1:-1:-1;;;18200:18:1;;;18193:42;18252:18;;99683:113:0::4;17940:336:1::0;99683:113:0::4;99814:3;::::0;99807:48:::4;::::0;-1:-1:-1;;;;;99814:3:0::4;99832:9:::0;99843:11;99807:24:::4;:48::i;:::-;99953:11;99928:10;99904:9;-1:-1:-1::0;;;;;99873:132:0::4;;99979:15;99873:132;;;;643:25:1::0;;631:2;616:18;;497:177;99873:132:0::4;;;;;;;;99101:912;;84635:1:::3;84503::::2;65539::::1;98793:1220:::0;;;;;:::o;97218:1567::-;65509:19;:17;:19::i;:::-;64261:10;78387:22:::1;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::1;;;;;;;:::i;:::-;97468:6:::2;84596:15;84583:9;:28;;84575:49;;;;-1:-1:-1::0;;;84575:49:0::2;;;;;;;:::i;:::-;97498:6:::3;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::3;;;;;;;:::i;:::-;64261:10:::0;97522:17:::4;97593:19:::0;;;:8:::4;:19;::::0;;;;;;;:68;;;:32:::4;;:68:::0;;;;;97680:17:::4;::::0;::::4;::::0;97672:50:::4;;;::::0;-1:-1:-1;;;97672:50:0;;18483:2:1;97672:50:0::4;::::0;::::4;18465:21:1::0;18522:2;18502:18;;;18495:30;-1:-1:-1;;;18541:18:1;;;18534:46;18597:18;;97672:50:0::4;18281:340:1::0;97672:50:0::4;97742:21;::::0;::::4;::::0;::::4;;97741:22;97733:44;;;::::0;-1:-1:-1;;;97733:44:0;;18828:2:1;97733:44:0::4;::::0;::::4;18810:21:1::0;18867:1;18847:18;;;18840:29;-1:-1:-1;;;18885:18:1;;;18878:39;18934:18;;97733:44:0::4;18626:332:1::0;97733:44:0::4;97790:175;97823:10;97848:9;97872:6;97893;97914:16;97945:9;;97790:18;:175::i;:::-;-1:-1:-1::0;;;;;97978:34:0;::::4;:23;:34:::0;;;:23;::::4;:34:::0;:23;:34;;:36;;;::::4;::::0;::::4;:::i;:::-;;;;;;98025:17;81477:6;98055:3;;98046:6;:12;;;;:::i;:::-;98045:24;;;;:::i;:::-;98025:44:::0;-1:-1:-1;98080:20:0::4;98103:18;98025:44:::0;98103:6;:18:::4;:::i;:::-;98080:41:::0;-1:-1:-1;98136:13:0;;98132:227:::4;;98212:3;::::0;98205:36:::4;::::0;-1:-1:-1;;;98205:36:0;;98235:4:::4;98205:36;::::0;::::4;1441:51:1::0;-1:-1:-1;;;;;98212:3:0;;::::4;::::0;98205:21:::4;::::0;1414:18:1;;98205:36:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98192:9;:49;;98166:121;;;::::0;-1:-1:-1;;;98166:121:0;;19560:2:1;98166:121:0::4;::::0;::::4;19542:21:1::0;19599:2;19579:18;;;19572:30;-1:-1:-1;;;19618:18:1;;;19611:40;19668:18;;98166:121:0::4;19358:334:1::0;98166:121:0::4;98327:8;::::0;98309:3:::4;::::0;98302:45:::4;::::0;-1:-1:-1;;;;;98309:3:0;;::::4;::::0;98327:8:::4;98337:9:::0;98302:24:::4;:45::i;:::-;98414:3;::::0;98407:36:::4;::::0;-1:-1:-1;;;98407:36:0;;98437:4:::4;98407:36;::::0;::::4;1441:51:1::0;-1:-1:-1;;;;;98414:3:0;;::::4;::::0;98407:21:::4;::::0;1414:18:1;;98407:36:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;98391:12;:52;;98369:112;;;::::0;-1:-1:-1;;;98369:112:0;;19899:2:1;98369:112:0::4;::::0;::::4;19881:21:1::0;19938:2;19918:18;;;19911:30;-1:-1:-1;;;19957:18:1;;;19950:40;20007:18;;98369:112:0::4;19697:334:1::0;98369:112:0::4;-1:-1:-1::0;;;;;98492:24:0;::::4;;::::0;;;:13:::4;:24;::::0;;;;98517:13;;98535:12;;98492:24;98517:13:::4;;98492:39;::::0;::::4;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;98565:3:0::4;::::0;98558:49:::4;::::0;-1:-1:-1;;;;;98565:3:0::4;98583:9:::0;98594:12;98558:24:::4;:49::i;:::-;98625:152;::::0;;-1:-1:-1;;;;;20386:32:1;;20368:51;;20450:2;20435:18;;20428:34;;;98751:15:0::4;20478:18:1::0;;;20471:34;98625:152:0;;98724:12;;98700:9;;98625:152:::4;::::0;;;;20356:2:1;98625:152:0;;::::4;97511:1274;;;;84635:1:::3;78447::::2;65539::::1;97218:1567:::0;;;;;:::o;88661:153::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88778:28:::1;88794:11;88778:15;:28::i;87730:82::-:0;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;87796:8:::1;:6;:8::i;89322:220::-:0;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;89478:56:::1;89507:8;89517:16;89478:28;:56::i;76568:203::-:0;76703:7;76735:18;;;:12;:18;;;;;:28;;76757:5;76735:21;:28::i;:::-;76728:35;76568:203;-1:-1:-1;;;76568:203:0:o;88969:112::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;89054:19:::1;89065:7;89054:10;:19::i;69659:197::-:0;69790:4;69819:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;69819:29:0;;;;;;;;;;;;;;;69659:197::o;88541:112::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88626:19:::1;88637:7;88626:10;:19::i;78703:112::-:0;78752:16;78788:19;:10;:17;:19::i;88392:141::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88503:22:::1;88517:7;88503:13;:22::i;85876:204::-:0;85986:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85986:19:0;-1:-1:-1;;;;;86030:17:0;;;;;;:8;:17;;;;;;;;:42;;;:30;;:42;;;;;;;86023:49;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85876:204;-1:-1:-1;;;85876:204:0:o;101142:703::-;65509:19;:17;:19::i;:::-;101337:2;-1:-1:-1;;;;;84337:21:0;::::1;84329:49;;;;-1:-1:-1::0;;;84329:49:0::1;;;;;;;:::i;:::-;101369:2:::2;78387:22;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::2;;;;;;;:::i;:::-;101395:6:::3;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::3;;;;;;;:::i;:::-;101428:6:::4;84596:15;84583:9;:28;;84575:49;;;;-1:-1:-1::0;;;84575:49:0::4;;;;;;;:::i;:::-;64261:10:::0;78387:22:::5;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::5;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;101502:12:0;::::6;;::::0;;;:8:::6;:12;::::0;;;;:20;::::6;;101494:42;;;::::0;-1:-1:-1;;;101494:42:0;;20718:2:1;101494:42:0::6;::::0;::::6;20700:21:1::0;20757:1;20737:18;;;20730:29;-1:-1:-1;;;20775:18:1;;;20768:39;20824:18;;101494:42:0::6;20516:332:1::0;101494:42:0::6;101547:67;101566:1;101569:2;101573:6;101581;101589:13;101604:9;;101547:18;:67::i;:::-;-1:-1:-1::0;;;;;101625:24:0;::::6;:20;:24:::0;;;:20;::::6;:24:::0;:20;:24;;:26;;;::::6;::::0;::::6;:::i;:::-;::::0;;;-1:-1:-1;;101687:3:0::6;::::0;101680:36:::6;::::0;-1:-1:-1;;;101680:36:0;;101710:4:::6;101680:36;::::0;::::6;1441:51:1::0;-1:-1:-1;;;;;101687:3:0;;::::6;::::0;101680:21:::6;::::0;1414:18:1;;101680:36:0::6;;;;;;;;;;;;;;;;;::::0;::::6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101670:6;:46;;101662:67;;;::::0;-1:-1:-1;;;101662:67:0;;21055:2:1;101662:67:0::6;::::0;::::6;21037:21:1::0;21094:1;21074:18;;;21067:29;-1:-1:-1;;;21112:18:1;;;21105:38;21160:18;;101662:67:0::6;20853:331:1::0;101662:67:0::6;101747:3;::::0;101740:36:::6;::::0;-1:-1:-1;;;;;101747:3:0::6;101765:2:::0;101769:6;101740:24:::6;:36::i;:::-;101804:3;::::0;101792:45:::6;::::0;101821:15:::6;643:25:1::0;;101813:6:0;;-1:-1:-1;;;;;101792:45:0;;::::6;::::0;101804:3;::::6;::::0;101792:45:::6;::::0;631:2:1;616:18;101792:45:0::6;497:177:1::0;88822:139:0;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88932:21:::1;88944:8;88932:11;:21::i;86539:537::-:0;86718:7;86825:10;86858:7;86888:11;86922:6;86951:5;:11;86957:4;86951:11;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;86951:11:0;;;-1:-1:-1;;;;;86951:20:0;;;;;;;;;;86786:267;;;;;;;;86994:4;;87029;;86786:267;;:::i;:::-;;;;;;;;;;;;;86758:310;;;;;;86738:330;;86539:537;;;;;;;:::o;89550:167::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;89674:35:::1;89690:18;89674:15;:35::i;76945:192::-:0;77070:7;77102:18;;;:12;:18;;;;;:27;;:25;:27::i;78576:119::-;78640:7;78667:20;:10;78681:5;78667:13;:20::i;88272:112::-;68733:4;69179:16;68733:4;69179:10;:16::i;:::-;88357:19:::1;88368:7;88357:10;:19::i;72208:190::-:0;71355:7;71387:12;;;:6;:12;;;;;:22;;;69179:16;69190:4;69179:10;:16::i;:::-;72364:26:::1;72376:4;72382:7;72364:11;:26::i;100021:1113::-:0;65509:19;:17;:19::i;:::-;100205:6:::1;84596:15;84583:9;:28;;84575:49;;;;-1:-1:-1::0;;;84575:49:0::1;;;;;;;:::i;:::-;64261:10:::0;78387:22:::2;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::2;;;;;;;:::i;:::-;64261:10:::0;100271:17:::3;100342:19:::0;;;:8:::3;:19;::::0;;;;;;;:68;;;:32:::3;;:68:::0;;;;;100430:21:::3;::::0;::::3;::::0;::::3;;100429:22;100421:44;;;::::0;-1:-1:-1;;;100421:44:0;;18828:2:1;100421:44:0::3;::::0;::::3;18810:21:1::0;18867:1;18847:18;;;18840:29;-1:-1:-1;;;18885:18:1;;;18878:39;18934:18;;100421:44:0::3;18626:332:1::0;100421:44:0::3;100503:4;:15;;;100484;:34;;100476:61;;;::::0;-1:-1:-1;;;100476:61:0;;22131:2:1;100476:61:0::3;::::0;::::3;22113:21:1::0;22170:2;22150:18;;;22143:30;-1:-1:-1;;;22189:18:1;;;22182:44;22243:18;;100476:61:0::3;21929:338:1::0;100476:61:0::3;100550:171;100583:10;100608:9;100632:1;100648:6;100669:17;100701:9;;100550:18;:171::i;:::-;-1:-1:-1::0;;;;;100734:35:0;::::3;:24;:35:::0;;;:24;::::3;:35:::0;:24;:35;;:37;;;::::3;::::0;::::3;:::i;:::-;::::0;;;-1:-1:-1;;100782:21:0::3;::::0;;::::3;:28:::0;;-1:-1:-1;;100782:28:0::3;100806:4;100782:28:::0;;::::3;::::0;;;100844:17;::::3;::::0;100919:3:::3;::::0;100912:36:::3;::::0;-1:-1:-1;;;100912:36:0;;100942:4:::3;100912:36:::0;;::::3;1441:51:1::0;;;;100844:17:0;;-1:-1:-1;;;;;100919:3:0;;::::3;::::0;100912:21:::3;::::0;1414:18:1;;100912:36:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100896:12;:52;;100874:110;;;::::0;-1:-1:-1;;;100874:110:0;;22474:2:1;100874:110:0::3;::::0;::::3;22456:21:1::0;22513:1;22493:18;;;22486:29;-1:-1:-1;;;22531:18:1;;;22524:38;22579:18;;100874:110:0::3;22272:331:1::0;100874:110:0::3;101002:3;::::0;100995:49:::3;::::0;-1:-1:-1;;;;;101002:3:0::3;101020:9:::0;101031:12;100995:24:::3;:49::i;:::-;101096:12;101084:10;101073:9;-1:-1:-1::0;;;;;101060:66:0::3;;101110:15;101060:66;;;;643:25:1::0;;631:2;616:18;;497:177;101060:66:0::3;;;;;;;;100260:874;;;84635:1:::2;65539::::1;100021:1113:::0;;;;:::o;78823:121::-;78884:4;78908:28;:10;78928:7;78908:19;:28::i;85155:166::-;-1:-1:-1;;;;;85284:17:0;;;;;;:8;:17;;;;;;;;;:29;;85277:36;;;;;;;;;;;;;;;;;85243:16;;85277:36;;;85284:29;85277:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;85277:36:0;;;;;;;;;;;;;;;;;;;;;;85155:166;;;:::o;101853:827::-;65509:19;:17;:19::i;:::-;102059:2;-1:-1:-1;;;;;84337:21:0;::::1;84329:49;;;;-1:-1:-1::0;;;84329:49:0::1;;;;;;;:::i;:::-;102091:2:::2;78387:22;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::2;;;;;;;:::i;:::-;102117:6:::3;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::3;;;;;;;:::i;:::-;102150:6:::4;84596:15;84583:9;:28;;84575:49;;;;-1:-1:-1::0;;;84575:49:0::4;;;;;;;:::i;:::-;64261:10:::0;78387:22:::5;78401:7;78387:13;:22::i;:::-;78386:23;78378:58;;;;-1:-1:-1::0;;;78378:58:0::5;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;102224:12:0;::::6;;::::0;;;:8:::6;:12;::::0;;;;:20;::::6;;102216:43;;;::::0;-1:-1:-1;;;102216:43:0;;22810:2:1;102216:43:0::6;::::0;::::6;22792:21:1::0;22849:2;22829:18;;;22822:30;-1:-1:-1;;;22868:18:1;;;22861:40;22918:18;;102216:43:0::6;22608:334:1::0;102216:43:0::6;102270:167;102303:1;102319:2;102336:6;102357;102378:24;102417:9;;102270:18;:167::i;:::-;-1:-1:-1::0;;;;;102448:35:0;::::6;:31;:35:::0;;;:31;::::6;:35:::0;:31;:35;;:37;;;::::6;::::0;::::6;:::i;:::-;::::0;;;-1:-1:-1;;102521:3:0::6;::::0;102514:36:::6;::::0;-1:-1:-1;;;102514:36:0;;102544:4:::6;102514:36;::::0;::::6;1441:51:1::0;-1:-1:-1;;;;;102521:3:0;;::::6;::::0;102514:21:::6;::::0;1414:18:1;;102514:36:0::6;;;;;;;;;;;;;;;;;::::0;::::6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102504:6;:46;;102496:68;;;::::0;-1:-1:-1;;;102496:68:0;;23149:2:1;102496:68:0::6;::::0;::::6;23131:21:1::0;23188:1;23168:18;;;23161:29;-1:-1:-1;;;23206:18:1;;;23199:39;23255:18;;102496:68:0::6;22947:332:1::0;102688:366:0;65509:19;:17;:19::i;:::-;81297:27:::1;69179:16;69190:4;69179:10;:16::i;:::-;102837:6:::2;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::2;;;;;;;:::i;:::-;102861:65:::3;64261:10:::0;102868:3:::3;::::0;-1:-1:-1;;;;;102868:3:0::3;::::0;102912:4:::3;102919:6:::0;102861:28:::3;:65::i;:::-;64261:10:::0;102937:22:::3;::::0;;;:8:::3;:22;::::0;;;;102973:6;;102960:8;102937:32:::3;::::0;::::3;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;103030:15:0::3;::::0;-1:-1:-1;103022:6:0;102995:51:::3;103011:8:::0;103003:17:::3;::::0;::::3;;;;;;:::i;:::-;102995:51;::::0;643:25:1;;;631:2;616:18;102995:51:0::3;;;;;;;69206:1:::2;65539::::1;102688:366:::0;;:::o;69287:280::-;69417:4;-1:-1:-1;;;;;;69459:47:0;;-1:-1:-1;;;69459:47:0;;:100;;-1:-1:-1;;;;;;;;;;63586:40:0;;;69523:36;63427:207;70160:105;70227:30;70238:4;64261:10;70227;:30::i;25865:391::-;25994:6;25969:21;:31;;25947:110;;;;-1:-1:-1;;;25947:110:0;;23486:2:1;25947:110:0;;;23468:21:1;23525:2;23505:18;;;23498:30;23564:31;23544:18;;;23537:59;23613:18;;25947:110:0;23284:353:1;25947:110:0;26071:12;26089:9;-1:-1:-1;;;;;26089:14:0;26111:6;26089:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26070:52;;;26155:7;26133:115;;;;-1:-1:-1;;;26133:115:0;;24054:2:1;26133:115:0;;;24036:21:1;24093:2;24073:18;;;24066:30;24132:34;24112:18;;;24105:62;24203:28;24183:18;;;24176:56;24249:19;;26133:115:0;23852:422:1;34199:248:0;34370:58;;-1:-1:-1;;;;;24471:32:1;;34370:58:0;;;24453:51:1;24520:18;;;24513:34;;;34316:123:0;;34350:5;;-1:-1:-1;;;34393:23:0;24426:18:1;;34370:58:0;;;;-1:-1:-1;;34370:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34370:58:0;-1:-1:-1;;;;;;34370:58:0;;;;;;;;;;34316:19;:123::i;77230:201::-;77350:31;77367:4;77373:7;77350:16;:31::i;:::-;77392:18;;;;:12;:18;;;;;:31;;77415:7;77392:22;:31::i;79895:305::-;79995:7;79978:14;80028:11;;;80020:70;;;;-1:-1:-1;;;80020:70:0;;24760:2:1;80020:70:0;;;24742:21:1;24799:2;24779:18;;;24772:30;24838:34;24818:18;;;24811:62;-1:-1:-1;;;24889:18:1;;;24882:44;24943:19;;80020:70:0;24558:410:1;80020:70:0;80106:9;80101:92;80121:6;80117:1;:10;80101:92;;;80149:32;80170:7;;80178:1;80170:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;80149:20;:32::i;:::-;80129:3;;;;:::i;:::-;;;;80101:92;;77525:206;77646:32;77664:4;77670:7;77646:17;:32::i;:::-;77689:18;;;;:12;:18;;;;;:34;;77715:7;77689:25;:34::i;19374:117::-;19437:7;19464:19;19472:3;14422:18;;14339:109;66759:120;65768:16;:14;:16::i;:::-;66818:7:::1;:15:::0;;-1:-1:-1;;66818:15:0::1;::::0;;66849:22:::1;64261:10:::0;66858:12:::1;66849:22;::::0;-1:-1:-1;;;;;1459:32:1;;;1441:51;;1429:2;1414:18;66849:22:0::1;;;;;;;66759:120::o:0;92499:369::-;92646:13;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1;;;84455:37:0;;;;;;;:::i;:::-;92674:18:::1;84472:1;84463:6;:10;84455:37;;;;-1:-1:-1::0;;;84455:37:0::1;;;;;;;:::i;:::-;92705:17:::2;92725:11;:21;92737:8;92725:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;92725:21:0;92757:34;;;92725:21;-1:-1:-1;92822:38:0::2;92842:18:::0;81375:7:::2;92822:38;:::i;:::-;92802:17;::::0;;::::2;:58:::0;-1:-1:-1;;;;;92499:369:0:o;79597:290::-;79692:7;79675:14;79725:11;;;79717:65;;;;-1:-1:-1;;;79717:65:0;;25175:2:1;79717:65:0;;;25157:21:1;25214:2;25194:18;;;25187:30;25253:34;25233:18;;;25226:62;-1:-1:-1;;;25304:18:1;;;25297:39;25353:19;;79717:65:0;24973:405:1;79717:65:0;79798:9;79793:87;79813:6;79809:1;:10;79793:87;;;79841:27;79857:7;;79865:1;79857:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;79841:15;:27::i;:::-;79821:3;;;;:::i;:::-;;;;79793:87;;66063:108;65975:7;;;;66133:9;66125:38;;;;-1:-1:-1;;;66125:38:0;;25585:2:1;66125:38:0;;;25567:21:1;25624:2;25604:18;;;25597:30;-1:-1:-1;;;25643:18:1;;;25636:46;25699:18;;66125:38:0;25383:340:1;66125:38:0;66063:108::o;34455:285::-;34653:68;;-1:-1:-1;;;;;25986:15:1;;;34653:68:0;;;25968:34:1;26038:15;;26018:18;;;26011:43;26070:18;;;26063:34;;;34599:133:0;;34633:5;;-1:-1:-1;;;34676:27:0;25903:18:1;;34653:68:0;25728:375:1;35009:653:0;35373:10;;;35372:62;;-1:-1:-1;35389:39:0;;-1:-1:-1;;;35389:39:0;;35413:4;35389:39;;;26320:34:1;-1:-1:-1;;;;;26390:15:1;;;26370:18;;;26363:43;35389:15:0;;;;;26255:18:1;;35389:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;35372:62;35350:166;;;;-1:-1:-1;;;35350:166:0;;26619:2:1;35350:166:0;;;26601:21:1;26658:2;26638:18;;;26631:30;26697:34;26677:18;;;26670:62;-1:-1:-1;;;26748:18:1;;;26741:52;26810:19;;35350:166:0;26417:418:1;35350:166:0;35581:62;;-1:-1:-1;;;;;24471:32:1;;35581:62:0;;;24453:51:1;24520:18;;;24513:34;;;35527:127:0;;35561:5;;-1:-1:-1;;;35604:22:0;24426:18:1;;35581:62:0;24279:274:1;95271:1939:0;95490:10;;95481:5;:19;;95473:43;;;;-1:-1:-1;;;95473:43:0;;15376:2:1;95473:43:0;;;15358:21:1;15415:2;15395:18;;;15388:30;-1:-1:-1;;;15434:18:1;;;15427:41;15485:18;;95473:43:0;15174:335:1;95473:43:0;95527:16;95546:11;:21;95558:8;95546:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;95527:40;;;;;;;;;;;;;;;;;;;;;;;;;;;95612:4;:18;;;95602:6;:28;;:54;;;;-1:-1:-1;95634:18:0;;:22;;95602:54;95580:123;;;;-1:-1:-1;;;95580:123:0;;16626:2:1;95580:123:0;;;16608:21:1;16665:2;16645:18;;;16638:30;-1:-1:-1;;;16684:18:1;;;16677:49;16743:18;;95580:123:0;16424:343:1;95580:123:0;95720:7;95716:90;;;95749:3;;95742:64;;-1:-1:-1;;;;;95749:3:0;95771:11;95792:4;95799:6;95742:28;:64::i;:::-;-1:-1:-1;;;;;95839:21:0;;;95819:17;95839:21;;;:8;:21;;;;;;;;95903:15;;;:8;:15;;;;;;;;;95894:25;;;;;;;95937:12;;;;95932:276;;95966:14;95985:10;;95983:12;;;;;:::i;:::-;;;;;-1:-1:-1;96010:19:0;;-1:-1:-1;;96010:19:0;96025:4;96010:19;;;;;96044:11;;;:20;;;96079:15;;;:23;;;96010:12;96117:16;;;:8;:16;;;;;;;:30;;-1:-1:-1;;;;;96117:30:0;;-1:-1:-1;;;;;;96117:30:0;;;;;;;;96162:16;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95932:276:0;96245:8;96224:29;;;;;;;;:::i;:::-;:17;:29;:59;;;;-1:-1:-1;;;;;;86172:17:0;;86148:4;86172:17;;;:8;:17;;;;;:30;;;;;96257:26;96224:59;96220:168;;;96300:17;;;:24;;96320:4;-1:-1:-1;;96300:24:0;;;;;;;;96339:19;;;:37;;;;;;;-1:-1:-1;96339:37:0;;;;;;;;;-1:-1:-1;;;;;;96339:37:0;-1:-1:-1;;;;;96339:37:0;;;;;96220:168;96400:19;96422:15;96400:37;;96448:18;96471:4;:13;;;96469:15;;;;;:::i;:::-;;;;;-1:-1:-1;96497:29:0;;;;:17;;;:29;;;;;:49;;96469:15;;-1:-1:-1;96538:8:0;;-1:-1:-1;;96497:49:0;;96538:8;96497:49;;;;;;;;:::i;:::-;;;;;-1:-1:-1;96557:29:0;;;;:17;;;:29;;;;;;;;:42;;;:51;;;96619:40;;:54;;;96767:17;;;96740:44;;96662:11;96740:44;:::i;:::-;96684:29;;;;:17;;;:29;;;;;:40;;;:100;;;;96795:37;;:47;;;;;;;;-1:-1:-1;;96795:47:0;;;;;;;;;;96855:156;;81477:6;96952:21;:31;96974:8;96952:31;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96943:6;:40;;;;:::i;:::-;96942:69;;;;:::i;:::-;96881:29;;;;:17;;;:29;;;;;:41;;:130;96855:156;97137:6;97079:11;-1:-1:-1;;;;;97029:173:0;97049:4;:15;;;97029:173;97113:8;97105:17;;;;;;;;:::i;:::-;97029:173;;;27036:25:1;;;27104:14;;27097:22;27092:2;27077:18;;27070:50;27136:18;;27129:34;;;27024:2;27009:18;97029:173:0;;;;;;;95462:1748;;;;;95271:1939;;;;;;:::o;87084:454::-;87353:142;87485:9;;87353:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87353:101:0;;-1:-1:-1;87353:54:0;;-1:-1:-1;87365:10:0;;-1:-1:-1;87377:7:0;87386:6;87394;87402:4;87353:11;:54::i;:::-;46185:58;;33182:66:1;46185:58:0;;;33170:79:1;33265:12;;;33258:28;;;46016:7:0;;33302:12:1;;46185:58:0;;;;;;;;;;;;46157:101;;;;;;46137:121;;45920:346;;;;87353:101;:131;;:142::i;:::-;87326:6;;-1:-1:-1;;;;;87326:6:0;;;:169;;;87304:226;;;;-1:-1:-1;;;87304:226:0;;27376:2:1;87304:226:0;;;27358:21:1;27415:1;27395:18;;;27388:29;-1:-1:-1;;;27433:18:1;;;27426:37;27480:18;;87304:226:0;27174:330:1;91465:205:0;91553:12;-1:-1:-1;;;;;84337:21:0;;84329:49;;;;-1:-1:-1;;;84329:49:0;;;;;;;:::i;:::-;91605:8:::1;::::0;91588:40:::1;::::0;-1:-1:-1;;;;;91588:40:0;;::::1;::::0;91605:8:::1;::::0;91602:1:::1;::::0;-1:-1:-1;;;;;;;;;;;91588:40:0;91605:8:::1;::::0;91588:40:::1;-1:-1:-1::0;91639:8:0::1;:23:::0;;-1:-1:-1;;;;;;91639:23:0::1;-1:-1:-1::0;;;;;91639:23:0;;;::::1;::::0;;;::::1;::::0;;91465:205::o;66500:118::-;65509:19;:17;:19::i;:::-;66560:7:::1;:14:::0;;-1:-1:-1;;66560:14:0::1;66570:4;66560:14;::::0;;66590:20:::1;66597:12;64261:10:::0;;64181:98;90578:340;90822:16;90776:21;:31;90798:8;90776:31;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90753:8;90711:138;;;;;;;;:::i;:::-;;;;;;;;90894:16;90860:21;:31;90882:8;90860:31;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;90860:31:0;:50;-1:-1:-1;;90578:340:0:o;19845:190::-;19946:7;20002:22;20006:3;20018:5;20002:3;:22::i;90386:184::-;81477:6;90451:7;:18;;90443:46;;;;-1:-1:-1;;;90443:46:0;;27711:2:1;90443:46:0;;;27693:21:1;27750:2;27730:18;;;27723:30;-1:-1:-1;;;27769:18:1;;;27762:45;27824:18;;90443:46:0;27509:339:1;90443:46:0;90525:3;;;90505:33;;90530:7;;90525:3;90505:33;;;;;90549:3;:13;90386:184::o;91093:178::-;91179:7;-1:-1:-1;;;;;86302:19:0;;;84186:64;;;;-1:-1:-1;;;84186:64:0;;28055:2:1;84186:64:0;;;28037:21:1;28094:2;28074:18;;;28067:30;-1:-1:-1;;;28113:18:1;;;28106:54;28177:18;;84186:64:0;27853:348:1;84186:64:0;91226:3:::1;::::0;91209:30:::1;::::0;-1:-1:-1;;;;;91209:30:0;;::::1;::::0;91226:3:::1;::::0;91223:1:::1;::::0;-1:-1:-1;;;;;;;;;;;91209:30:0;91226:3:::1;::::0;91209:30:::1;-1:-1:-1::0;91250:3:0::1;:13:::0;;-1:-1:-1;;;;;;91250:13:0::1;-1:-1:-1::0;;;;;91250:13:0;;;::::1;::::0;;;::::1;::::0;;91093:178::o;20585:342::-;20675:16;20709:22;20734:19;20742:3;20734:7;:19::i;90926:159::-;90992:7;-1:-1:-1;;;;;83999:21:0;;;;;;:53;;-1:-1:-1;;;;;;86302:19:0;;;:23;83999:53;83977:122;;;;-1:-1:-1;;;83977:122:0;;28408:2:1;83977:122:0;;;28390:21:1;28447:2;28427:18;;;28420:30;-1:-1:-1;;;28466:18:1;;;28459:49;28525:18;;83977:122:0;28206:343:1;83977:122:0;91034:6:::1;::::0;91017:33:::1;::::0;-1:-1:-1;;;;;91017:33:0;;::::1;::::0;91034:6:::1;::::0;91031:1:::1;::::0;-1:-1:-1;;;;;;;;;;;91017:33:0;91034:6:::1;::::0;91017:33:::1;-1:-1:-1::0;91061:6:0::1;:16:::0;;-1:-1:-1;;;;;;91061:16:0::1;-1:-1:-1::0;;;;;91061:16:0;;;::::1;::::0;;;::::1;::::0;;90926:159::o;91678:556::-;91740:8;-1:-1:-1;;;;;84337:21:0;;84329:49;;;;-1:-1:-1;;;84329:49:0;;;;;;;:::i;:::-;91782:11;;-1:-1:-1;;;;;91782:11:0;;::::1;91761:18;91827:20:::0;;;:8:::1;91782:11;91827:20:::0;91782:11;91827:20;;;91881:18;;::::1;::::0;;;;91919:15;;91782:11;;91827:20;91919:15:::1;;91918:16;91910:36;;;::::0;-1:-1:-1;;;91910:36:0;;28756:2:1;91910:36:0::1;::::0;::::1;28738:21:1::0;28795:1;28775:18;;;28768:29;-1:-1:-1;;;28813:18:1;;;28806:37;28860:18;;91910:36:0::1;28554:330:1::0;91910:36:0::1;91957:22:::0;;-1:-1:-1;;91957:22:0::1;91975:4;91957:22:::0;;::::1;::::0;;:15:::1;91990:14:::0;;::::1;:18:::0;;;92019::::1;::::0;::::1;:22:::0;92071:16:::1;::::0;;::::1;92052:35:::0;;::::1;::::0;:16;::::1;::::0;92071;92052:35:::1;:::i;:::-;-1:-1:-1::0;92120:19:0::1;::::0;;::::1;92098:41:::0;;::::1;::::0;:19;::::1;::::0;92120;92098:41:::1;:::i;:::-;-1:-1:-1::0;92150:11:0::1;::::0;;;:8:::1;:11;::::0;;:22;;-1:-1:-1;;;;;;92150:22:0::1;-1:-1:-1::0;;;;;92150:22:0;;::::1;::::0;;::::1;::::0;;;:11;92188:38;92150:22;;92188:38;;::::1;::::0;92202:1:::1;::::0;-1:-1:-1;;;;;;;;;;;92188:38:0;92150:11;92188:38:::1;91750:484;;;91678:556:::0;;:::o;92242:249::-;92336:18;-1:-1:-1;;;;;84337:21:0;;84329:49;;;;-1:-1:-1;;;84329:49:0;;;;;;;:::i;:::-;92402:8:::1;::::0;92377:55:::1;::::0;-1:-1:-1;;;;;92377:55:0;;::::1;::::0;92402:8:::1;::::0;92391:1:::1;::::0;-1:-1:-1;;;;;;;;;;;92377:55:0;92402:8:::1;::::0;92377:55:::1;-1:-1:-1::0;92443:8:0::1;:40:::0;;-1:-1:-1;;;;;;92443:40:0::1;-1:-1:-1::0;;;;;92443:40:0;;;::::1;::::0;;;::::1;::::0;;92242:249::o;91279:178::-;91365:7;-1:-1:-1;;;;;86302:19:0;;;84186:64;;;;-1:-1:-1;;;84186:64:0;;28055:2:1;84186:64:0;;;28037:21:1;28094:2;28074:18;;;28067:30;-1:-1:-1;;;28113:18:1;;;28106:54;28177:18;;84186:64:0;27853:348:1;84186:64:0;91412:3:::1;::::0;;91395:30:::1;::::0;-1:-1:-1;;;;;91395:30:0;;::::1;::::0;91412:3;::::1;::::0;;-1:-1:-1;;;;;;;;;;;91395:30:0;91412:3:::1;::::0;91395:30:::1;-1:-1:-1::0;91436:3:0::1;:13:::0;;-1:-1:-1;;;;;;91436:13:0::1;-1:-1:-1::0;;;;;91436:13:0;;;::::1;::::0;;;::::1;::::0;;91279:178::o;19089:199::-;-1:-1:-1;;;;;19255:23:0;;19196:4;14221:19;;;:12;;;:19;;;;;;:24;;19225:55;14092:161;70555:492;70644:22;70652:4;70658:7;70644;:22::i;:::-;70639:401;;70832:28;70852:7;70832:19;:28::i;:::-;70933:38;70961:4;70968:2;70933:19;:38::i;:::-;70737:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70737:257:0;;;;;;;;;;-1:-1:-1;;;70683:345:0;;;;;;;:::i;37697:802::-;38121:23;38147:106;38189:4;38147:106;;;;;;;;;;;;;;;;;38155:5;-1:-1:-1;;;;;38147:27:0;;;:106;;;;;:::i;:::-;38268:17;;38121:132;;-1:-1:-1;38268:21:0;38264:228;;38383:10;38372:30;;;;;;;;;;;;:::i;:::-;38346:134;;;;-1:-1:-1;;;38346:134:0;;30814:2:1;38346:134:0;;;30796:21:1;30853:2;30833:18;;;30826:30;30892:34;30872:18;;;30865:62;-1:-1:-1;;;30943:18:1;;;30936:40;30993:19;;38346:134:0;30612:406:1;74619:238:0;74703:22;74711:4;74717:7;74703;:22::i;:::-;74698:152;;74742:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;74742:29:0;;;;;;;;;:36;;-1:-1:-1;;74742:36:0;74774:4;74742:36;;;74825:12;64261:10;;64181:98;74825:12;-1:-1:-1;;;;;74798:40:0;74816:7;-1:-1:-1;;;;;74798:40:0;74810:4;74798:40;;;;;;;;;;74619:238;;:::o;18471:175::-;18559:4;18588:50;18593:3;-1:-1:-1;;;;;18613:23:0;;18588:4;:50::i;79266:323::-;-1:-1:-1;;;;;79341:21:0;;79333:67;;;;-1:-1:-1;;;79333:67:0;;31225:2:1;79333:67:0;;;31207:21:1;31264:2;31244:18;;;31237:30;31303:34;31283:18;;;31276:62;-1:-1:-1;;;31354:18:1;;;31347:31;31395:19;;79333:67:0;31023:397:1;79333:67:0;79419:22;79433:7;79419:13;:22::i;:::-;79411:71;;;;-1:-1:-1;;;79411:71:0;;31627:2:1;79411:71:0;;;31609:21:1;31666:2;31646:18;;;31639:30;31705:34;31685:18;;;31678:62;-1:-1:-1;;;31756:18:1;;;31749:34;31800:19;;79411:71:0;31425:400:1;79411:71:0;79493:26;:10;79511:7;79493:17;:26::i;:::-;-1:-1:-1;79535:46:0;;79565:15;;-1:-1:-1;;;;;79535:46:0;;;;;;;;79266:323;:::o;75037:239::-;75121:22;75129:4;75135:7;75121;:22::i;:::-;75117:152;;;75192:5;75160:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;75160:29:0;;;;;;;;;;:37;;-1:-1:-1;;75160:37:0;;;75217:40;64261:10;;75160:12;;75217:40;;75192:5;75217:40;75037:239;;:::o;18822:181::-;18913:4;18942:53;18950:3;-1:-1:-1;;;;;18970:23:0;;18942:7;:53::i;66248:108::-;65975:7;;;;66307:41;;;;-1:-1:-1;;;66307:41:0;;32032:2:1;66307:41:0;;;32014:21:1;32071:2;32051:18;;;32044:30;-1:-1:-1;;;32090:18:1;;;32083:50;32150:18;;66307:41:0;31830:344:1;78952:306:0;-1:-1:-1;;;;;79022:21:0;;79014:62;;;;-1:-1:-1;;;79014:62:0;;32381:2:1;79014:62:0;;;32363:21:1;32420:2;32400:18;;;32393:30;32459;32439:18;;;32432:58;32507:18;;79014:62:0;32179:352:1;79014:62:0;79096:22;79110:7;79096:13;:22::i;:::-;79095:23;79087:71;;;;-1:-1:-1;;;79087:71:0;;32738:2:1;79087:71:0;;;32720:21:1;32777:2;32757:18;;;32750:30;32816:34;32796:18;;;32789:62;-1:-1:-1;;;32867:18:1;;;32860:33;32910:19;;79087:71:0;32536:399:1;79087:71:0;79169:23;:10;79184:7;79169:14;:23::i;:::-;-1:-1:-1;79208:42:0;;79234:15;;-1:-1:-1;;;;;79208:42:0;;;;;;;;78952:306;:::o;42116:263::-;42221:7;42247:17;42266:18;42288:27;42299:4;42305:9;42288:10;:27::i;:::-;42246:69;;;;42326:18;42338:5;42326:11;:18::i;:::-;-1:-1:-1;42362:9:0;42116:263;-1:-1:-1;;;42116:263:0:o;14802:152::-;14896:7;14928:3;:11;;14940:5;14928:18;;;;;;;;:::i;:::-;;;;;;;;;14921:25;;14802:152;;;;:::o;15504:111::-;15560:16;15596:3;:11;;15589:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15504:111;;;:::o;62571:151::-;62629:13;62662:52;-1:-1:-1;;;;;62674:22:0;;60694:2;61935:479;62037:13;62068:19;62100:10;62104:6;62100:1;:10;:::i;:::-;:14;;62113:1;62100:14;:::i;:::-;62090:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62090:25:0;;62068:47;;-1:-1:-1;;;62126:6:0;62133:1;62126:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;62126:15:0;;;;;;;;;-1:-1:-1;;;62152:6:0;62159:1;62152:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;62152:15:0;;;;;;;;-1:-1:-1;62183:9:0;62195:10;62199:6;62195:1;:10;:::i;:::-;:14;;62208:1;62195:14;:::i;:::-;62183:26;;62178:131;62215:1;62211;:5;62178:131;;;-1:-1:-1;;;62259:5:0;62267:3;62259:11;62250:21;;;;;;;:::i;:::-;;;;62238:6;62245:1;62238:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;62238:33:0;;;;;;;;-1:-1:-1;62296:1:0;62286:11;;;;;62218:3;;;:::i;:::-;;;62178:131;;;-1:-1:-1;62327:10:0;;62319:55;;;;-1:-1:-1;;;62319:55:0;;33800:2:1;62319:55:0;;;33782:21:1;;;33819:18;;;33812:30;33878:34;33858:18;;;33851:62;33930:18;;62319:55:0;33598:356:1;27554:229:0;27691:12;27723:52;27745:6;27753:4;27759:1;27762:12;27723:21;:52::i;:::-;27716:59;27554:229;-1:-1:-1;;;;27554:229:0:o;11996:414::-;12059:4;14221:19;;;:12;;;:19;;;;;;12076:327;;-1:-1:-1;12119:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;12302:18;;12280:19;;;:12;;;:19;;;;;;:40;;;;12335:11;;12076:327;-1:-1:-1;12386:5:0;12379:12;;12586:1420;12652:4;12791:19;;;:12;;;:19;;;;;;12827:15;;12823:1176;;13202:21;13226:14;13239:1;13226:10;:14;:::i;:::-;13275:18;;13202:38;;-1:-1:-1;13255:17:0;;13275:22;;13296:1;;13275:22;:::i;:::-;13255:42;;13331:13;13318:9;:26;13314:405;;13365:17;13385:3;:11;;13397:9;13385:22;;;;;;;;:::i;:::-;;;;;;;;;13365:42;;13539:9;13510:3;:11;;13522:13;13510:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13624:23;;;:12;;;:23;;;;;:36;;;13314:405;13800:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13895:3;:12;;:19;13908:5;13895:19;;;;;;;;;;;13888:26;;;13938:4;13931:11;;;;;;;12823:1176;13982:5;13975:12;;;;;40535:779;40643:7;40652:12;40686:9;:16;40706:2;40686:22;40682:625;;41030:4;41015:20;;41009:27;41080:4;41065:20;;41059:27;41138:4;41123:20;;41117:27;40725:9;41109:36;41181:25;41192:4;41109:36;41009:27;41059;41181:10;:25::i;:::-;41174:32;;;;;;;;;40682:625;-1:-1:-1;41255:1:0;;-1:-1:-1;41259:35:0;40682:625;40535:779;;;;;:::o;38928:521::-;39006:20;38997:5;:29;;;;;;;;:::i;:::-;;38993:449;;38928:521;:::o;38993:449::-;39104:29;39095:5;:38;;;;;;;;:::i;:::-;;39091:351;;39150:34;;-1:-1:-1;;;39150:34:0;;34293:2:1;39150:34:0;;;34275:21:1;34332:2;34312:18;;;34305:30;34371:26;34351:18;;;34344:54;34415:18;;39150:34:0;34091:348:1;39091:351:0;39215:35;39206:5;:44;;;;;;;;:::i;:::-;;39202:240;;39267:41;;-1:-1:-1;;;39267:41:0;;34646:2:1;39267:41:0;;;34628:21:1;34685:2;34665:18;;;34658:30;34724:33;34704:18;;;34697:61;34775:18;;39267:41:0;34444:355:1;39202:240:0;39339:30;39330:5;:39;;;;;;;;:::i;:::-;;39326:116;;39386:44;;-1:-1:-1;;;39386:44:0;;35006:2:1;39386:44:0;;;34988:21:1;35045:2;35025:18;;;35018:30;35084:34;35064:18;;;35057:62;-1:-1:-1;;;35135:18:1;;;35128:32;35177:19;;39386:44:0;34804:398:1;28770:612:0;28940:12;29012:5;28987:21;:30;;28965:118;;;;-1:-1:-1;;;28965:118:0;;35409:2:1;28965:118:0;;;35391:21:1;35448:2;35428:18;;;35421:30;35487:34;35467:18;;;35460:62;-1:-1:-1;;;35538:18:1;;;35531:36;35584:19;;28965:118:0;35207:402:1;28965:118:0;29095:12;29109:23;29136:6;-1:-1:-1;;;;;29136:11:0;29155:5;29176:4;29136:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29094:97;;;;29222:152;29267:6;29292:7;29318:10;29347:12;29222:26;:152::i;:::-;29202:172;28770:612;-1:-1:-1;;;;;;;28770:612:0:o;43645:1557::-;43776:7;;44737:66;44711:92;;44693:200;;;-1:-1:-1;44846:1:0;;-1:-1:-1;44850:30:0;44830:51;;44693:200;45007:24;;;44990:14;45007:24;;;;;;;;;36133:25:1;;;36206:4;36194:17;;36174:18;;;36167:45;;;;36228:18;;;36221:34;;;36271:18;;;36264:34;;;45007:24:0;;36105:19:1;;45007:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45007:24:0;;-1:-1:-1;;45007:24:0;;;-1:-1:-1;;;;;;;45046:20:0;;45042:103;;45099:1;45103:29;45083:50;;;;;;;45042:103;45165:6;-1:-1:-1;45173:20:0;;-1:-1:-1;43645:1557:0;;;;;;;;:::o;31905:644::-;32090:12;32119:7;32115:427;;;32147:10;:17;32168:1;32147:22;32143:290;;-1:-1:-1;;;;;86302:19:0;;;32357:60;;;;-1:-1:-1;;;32357:60:0;;36511:2:1;32357:60:0;;;36493:21:1;36550:2;36530:18;;;36523:30;36589:31;36569:18;;;36562:59;36638:18;;32357:60:0;36309:353:1;32357:60:0;-1:-1:-1;32454:10:0;32447:17;;32115:427;32497:33;32505:10;32517:12;33275:17;;:21;33271:388;;33507:10;33501:17;33564:15;33551:10;33547:2;33543:19;33536:44;33271:388;33634:12;33627:20;;-1:-1:-1;;;33627:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;679:173;747:20;;-1:-1:-1;;;;;796:31:1;;786:42;;776:70;;842:1;839;832:12;776:70;679:173;;;:::o;857:149::-;931:20;;980:1;970:12;;960:40;;996:1;993;986:12;1011:279;1092:6;1100;1153:2;1141:9;1132:7;1128:23;1124:32;1121:52;;;1169:1;1166;1159:12;1121:52;1192:29;1211:9;1192:29;:::i;:::-;1182:39;;1240:44;1280:2;1269:9;1265:18;1240:44;:::i;:::-;1230:54;;1011:279;;;;;:::o;1503:180::-;1562:6;1615:2;1603:9;1594:7;1590:23;1586:32;1583:52;;;1631:1;1628;1621:12;1583:52;-1:-1:-1;1654:23:1;;1503:180;-1:-1:-1;1503:180:1:o;1870:186::-;1929:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:52;;;1998:1;1995;1988:12;1950:52;2021:29;2040:9;2021:29;:::i;2061:658::-;2232:2;2284:21;;;2354:13;;2257:18;;;2376:22;;;2203:4;;2232:2;2455:15;;;;2429:2;2414:18;;;2203:4;2498:195;2512:6;2509:1;2506:13;2498:195;;;2577:13;;-1:-1:-1;;;;;2573:39:1;2561:52;;2668:15;;;;2633:12;;;;2609:1;2527:9;2498:195;;;-1:-1:-1;2710:3:1;;2061:658;-1:-1:-1;;;;;;2061:658:1:o;2724:328::-;2801:6;2809;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:52;;;2886:1;2883;2876:12;2838:52;2909:29;2928:9;2909:29;:::i;:::-;2899:39;;2957:38;2991:2;2980:9;2976:18;2957:38;:::i;:::-;2947:48;;3042:2;3031:9;3027:18;3014:32;3004:42;;2724:328;;;;;:::o;3057:254::-;3125:6;3133;3186:2;3174:9;3165:7;3161:23;3157:32;3154:52;;;3202:1;3199;3192:12;3154:52;3225:29;3244:9;3225:29;:::i;:::-;3215:39;3301:2;3286:18;;;;3273:32;;-1:-1:-1;;;3057:254:1:o;3316:::-;3384:6;3392;3445:2;3433:9;3424:7;3420:23;3416:32;3413:52;;;3461:1;3458;3451:12;3413:52;3497:9;3484:23;3474:33;;3526:38;3560:2;3549:9;3545:18;3526:38;:::i;3575:615::-;3661:6;3669;3722:2;3710:9;3701:7;3697:23;3693:32;3690:52;;;3738:1;3735;3728:12;3690:52;3778:9;3765:23;3807:18;3848:2;3840:6;3837:14;3834:34;;;3864:1;3861;3854:12;3834:34;3902:6;3891:9;3887:22;3877:32;;3947:7;3940:4;3936:2;3932:13;3928:27;3918:55;;3969:1;3966;3959:12;3918:55;4009:2;3996:16;4035:2;4027:6;4024:14;4021:34;;;4051:1;4048;4041:12;4021:34;4104:7;4099:2;4089:6;4086:1;4082:14;4078:2;4074:23;4070:32;4067:45;4064:65;;;4125:1;4122;4115:12;4064:65;4156:2;4148:11;;;;;4178:6;;-1:-1:-1;3575:615:1;;-1:-1:-1;;;;3575:615:1:o;4195:118::-;4281:5;4274:13;4267:21;4260:5;4257:32;4247:60;;4303:1;4300;4293:12;4318:309;4383:6;4391;4444:2;4432:9;4423:7;4419:23;4415:32;4412:52;;;4460:1;4457;4450:12;4412:52;4499:9;4486:23;4518:28;4540:5;4518:28;:::i;4632:341::-;4722:6;4730;4738;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4830:35;4855:9;4830:35;:::i;:::-;4820:45;4912:2;4897:18;;4884:32;;-1:-1:-1;4963:2:1;4948:18;;;4935:32;;4632:341;-1:-1:-1;;;4632:341:1:o;4978:988::-;5126:6;5134;5142;5150;5158;5166;5174;5182;5190;5198;5251:3;5239:9;5230:7;5226:23;5222:33;5219:53;;;5268:1;5265;5258:12;5219:53;5291:29;5310:9;5291:29;:::i;:::-;5281:39;;5367:2;5356:9;5352:18;5339:32;5329:42;;5390:44;5430:2;5419:9;5415:18;5390:44;:::i;:::-;5380:54;;5481:2;5470:9;5466:18;5453:32;5443:42;;5535:3;5524:9;5520:19;5507:33;5549:28;5571:5;5549:28;:::i;:::-;5596:5;-1:-1:-1;5648:3:1;5633:19;;5620:33;;-1:-1:-1;5700:3:1;5685:19;;5672:33;;-1:-1:-1;5757:3:1;5742:19;;5729:33;5806:4;5793:18;;5781:31;;5771:59;;5826:1;5823;5816:12;5771:59;5849:7;5839:17;;;5903:3;5892:9;5888:19;5875:33;5865:43;;5955:3;5944:9;5940:19;5927:33;5917:43;;4978:988;;;;;;;;;;;;;:::o;5971:546::-;6076:6;6084;6092;6100;6108;6161:3;6149:9;6140:7;6136:23;6132:33;6129:53;;;6178:1;6175;6168:12;6129:53;6201:29;6220:9;6201:29;:::i;:::-;6191:39;;6277:2;6266:9;6262:18;6249:32;6239:42;;6300:44;6340:2;6329:9;6325:18;6300:44;:::i;:::-;6290:54;;6391:2;6380:9;6376:18;6363:32;6353:42;;6445:3;6434:9;6430:19;6417:33;6459:28;6481:5;6459:28;:::i;:::-;6506:5;6496:15;;;5971:546;;;;;;;;:::o;6522:347::-;6573:8;6583:6;6637:3;6630:4;6622:6;6618:17;6614:27;6604:55;;6655:1;6652;6645:12;6604:55;-1:-1:-1;6678:20:1;;6721:18;6710:30;;6707:50;;;6753:1;6750;6743:12;6707:50;6790:4;6782:6;6778:17;6766:29;;6842:3;6835:4;6826:6;6818;6814:19;6810:30;6807:39;6804:59;;;6859:1;6856;6849:12;6874:614;6971:6;6979;6987;6995;7003;7056:3;7044:9;7035:7;7031:23;7027:33;7024:53;;;7073:1;7070;7063:12;7024:53;7109:9;7096:23;7086:33;;7166:2;7155:9;7151:18;7138:32;7128:42;;7217:2;7206:9;7202:18;7189:32;7179:42;;7272:2;7261:9;7257:18;7244:32;7299:18;7291:6;7288:30;7285:50;;;7331:1;7328;7321:12;7285:50;7370:58;7420:7;7411:6;7400:9;7396:22;7370:58;:::i;:::-;6874:614;;;;-1:-1:-1;6874:614:1;;-1:-1:-1;7447:8:1;;7344:84;6874:614;-1:-1:-1;;;6874:614:1:o;7493:145::-;7563:20;;7612:1;7602:12;;7592:40;;7628:1;7625;7618:12;7643:271;7720:6;7728;7781:2;7769:9;7760:7;7756:23;7752:32;7749:52;;;7797:1;7794;7787:12;7749:52;7820:31;7841:9;7820:31;:::i;:::-;7810:41;;7870:38;7904:2;7893:9;7889:18;7870:38;:::i;7919:205::-;7991:6;8044:2;8032:9;8023:7;8019:23;8015:32;8012:52;;;8060:1;8057;8050:12;8012:52;8083:35;8108:9;8083:35;:::i;8382:273::-;8463:6;8471;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8563:35;8588:9;8563:35;:::i;8660:248::-;8728:6;8736;8789:2;8777:9;8768:7;8764:23;8760:32;8757:52;;;8805:1;8802;8795:12;8757:52;-1:-1:-1;;8828:23:1;;;8898:2;8883:18;;;8870:32;;-1:-1:-1;8660:248:1:o;9324:127::-;9385:10;9380:3;9376:20;9373:1;9366:31;9416:4;9413:1;9406:15;9440:4;9437:1;9430:15;9456:728;9673:13;;9650:3;9635:19;;;9712:1;9705:9;;9695:43;;9718:18;;:::i;:::-;9765:2;9754:9;9747:21;;9824:4;9816:6;9812:17;9806:24;9799:4;9788:9;9784:20;9777:54;9887:4;9879:6;9875:17;9869:24;9862:4;9851:9;9847:20;9840:54;9950:4;9942:6;9938:17;9932:24;9925:4;9914:9;9910:20;9903:54;10027:4;10019:6;10015:17;10009:24;10002:32;9995:40;9988:4;9977:9;9973:20;9966:70;10106:4;10098:6;10094:17;10088:24;10081:32;10074:40;10067:4;10056:9;10052:20;10045:70;10171:4;10163:6;10159:17;10153:24;10146:4;10135:9;10131:20;10124:54;9456:728;;;;:::o;10189:620::-;10286:6;10294;10302;10310;10318;10371:3;10359:9;10350:7;10346:23;10342:33;10339:53;;;10388:1;10385;10378:12;10339:53;10411:29;10430:9;10411:29;:::i;:::-;10401:39;;10487:2;10476:9;10472:18;10459:32;10449:42;;10538:2;10527:9;10523:18;10510:32;10500:42;;10593:2;10582:9;10578:18;10565:32;10620:18;10612:6;10609:30;10606:50;;;10652:1;10649;10642:12;10814:477;10918:6;10926;10934;10942;10950;11003:3;10991:9;10982:7;10978:23;10974:33;10971:53;;;11020:1;11017;11010:12;10971:53;11056:9;11043:23;11033:33;;11085:38;11119:2;11108:9;11104:18;11085:38;:::i;:::-;11075:48;;11170:2;11159:9;11155:18;11142:32;11132:42;;11221:2;11210:9;11206:18;11193:32;11183:42;;11244:41;11280:3;11269:9;11265:19;11244:41;:::i;:::-;11234:51;;10814:477;;;;;;;;:::o;11784:545::-;11872:6;11880;11888;11896;11949:2;11937:9;11928:7;11924:23;11920:32;11917:52;;;11965:1;11962;11955:12;11917:52;12001:9;11988:23;11978:33;;12058:2;12047:9;12043:18;12030:32;12020:42;;12113:2;12102:9;12098:18;12085:32;12140:18;12132:6;12129:30;12126:50;;;12172:1;12169;12162:12;12126:50;12211:58;12261:7;12252:6;12241:9;12237:22;12211:58;:::i;:::-;11784:545;;;;-1:-1:-1;12288:8:1;-1:-1:-1;;;;11784:545:1:o;12334:339::-;12536:2;12518:21;;;12575:2;12555:18;;;12548:30;-1:-1:-1;;;12609:2:1;12594:18;;12587:45;12664:2;12649:18;;12334:339::o;12678:338::-;12880:2;12862:21;;;12919:2;12899:18;;;12892:30;-1:-1:-1;;;12953:2:1;12938:18;;12931:44;13007:2;12992:18;;12678:338::o;13377:184::-;13447:6;13500:2;13488:9;13479:7;13475:23;13471:32;13468:52;;;13516:1;13513;13506:12;13468:52;-1:-1:-1;13539:16:1;;13377:184;-1:-1:-1;13377:184:1:o;13925:127::-;13986:10;13981:3;13977:20;13974:1;13967:31;14017:4;14014:1;14007:15;14041:4;14038:1;14031:15;14823:346;15025:2;15007:21;;;15064:2;15044:18;;;15037:30;-1:-1:-1;;;15098:2:1;15083:18;;15076:52;15160:2;15145:18;;14823:346::o;16159:127::-;16220:10;16215:3;16211:20;16208:1;16201:31;16251:4;16248:1;16241:15;16275:4;16272:1;16265:15;16291:128;16358:9;;;16379:11;;;16376:37;;;16393:18;;:::i;16772:331::-;16974:2;16956:21;;;17013:1;16993:18;;;16986:29;-1:-1:-1;;;17046:2:1;17031:18;;17024:38;17094:2;17079:18;;16772:331::o;17800:135::-;17839:3;17860:17;;;17857:43;;17880:18;;:::i;:::-;-1:-1:-1;17927:1:1;17916:13;;17800:135::o;18963:168::-;19036:9;;;19067;;19084:15;;;19078:22;;19064:37;19054:71;;19105:18;;:::i;19136:217::-;19176:1;19202;19192:132;;19246:10;19241:3;19237:20;19234:1;19227:31;19281:4;19278:1;19271:15;19309:4;19306:1;19299:15;19192:132;-1:-1:-1;19338:9:1;;19136:217::o;20036:125::-;20101:9;;;20122:10;;;20119:36;;;20135:18;;:::i;21189:735::-;21505:6;21500:3;21493:19;21475:3;21535:26;21531:31;21613:2;21604:6;21600:2;21596:15;21592:24;21587:2;21582:3;21578:12;21571:46;21647:6;21642:2;21637:3;21633:12;21626:28;21684:6;21679:2;21674:3;21670:12;21663:28;21722:6;21716:3;21711;21707:13;21700:29;21759:1;21751:6;21748:13;21738:47;;21765:18;;:::i;:::-;21820:3;21816:16;;;;21810:3;21801:13;;21794:39;-1:-1:-1;21872:2:1;21868:15;;;;21864:24;;;21858:3;21849:13;;21842:47;21914:3;21905:13;;21189:735;-1:-1:-1;;;;;21189:735:1:o;28889:250::-;28974:1;28984:113;28998:6;28995:1;28992:13;28984:113;;;29074:11;;;29068:18;29055:11;;;29048:39;29020:2;29013:10;28984:113;;;-1:-1:-1;;29131:1:1;29113:16;;29106:27;28889:250::o;29144:812::-;29555:25;29550:3;29543:38;29525:3;29610:6;29604:13;29626:75;29694:6;29689:2;29684:3;29680:12;29673:4;29665:6;29661:17;29626:75;:::i;:::-;-1:-1:-1;;;29760:2:1;29720:16;;;29752:11;;;29745:40;29810:13;;29832:76;29810:13;29894:2;29886:11;;29879:4;29867:17;;29832:76;:::i;:::-;29928:17;29947:2;29924:26;;29144:812;-1:-1:-1;;;;29144:812:1:o;29961:396::-;30110:2;30099:9;30092:21;30073:4;30142:6;30136:13;30185:6;30180:2;30169:9;30165:18;30158:34;30201:79;30273:6;30268:2;30257:9;30253:18;30248:2;30240:6;30236:15;30201:79;:::i;:::-;30341:2;30320:15;-1:-1:-1;;30316:29:1;30301:45;;;;30348:2;30297:54;;29961:396;-1:-1:-1;;29961:396:1:o;30362:245::-;30429:6;30482:2;30470:9;30461:7;30457:23;30453:32;30450:52;;;30498:1;30495;30488:12;30450:52;30530:9;30524:16;30549:28;30571:5;30549:28;:::i;33325:127::-;33386:10;33381:3;33377:20;33374:1;33367:31;33417:4;33414:1;33407:15;33441:4;33438:1;33431:15;33457:136;33496:3;33524:5;33514:39;;33533:18;;:::i;:::-;-1:-1:-1;;;33569:18:1;;33457:136::o;33959:127::-;34020:10;34015:3;34011:20;34008:1;34001:31;34051:4;34048:1;34041:15;34075:4;34072:1;34065:15;35614:287;35743:3;35781:6;35775:13;35797:66;35856:6;35851:3;35844:4;35836:6;35832:17;35797:66;:::i;:::-;35879:16;;;;;35614:287;-1:-1:-1;;35614:287:1:o
Swarm Source
ipfs://6bae00a1d4a7175d992e50d22b7d59e37a1db7e75d68a96702b0916d0fc59f80
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.