Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 47 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Position | 12815927 | 1224 days ago | IN | 0 ETH | 0.00158193 | ||||
Remove Position | 12783209 | 1229 days ago | IN | 0 ETH | 0.00189812 | ||||
Withdraw Accrued... | 12700725 | 1242 days ago | IN | 0 ETH | 0.00144204 | ||||
Remove Position | 12691653 | 1244 days ago | IN | 0 ETH | 0.00064944 | ||||
Add Position | 12642280 | 1251 days ago | IN | 0 ETH | 0.00223705 | ||||
Remove Position | 12642160 | 1251 days ago | IN | 0 ETH | 0.00063264 | ||||
Withdraw Accrued... | 12586393 | 1260 days ago | IN | 0 ETH | 0.00113377 | ||||
Withdraw Accrued... | 12566415 | 1263 days ago | IN | 0 ETH | 0.00210331 | ||||
Remove Position | 12561883 | 1264 days ago | IN | 0 ETH | 0.00196139 | ||||
Withdraw Accrued... | 12485529 | 1276 days ago | IN | 0 ETH | 0.00340131 | ||||
Withdraw Accrued... | 12458315 | 1280 days ago | IN | 0 ETH | 0.00628727 | ||||
Remove Position | 12378284 | 1292 days ago | IN | 0 ETH | 0.00293346 | ||||
Withdraw Accrued... | 12356989 | 1295 days ago | IN | 0 ETH | 0.00329824 | ||||
Withdraw Accrued... | 12352792 | 1296 days ago | IN | 0 ETH | 0.00373884 | ||||
Remove Position | 12328608 | 1300 days ago | IN | 0 ETH | 0.00266906 | ||||
Add Position | 12320834 | 1301 days ago | IN | 0 ETH | 0.00841781 | ||||
Add Position | 12301223 | 1304 days ago | IN | 0 ETH | 0.01263052 | ||||
Add Position | 12280766 | 1307 days ago | IN | 0 ETH | 0.03487554 | ||||
Withdraw Accrued... | 12257793 | 1311 days ago | IN | 0 ETH | 0.01226533 | ||||
Withdraw Accrued... | 12245343 | 1313 days ago | IN | 0 ETH | 0.00752411 | ||||
Withdraw Accrued... | 12234712 | 1314 days ago | IN | 0 ETH | 0.00410058 | ||||
Withdraw Accrued... | 12231098 | 1315 days ago | IN | 0 ETH | 0.00339911 | ||||
Withdraw Accrued... | 12231095 | 1315 days ago | IN | 0 ETH | 0.01135292 | ||||
Add Position | 12158441 | 1326 days ago | IN | 0 ETH | 0.02357741 | ||||
Add Position | 12132644 | 1330 days ago | IN | 0 ETH | 0.02279703 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiquidityMining
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-10 */ // File: contracts/Context.sol pragma solidity ^0.7.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/Ownable.sol pragma solidity ^0.7.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/EnumerableSet.sol pragma solidity ^0.7.0; /** * @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.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ 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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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(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(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(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(uint256(_at(set._inner, index))); } // 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 on 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)); } } // File: contracts/Address.sol pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/AccessControl.sol pragma solidity ^0.7.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * 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 { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @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 returns (uint256) { return _roles[role].members.length(); } /** * @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 returns (address) { return _roles[role].members.at(index); } /** * @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 returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/SafeMath.sol pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/TokenInterface.sol pragma solidity ^0.7.0; interface TokenInterface{ function burnFrom(address _from, uint _amount) external; function mintTo(address _to, uint _amount) external; } // File: contracts/IERC20.sol pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/SafeERC20.sol pragma solidity ^0.7.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/LiquidtyStaking.sol // SPDX-License-Identifier: GPL-3.0 // Author: Matt Hooft // https://github.com/Civitas-Fundamenta // [email protected]) // This is a Liquidty Token Mining Contract that will allow users to deposit or "stake" Liquidty Pool Tokens to // earn rewards in the form of the FMTA Token. It is designed to be highly configureable so it can adapt to market // and ecosystem conditions overtime. Liqudidty pools must be added by the contract owner and only added Tokens // will be eleigible for rewards. The contract also uses Role Based Access Control (RBAC) to allow other accounts // and contracts (such as oracles) to function as `_ADMIN` allowing them to securly interact with the contract // providing possible future extensibility. // Liquidity Providers will earn rewards based on a Daily Percentage Yield (DPY) and will be able to compound thier positions // to increase thier DPY based on a configurable factor (Compunding Daily Percentage Yield or CDPY). Liquidity Providers will // have a choice of three lock periods to choose from all with different DPY and CDPY factors. // For example lets use 7, 14 and 21 days as our choices for lock periods and have our user Stake 1000 LP Tokens: // LP Tokens Staked = 1000 // 7 days = DPY of 10% and CDPY of 0.5%, // 14 days = DPY of 12% and CDPY of 0.75% // 21 days = DPY of 15% and CDPY of 1.15%. // 7 Day Return = 700 FMTA // 14 Day Return = 1680 FMTA // 21 Day Return = 3150 FMTA // DPY after CDPY is applied if users do not remove positions and just remove accrued DPY: // 7 Day DPY = 10.5% // 14 Day DPY = 12.75% // 21 Day DPY = 16.15% pragma solidity ^0.7.0; contract LiquidityMining is Ownable, AccessControl { using SafeMath for uint256; using SafeERC20 for IERC20; TokenInterface private fundamenta; //-------RBAC--------------------------- bytes32 public constant _ADMIN = keccak256("_ADMIN"); bytes32 public constant _REMOVAL = keccak256("_REMOVAL"); bytes32 public constant _MOVE = keccak256("_MOVE"); bytes32 public constant _RESCUE = keccak256("_RESCUE"); //------------Token Vars------------------- bool public paused; bool public addDisabled; bool public removePositionOnly; /** * @dev variables to define three seperate lockPeriod's. * Each period uses different multipliers and basis points * to calculate Liquidity Miners daily yield. */ uint256 private lockPeriod0; uint256 private lockPeriod1; uint256 private lockPeriod2; uint256 private lockPeriod0BasisPoint; uint256 private lockPeriod1BasisPoint; uint256 private lockPeriod2BasisPoint; uint256 private compYield0; uint256 private compYield1; uint256 private compYield2; uint256 private lockPeriodBPScale; uint256 public maxUserBP; uint256 private preYieldDivisor; /** * @dev `periodCalc` uses blocks instead of timestamps * as a way to determine days. approx. 6500 blocks a day * are mined on the ethereum network. * `periodCalc` can also be configured if this were ever * needed to be changed. It also helps to lower it during * testing if you are looking at using any of this code. */ uint256 public periodCalc; //-------Structs/Mappings/Arrays------------- /** * @dev struct to keep track of Liquidity Providers who have * chosen to stake UniswapV2 Liquidity Pool tokens towards * earning FMTA. */ struct LiquidityProviders { address Provider; uint UnlockHeight; uint LockedAmount; uint Days; uint UserBP; uint TotalRewardsPaid; } /** * @dev struct to keep track of liquidty pools, total * rewards paid and total value locked in said pools. */ struct PoolInfo { IERC20 ContractAddress; uint TotalRewardsPaidByPool; uint TotalLPTokensLocked; uint PoolBonus; } /** * @dev PoolInfo is tracked as an array. The length/index * of the array will be used as the variable `_pid` (Pool ID) * throughout the contract. */ PoolInfo[] public poolInfo; /** * @dev mapping to keep track of the struct LiquidityProviders * mapeed to user addresses but also maps it to `uint256 _pid` * this makes tracking the same address across multiple pools * with different positions possible as _pid will also be the * index of PoolInfo[] */ mapping (uint256 => mapping (address => LiquidityProviders)) public provider; /** * @dev constructor sets initial values for contract intiialization */ constructor() { periodCalc = 6500; lockPeriodBPScale = 10000; lockPeriod0BasisPoint = 3200; lockPeriod1BasisPoint = 3800; lockPeriod2BasisPoint = 4500; preYieldDivisor = 2; maxUserBP = 5500; compYield0 = 50; compYield1 = 75; compYield2 = 125; lockPeriod0 = 5; lockPeriod1 = 10; lockPeriod2 = 15; removePositionOnly = false; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); //God Mode. DEFAULT_ADMIN_ROLE Must Require _ADMIN ROLE Sill to execute _ADMIN functions. } //------------State modifiers--------------------- modifier unpaused() { require(!paused, "LiquidityMining: Contract is Paused"); _; } modifier addPositionNotDisabled() { require(!addDisabled, "LiquidityMining: Adding a Position is currently disabled"); _; } modifier remPosOnly() { require(!removePositionOnly, "LiquidityMining: Only Removing a position is allowed at the moment"); _; } //----------Modifier Functions---------------------- function setPaused(bool _paused) external { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); paused = _paused; } function setRemovePosOnly(bool _removeOnly) external { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); removePositionOnly = _removeOnly; } function disableAdd(bool _addDisabled) external { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); addDisabled = _addDisabled; } //------------Token Functions---------------------- /** * @dev functions to add and remove Liquidty Pool pairs to allow users to * stake the pools LP Tokens towards earnign rewards. Can only * be called by accounts with the `_ADMIN` role and should only * be added once. The index at which the pool pair is stored * will determine the pools `_pid`. Note if you remove a pool the * index remians but is just left empty making the _pid return * zero value if called. */ function addLiquidtyPoolToken(IERC20 _lpTokenAddress, uint _bonus) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); poolInfo.push(PoolInfo({ ContractAddress: _lpTokenAddress, TotalRewardsPaidByPool: 0, TotalLPTokensLocked: 0, PoolBonus: _bonus })); } function removeLiquidtyPoolToken(uint256 _pid) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); delete poolInfo[_pid]; } //------------Information Functions------------------ /** * @dev return the length of the pool array */ function poolLength() external view returns (uint256) { return poolInfo.length; } /** * @dev function to return the contracts balances of LP Tokens * staked from different Uniswap pools. */ function contractBalanceByPoolID(uint _pid) public view returns (uint _balance) { PoolInfo memory pool = poolInfo[_pid]; address ca = address(this); return pool.ContractAddress.balanceOf(ca); } /** * @dev funtion that returns a callers staked position in a pool * using `_pid` as an argument. */ function accountPosition(address _account, uint256 _pid) public view returns ( address _accountAddress, uint256 _unlockHeight, uint256 _lockedAmount, uint256 _lockPeriodInDays, uint256 _userDPY, IERC20 _lpTokenAddress, uint256 _totalRewardsPaidFromPool ) { LiquidityProviders memory p = provider[_pid][_account]; PoolInfo memory pool = poolInfo[_pid]; return ( p.Provider, p.UnlockHeight, p.LockedAmount, p.Days, p.UserBP, pool.ContractAddress, pool.TotalRewardsPaidByPool ); } /** * @dev funtion that returns a true or false regarding whether * an account as a position in a pool. Takes the account address * and `_pid` as arguments */ function hasPosition(address _userAddress, uint256 _pid) public view returns (bool _hasPosition) { LiquidityProviders memory p = provider[_pid][_userAddress]; if(p.LockedAmount == 0) return false; else return true; } /** * @dev function to show current lock periods. */ function showCurrentLockPeriods() external view returns ( uint256 _lockPeriod0, uint256 _lockPeriod1, uint256 _lockPeriod2 ) { return ( lockPeriod0, lockPeriod1, lockPeriod2 ); } //-----------Set Functions---------------------- /** * @dev function to set the token that will be minting rewards * for Liquidity Providers. */ function setTokenContract(TokenInterface _fmta) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); fundamenta = _fmta; } /** * @dev allows accounts with the _ADMIN role to set new lock periods. */ function setLockPeriods(uint256 _newPeriod0, uint256 _newPeriod1, uint256 _newPeriod2) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); require(_newPeriod2 > _newPeriod1 && _newPeriod1 > _newPeriod0); lockPeriod0 = _newPeriod0; lockPeriod1 = _newPeriod1; lockPeriod2 = _newPeriod2; } /** * @dev allows contract owner to set a new `periodCalc` */ function setPeriodCalc(uint256 _newPeriodCalc) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); periodCalc = _newPeriodCalc; } /** * @dev set of functions to set parameters regarding * lock periods and basis points which are used to * calculate a users daily yield. Can only be called * by contract _ADMIN. */ function setLockPeriodBasisPoints ( uint256 _newLockPeriod0BasisPoint, uint256 _newLockPeriod1BasisPoint, uint256 _newLockPeriod2BasisPoint) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); lockPeriod0BasisPoint = _newLockPeriod0BasisPoint; lockPeriod1BasisPoint = _newLockPeriod1BasisPoint; lockPeriod2BasisPoint = _newLockPeriod2BasisPoint; } function setLockPeriodBPScale(uint256 _newLockPeriodScale) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); lockPeriodBPScale = _newLockPeriodScale; } function setMaxUserBP(uint256 _newMaxUserBP) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); maxUserBP = _newMaxUserBP; } function setCompoundYield ( uint256 _newCompoundYield0, uint256 _newCompoundYield1, uint256 _newCompoundYield2) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); compYield0 = _newCompoundYield0; compYield1 = _newCompoundYield1; compYield2 = _newCompoundYield2; } function setPoolBonus(uint _pid, uint _bonus) public { require(hasRole(_ADMIN, msg.sender)); PoolInfo storage pool = poolInfo[_pid]; pool.PoolBonus = _bonus; } function setPreYieldDivisor(uint _newDivisor) public { require(hasRole(_ADMIN, msg.sender),"LiquidityMining: Message Sender must be _ADMIN"); preYieldDivisor = _newDivisor; } //-----------Position/Rewards Functions------------------ /** * @dev this function allows a user to add a liquidity Staking * position. The user will need to choose one of the three * configured lock Periods. Users may add to the position * only once per lock period. */ function addPosition(uint256 _lpTokenAmount, uint256 _lockPeriod, uint256 _pid) public addPositionNotDisabled unpaused{ LiquidityProviders storage p = provider[_pid][msg.sender]; PoolInfo storage pool = poolInfo[_pid]; address ca = address(this); require(p.LockedAmount == 0, "LiquidityMining: This account already has a position"); if(_lockPeriod == lockPeriod0) { pool.ContractAddress.safeTransferFrom(msg.sender, ca, _lpTokenAmount); uint _preYield = _lpTokenAmount.mul(lockPeriod0BasisPoint.add(pool.PoolBonus)).div(lockPeriodBPScale).mul(_lockPeriod); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod0)), _lpTokenAmount, lockPeriod0, lockPeriod0BasisPoint, p.TotalRewardsPaid.add(_preYield.div(preYieldDivisor)) ); fundamenta.mintTo(msg.sender, _preYield.div(preYieldDivisor)); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(_preYield.div(preYieldDivisor)); } else if (_lockPeriod == lockPeriod1) { pool.ContractAddress.safeTransferFrom(msg.sender, ca, _lpTokenAmount); uint _preYield = _lpTokenAmount.mul(lockPeriod1BasisPoint.add(pool.PoolBonus)).div(lockPeriodBPScale).mul(_lockPeriod); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod1)), _lpTokenAmount, lockPeriod1, lockPeriod1BasisPoint, p.TotalRewardsPaid.add(_preYield.div(preYieldDivisor)) ); fundamenta.mintTo(msg.sender, _preYield.div(preYieldDivisor)); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(_preYield.div(preYieldDivisor)); } else if (_lockPeriod == lockPeriod2) { pool.ContractAddress.safeTransferFrom(msg.sender, ca, _lpTokenAmount); uint _preYield = _lpTokenAmount.mul(lockPeriod2BasisPoint.add(pool.PoolBonus)).div(lockPeriodBPScale).mul(_lockPeriod); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod2)), _lpTokenAmount, lockPeriod2, lockPeriod2BasisPoint, p.TotalRewardsPaid.add(_preYield.div(preYieldDivisor)) ); fundamenta.mintTo(msg.sender, _preYield.div(preYieldDivisor)); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(_preYield.div(preYieldDivisor)); }else revert("LiquidityMining: Incompatible Lock Period"); } /** * @dev allows a user to remove a liquidity staking position * and will withdraw any pending rewards. User must withdraw * the entire position. */ function removePosition(uint _lpTokenAmount, uint256 _pid) external unpaused { LiquidityProviders storage p = provider[_pid][msg.sender]; PoolInfo storage pool = poolInfo[_pid]; require(_lpTokenAmount == p.LockedAmount, "LiquidyMining: Either you do not have a position or you must remove the entire amount."); require(p.UnlockHeight < block.number, "LiquidityMining: Not Long Enough"); pool.ContractAddress.safeTransfer(msg.sender, _lpTokenAmount); uint yield = calculateUserDailyYield(_pid); fundamenta.mintTo(msg.sender, yield); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, 0, p.LockedAmount.sub(_lpTokenAmount), 0, 0, p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.sub(_lpTokenAmount); } /** * @dev funtion to forcibly remove a users position. This is required due to the fact that * the basis points and scales used to calculate user DPY will be constantly changing. We * will need to forceibly remove positions of lazy (or malicious) users who will try to take * advantage of DPY being lowered instead of raised and maintining thier current return levels. */ function forcePositionRemoval(uint256 _pid, address _account) public { require(hasRole(_REMOVAL, msg.sender)); LiquidityProviders storage p = provider[_pid][_account]; PoolInfo storage pool = poolInfo[_pid]; uint256 _lpTokenAmount = p.LockedAmount; pool.ContractAddress.safeTransfer(_account, _lpTokenAmount); uint256 _newLpTokenAmount = p.LockedAmount.sub(_lpTokenAmount); uint yield = calculateUserDailyYield(_pid); fundamenta.mintTo(msg.sender, yield); provider[_pid][_account] = LiquidityProviders ( _account, 0, _newLpTokenAmount, 0, 0, p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.sub(_lpTokenAmount); } /** * @dev calculates a users daily yield. DY is calculated * using basis points and the lock period as a multiplier. * Basis Points and the scale used are configurble by users * or contracts that have the _ADMIN Role */ function calculateUserDailyYield(uint256 _pid) public view returns (uint256 _dailyYield) { LiquidityProviders memory p = provider[_pid][msg.sender]; PoolInfo memory pool = poolInfo[_pid]; uint256 dailyYield = p.LockedAmount.mul(p.UserBP.add(pool.PoolBonus)).div(lockPeriodBPScale).mul(p.Days); return dailyYield; } /** * @dev allow user to withdraw thier accrued yield. Reset * the lock period to continue liquidity mining and apply * CDPY to DPY. Allow user to add more stake if desired * in the process. Once a user has reached the `maxUserBP` * limit they must withdraw thier position and start another. * This is to avoid infinite inflation. */ function withdrawAccruedYieldAndAdd(uint _pid, uint _lpTokenAmount) public remPosOnly unpaused{ LiquidityProviders storage p = provider[_pid][msg.sender]; PoolInfo storage pool = poolInfo[_pid]; uint yield = calculateUserDailyYield(_pid); require(removePositionOnly == false); require(p.UnlockHeight < block.number); if (_lpTokenAmount != 0) { if(p.Days == lockPeriod0) { fundamenta.mintTo(msg.sender, yield); pool.ContractAddress.safeTransferFrom(msg.sender, address(this), _lpTokenAmount); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod0)), _lpTokenAmount.add(p.LockedAmount), lockPeriod0, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield0), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); } else if (p.Days == lockPeriod1) { fundamenta.mintTo(msg.sender, yield); pool.ContractAddress.safeTransferFrom(msg.sender, address(this), _lpTokenAmount); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod1)), _lpTokenAmount.add(p.LockedAmount), lockPeriod1, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield1), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); } else if (p.Days == lockPeriod2) { fundamenta.mintTo(msg.sender, yield); pool.ContractAddress.safeTransferFrom(msg.sender, address(this), _lpTokenAmount); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod2)), _lpTokenAmount.add(p.LockedAmount), lockPeriod2, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield2), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); pool.TotalLPTokensLocked = pool.TotalLPTokensLocked.add(_lpTokenAmount); } else revert("LiquidityMining: Incompatible Lock Period"); } else if (_lpTokenAmount == 0) { if(p.Days == lockPeriod0) { fundamenta.mintTo(msg.sender, yield); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod0)), p.LockedAmount, lockPeriod0, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield0), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); } else if (p.Days == lockPeriod1) { fundamenta.mintTo(msg.sender, yield); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod1)), p.LockedAmount, lockPeriod1, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield1), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); } else if (p.Days == lockPeriod2) { fundamenta.mintTo(msg.sender, yield); provider[_pid][msg.sender] = LiquidityProviders ( msg.sender, block.number.add(periodCalc.mul(lockPeriod2)), p.LockedAmount, lockPeriod2, p.UserBP.add(p.UserBP >= maxUserBP ? 0 : compYield2), p.TotalRewardsPaid.add(yield) ); pool.TotalRewardsPaidByPool = pool.TotalRewardsPaidByPool.add(yield); }else revert("LiquidityMining: Incompatible Lock Period"); }else revert("LiquidityMining: ?" ); } //-------Movement Functions--------------------- function moveERC20(address _ERC20, address _dest, uint256 _ERC20Amount) public { require(hasRole(_MOVE, msg.sender)); IERC20(_ERC20).safeTransfer(_dest, _ERC20Amount); } function ethRescue(address payable _dest, uint256 _etherAmount) public { require(hasRole(_RESCUE, msg.sender)); _dest.transfer(_etherAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MOVE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_REMOVAL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_RESCUE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"accountPosition","outputs":[{"internalType":"address","name":"_accountAddress","type":"address"},{"internalType":"uint256","name":"_unlockHeight","type":"uint256"},{"internalType":"uint256","name":"_lockedAmount","type":"uint256"},{"internalType":"uint256","name":"_lockPeriodInDays","type":"uint256"},{"internalType":"uint256","name":"_userDPY","type":"uint256"},{"internalType":"contract IERC20","name":"_lpTokenAddress","type":"address"},{"internalType":"uint256","name":"_totalRewardsPaidFromPool","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_lpTokenAddress","type":"address"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"addLiquidtyPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_lockPeriod","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"addPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"calculateUserDailyYield","outputs":[{"internalType":"uint256","name":"_dailyYield","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"contractBalanceByPoolID","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_addDisabled","type":"bool"}],"name":"disableAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_dest","type":"address"},{"internalType":"uint256","name":"_etherAmount","type":"uint256"}],"name":"ethRescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"forcePositionRemoval","outputs":[],"stateMutability":"nonpayable","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":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"hasPosition","outputs":[{"internalType":"bool","name":"_hasPosition","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUserBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"address","name":"_dest","type":"address"},{"internalType":"uint256","name":"_ERC20Amount","type":"uint256"}],"name":"moveERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodCalc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"ContractAddress","type":"address"},{"internalType":"uint256","name":"TotalRewardsPaidByPool","type":"uint256"},{"internalType":"uint256","name":"TotalLPTokensLocked","type":"uint256"},{"internalType":"uint256","name":"PoolBonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"provider","outputs":[{"internalType":"address","name":"Provider","type":"address"},{"internalType":"uint256","name":"UnlockHeight","type":"uint256"},{"internalType":"uint256","name":"LockedAmount","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"UserBP","type":"uint256"},{"internalType":"uint256","name":"TotalRewardsPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"removeLiquidtyPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"removePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removePositionOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCompoundYield0","type":"uint256"},{"internalType":"uint256","name":"_newCompoundYield1","type":"uint256"},{"internalType":"uint256","name":"_newCompoundYield2","type":"uint256"}],"name":"setCompoundYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockPeriodScale","type":"uint256"}],"name":"setLockPeriodBPScale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockPeriod0BasisPoint","type":"uint256"},{"internalType":"uint256","name":"_newLockPeriod1BasisPoint","type":"uint256"},{"internalType":"uint256","name":"_newLockPeriod2BasisPoint","type":"uint256"}],"name":"setLockPeriodBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPeriod0","type":"uint256"},{"internalType":"uint256","name":"_newPeriod1","type":"uint256"},{"internalType":"uint256","name":"_newPeriod2","type":"uint256"}],"name":"setLockPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxUserBP","type":"uint256"}],"name":"setMaxUserBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPeriodCalc","type":"uint256"}],"name":"setPeriodCalc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"setPoolBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDivisor","type":"uint256"}],"name":"setPreYieldDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_removeOnly","type":"bool"}],"name":"setRemovePosOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract TokenInterface","name":"_fmta","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showCurrentLockPeriods","outputs":[{"internalType":"uint256","name":"_lockPeriod0","type":"uint256"},{"internalType":"uint256","name":"_lockPeriod1","type":"uint256"},{"internalType":"uint256","name":"_lockPeriod2","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_lpTokenAmount","type":"uint256"}],"name":"withdrawAccruedYieldAndAdd","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000620000246200016660201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350611964600f81905550612710600c81905550610c80600681905550610ed86007819055506111946008819055506002600e8190555061157c600d819055506032600981905550604b600a81905550607d600b819055506005600381905550600a600481905550600f6005819055506000600260166101000a81548160ff021916908315150217905550620001606000801b336200016e60201b60201c565b620002fd565b600033905090565b6200018082826200018460201b60201c565b5050565b620001b381600160008581526020019081526020016000206000016200022860201b62004bd21790919060201c565b156200022457620001c96200016660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000258836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200026060201b60201c565b905092915050565b6000620002748383620002da60201b60201c565b620002cf578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620002d4565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b615b12806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806364d9d3a711610167578063973d4555116100ce578063a5b0dc5211610087578063a5b0dc5214610c70578063bbcd5bbe14610d0b578063c20d125614610d4f578063ca15c87314610d6d578063d547741f14610daf578063f2fde38b14610dfd576102a0565b8063973d455514610b625780639b46818d14610b82578063a204ccab14610ba0578063a217fddf14610c04578063a308b8f514610c22578063a4a1b5c114610c40576102a0565b80637fdb7774116101205780637fdb7774146109da5780638d580b9f14610a085780638da5cb5b14610a265780639010d07c14610a5a57806391d1485414610abc5780639469ae4f14610b20576102a0565b806364d9d3a7146108ba5780636d7ddc8d146108f2578063715018a614610920578063716064191461092a5780637724336c146109785780637b50bae714610998576102a0565b80632f2ff15d1161020b57806348132f48116101c457806348132f48146107665780634e092a01146107b457806350938af6146107f6578063515572891461082e5780635303a6631461084c5780635c975abb1461089a576102a0565b80632f2ff15d146105d257806336568abe1461062057806337bc03e51461066e578063404e36451461069a57806341f431fd146106ca57806344117db114610738576102a0565b806316c38b3c1161025d57806316c38b3c1461049a5780631facdcec146104ca57806322a0c64e146104f8578063248a9ca31461053a5780632c2076df1461057c5780632ed7643f1461059a576102a0565b8063029c3d4b146102a55780630694eea3146102e7578063081e3eda1461039f5780631134918a146103bd57806312dbd7dc146103ff5780631526fe271461042d575b600080fd5b6102e5600480360360608110156102bb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e41565b005b610333600480360360408110156102fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eda565b604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200197505050505050505060405180910390f35b6103a76110b5565b6040518082815260200191505060405180910390f35b6103e9600480360360208110156103d357600080fd5b81019080803590602001909291905050506110c2565b6040518082815260200191505060405180910390f35b61042b6004803603602081101561041557600080fd5b81019080803590602001909291905050506112bf565b005b6104596004803603602081101561044357600080fd5b8101908080359060200190929190505050611348565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104c8600480360360208110156104b057600080fd5b810190808035151590602001909291905050506113a8565b005b6104f6600480360360208110156104e057600080fd5b8101908080359060200190929190505050611444565b005b6105246004803603602081101561050e57600080fd5b81019080803590602001909291905050506114cd565b6040518082815260200191505060405180910390f35b6105666004803603602081101561055057600080fd5b8101908080359060200190929190505050611627565b6040518082815260200191505060405180910390f35b610584611647565b6040518082815260200191505060405180910390f35b6105d0600480360360408110156105b057600080fd5b81019080803590602001909291908035906020019092919050505061166b565b005b61061e600480360360408110156105e857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa3565b005b61066c6004803603604081101561063657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2d565b005b610676611bc6565b60405180848152602001838152602001828152602001935050505060405180910390f35b6106c8600480360360208110156106b057600080fd5b81019080803515159060200190929190505050611bdf565b005b610736600480360360608110156106e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c7b565b005b6107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611cde565b005b6107b26004803603604081101561077c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dbd565b005b6107f4600480360360608110156107ca57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611e3b565b005b61082c6004803603604081101561080c57600080fd5b810190808035906020019092919080359060200190929190505050611ed4565b005b610836613141565b6040518082815260200191505060405180910390f35b6108986004803603604081101561086257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613165565b005b6108a26132b3565b60405180821515815260200191505060405180910390f35b6108f0600480360360408110156108d057600080fd5b8101908080359060200190929190803590602001909291905050506132c6565b005b61091e6004803603602081101561090857600080fd5b8101908080359060200190929190505050613326565b005b6109286133af565b005b6109766004803603604081101561094057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613535565b005b610980613875565b60405180821515815260200191505060405180910390f35b6109d8600480360360608110156109ae57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613888565b005b610a06600480360360208110156109f057600080fd5b8101908080359060200190929190505050614408565b005b610a10614491565b6040518082815260200191505060405180910390f35b610a2e6144b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a9060048036036040811015610a7057600080fd5b8101908080359060200190929190803590602001909291905050506144de565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b0860048036036040811015610ad257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614510565b60405180821515815260200191505060405180910390f35b610b6060048036036060811015610b3657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050614542565b005b610b6a6145f2565b60405180821515815260200191505060405180910390f35b610b8a614605565b6040518082815260200191505060405180910390f35b610bec60048036036040811015610bb657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061460b565b60405180821515815260200191505060405180910390f35b610c0c61471d565b6040518082815260200191505060405180910390f35b610c2a614724565b6040518082815260200191505060405180910390f35b610c6e60048036036020811015610c5657600080fd5b8101908080351515906020019092919050505061472a565b005b610cbc60048036036040811015610c8657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147c6565b604051808773ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610d4d60048036036020811015610d2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061482f565b005b610d576148f2565b6040518082815260200191505060405180910390f35b610d9960048036036020811015610d8357600080fd5b8101908080359060200190929190505050614916565b6040518082815260200191505060405180910390f35b610dfb60048036036040811015610dc557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061493d565b005b610e3f60048036036020811015610e1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506149c7565b005b610e6b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b8260098190555081600a8190555080600b81905550505050565b6000806000806000806000610eed6157b3565b601160008a815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050610fda6157ff565b60108a81548110610fe757fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481525050905081600001518260200151836040015184606001518560800151856000015186602001519850985098509850985098509850505092959891949750929550565b6000601080549050905090565b60006110cc6157b3565b6011600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090506111b96157ff565b601084815481106111c657fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481525050905060006112b283606001516112a4600c5461129661128387606001518960800151614c0290919063ffffffff16565b8860400151614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b9050809350505050919050565b6112e97fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600e8190555050565b6010818154811061135857600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6113d27fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260146101000a81548160ff02191690831515021790555050565b61146e7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6114c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600c8190555050565b60006114d76157ff565b601083815481106114e457fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000309050816000015173ffffffffffffffffffffffffffffffffffffffff166370a08231826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b810190808051906020019092919050505092505050919050565b600060016000838152602001908152602001600020600201549050919050565b7f1576982a69a60d25f6f70cf95669d3ad90f1e113fdf73888ab5fd7636c75970581565b600260149054906101000a900460ff16156116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006010838154811061173457fe5b90600052602060002090600402019050816002015484146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605681526020018061596a6056913960600191505060405180910390fd5b43826001015410611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4c69717569646974794d696e696e673a204e6f74204c6f6e6720456e6f75676881525060200191505060405180910390fd5b61186833858360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b6000611873846110c2565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561190857600080fd5b505af115801561191c573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001611965878660020154614dfc90919063ffffffff16565b8152602001600081526020016000815260200161198f838660050154614c0290919063ffffffff16565b8152506011600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050611a75818360010154614c0290919063ffffffff16565b8260010181905550611a94858360020154614dfc90919063ffffffff16565b82600201819055505050505050565b611aca6001600084815260200190815260200160002060020154611ac5614e46565b614510565b611b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615860602f913960400191505060405180910390fd5b611b298282614e4e565b5050565b611b35614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615aae602f913960400191505060405180910390fd5b611bc28282614ee2565b5050565b6000806000600354600454600554925092509250909192565b611c097fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260166101000a81548160ff02191690831515021790555050565b611ca57fe5357ba5bae5443507e284a98f8439a15d25af61dd51d16ca07976c48e268aea33614510565b611cae57600080fd5b611cd982828573ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b505050565b611d087fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611d5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b60108181548110611d6a57fe5b9060005260206000209060040201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160009055505050565b611de77f508f8f8be8f5dbcb88f4f4500430b8b3684c471ed936f31fea912c78ad46a6b933614510565b611df057600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e36573d6000803e3d6000fd5b505050565b611e657fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b826006819055508160078190555080600881905550505050565b600260169054906101000a900460ff1615611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180615a426042913960600191505060405180910390fd5b600260149054906101000a900460ff1615611fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006010848154811061200357fe5b90600052602060002090600402019050600061201e856110c2565b905060001515600260169054906101000a900460ff1615151461204057600080fd5b4383600101541061205057600080fd5b60008414612950576003548360030154141561233857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156120f957600080fd5b505af115801561210d573d6000803e3d6000fd5b505050506121623330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016121b26121a3600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b81526020016121ce856002015487614c0290919063ffffffff16565b8152602001600354815260200161220a600d54866004015410156121f4576009546121f7565b60005b8660040154614c0290919063ffffffff16565b8152602001612226838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061230c818360010154614c0290919063ffffffff16565b826001018190555061232b848360020154614c0290919063ffffffff16565b826002018190555061294b565b6004548360030154141561261857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156123d957600080fd5b505af11580156123ed573d6000803e3d6000fd5b505050506124423330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612492612483600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b81526020016124ae856002015487614c0290919063ffffffff16565b815260200160045481526020016124ea600d54866004015410156124d457600a546124d7565b60005b8660040154614c0290919063ffffffff16565b8152602001612506838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506125ec818360010154614c0290919063ffffffff16565b826001018190555061260b848360020154614c0290919063ffffffff16565b826002018190555061294a565b600554836003015414156128f857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126b957600080fd5b505af11580156126cd573d6000803e3d6000fd5b505050506127223330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612772612763600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200161278e856002015487614c0290919063ffffffff16565b815260200160055481526020016127ca600d54866004015410156127b457600b546127b7565b60005b8660040154614c0290919063ffffffff16565b81526020016127e6838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506128cc818360010154614c0290919063ffffffff16565b82600101819055506128eb848360020154614c0290919063ffffffff16565b8260020181905550612949565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b61313a565b60008414156130cb5760035483600301541415612bb757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129fa57600080fd5b505af1158015612a0e573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612a62612a53600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016003548152602001612aa8600d5486600401541015612a9257600954612a95565b60005b8660040154614c0290919063ffffffff16565b8152602001612ac4838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050612baa818360010154614c0290919063ffffffff16565b82600101819055506130c6565b60045483600301541415612e1557600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612c5857600080fd5b505af1158015612c6c573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612cc0612cb1600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016004548152602001612d06600d5486600401541015612cf057600a54612cf3565b60005b8660040154614c0290919063ffffffff16565b8152602001612d22838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050612e08818360010154614c0290919063ffffffff16565b82600101819055506130c5565b6005548360030154141561307357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612f1e612f0f600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016005548152602001612f64600d5486600401541015612f4e57600b54612f51565b60005b8660040154614c0290919063ffffffff16565b8152602001612f80838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050613066818360010154614c0290919063ffffffff16565b82600101819055506130c4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b613139565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4c69717569646974794d696e696e673a203f000000000000000000000000000081525060200191505060405180910390fd5b5b5050505050565b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d381565b61318f7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b601060405180608001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505050565b600260149054906101000a900460ff1681565b6132f07fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6132f957600080fd5b60006010838154811061330857fe5b90600052602060002090600402019050818160030181905550505050565b6133507fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600d8190555050565b6133b7614e46565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613477576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61355f7f1576982a69a60d25f6f70cf95669d3ad90f1e113fdf73888ab5fd7636c75970533614510565b61356857600080fd5b60006011600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000601084815481106135cb57fe5b9060005260206000209060040201905060008260020154905061363384828460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b600061364c828560020154614dfc90919063ffffffff16565b90506000613659876110c2565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156136ee57600080fd5b505af1158015613702573d6000803e3d6000fd5b505050506040518060c001604052808773ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001838152602001600081526020016000815260200161375f838860050154614c0290919063ffffffff16565b8152506011600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050613845818560010154614c0290919063ffffffff16565b8460010181905550613864838560020154614dfc90919063ffffffff16565b846002018190555050505050505050565b600260169054906101000a900460ff1681565b600260159054906101000a900460ff16156138ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806159c06038913960400191505060405180910390fd5b600260149054906101000a900460ff1615613954576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000601083815481106139b757fe5b9060005260206000209060040201905060003090506000836002015414613a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061588f6034913960400191505060405180910390fd5b600354851415613d5557613a843382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6000613ad786613ac9600c54613abb613aac8860030154600654614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001613b29613b1a600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200188815260200160035481526020016006548152602001613b6f613b5c600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833613c92600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ce557600080fd5b505af1158015613cf9573d6000803e3d6000fd5b50505050613d14878460020154614c0290919063ffffffff16565b8360020181905550613d47613d34600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b836001018190555050614400565b60045485141561408157613db03382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6000613e0386613df5600c54613de7613dd88860030154600754614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001613e55613e46600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200188815260200160045481526020016007548152602001613e9b613e88600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833613fbe600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561401157600080fd5b505af1158015614025573d6000803e3d6000fd5b50505050614040878460020154614c0290919063ffffffff16565b8360020181905550614073614060600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b8360010181905550506143ff565b6005548514156143ad576140dc3382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b600061412f86614121600c546141136141048860030154600854614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001614181614172600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001888152602001600554815260200160085481526020016141c76141b4600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f8336142ea600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561433d57600080fd5b505af1158015614351573d6000803e3d6000fd5b5050505061436c878460020154614c0290919063ffffffff16565b836002018190555061439f61438c600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b8360010181905550506143fe565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b505050505050565b6144327fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b614487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600f8190555050565b7f508f8f8be8f5dbcb88f4f4500430b8b3684c471ed936f31fea912c78ad46a6b981565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000614508826001600086815260200190815260200160002060000161503790919063ffffffff16565b905092915050565b600061453a826001600086815260200190815260200160002060000161505190919063ffffffff16565b905092915050565b61456c7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6145c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b81811180156145cf57508282115b6145d857600080fd5b826003819055508160048190555080600581905550505050565b600260159054906101000a900460ff1681565b600d5481565b60006146156157b3565b6011600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050600081604001511415614711576000915050614717565b60019150505b92915050565b6000801b81565b600f5481565b6147547fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260156101000a81548160ff02191690831515021790555050565b6011602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b6148597fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6148ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7fe5357ba5bae5443507e284a98f8439a15d25af61dd51d16ca07976c48e268aea81565b600061493660016000848152602001908152602001600020600001615081565b9050919050565b614964600160008481526020019081526020016000206002015461495f614e46565b614510565b6149b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806158e96030913960400191505060405180910390fd5b6149c38282614ee2565b5050565b6149cf614e46565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158c36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000614bfa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b615096565b905092915050565b600080828401905083811015614c80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415614c9d5760009050614d0a565b6000828402905082848281614cae57fe5b0414614d05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159f86021913960400191505060405180910390fd5b809150505b92915050565b6000614d5283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615106565b905092915050565b614df78363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506151cc565b505050565b6000614e3e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152bb565b905092915050565b600033905090565b614e768160016000858152602001908152602001600020600001614bd290919063ffffffff16565b15614ede57614e83614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b614f0a816001600085815260200190815260200160002060000161537b90919063ffffffff16565b15614f7257614f17614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b615031846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506151cc565b50505050565b600061504683600001836153ab565b60001c905092915050565b6000615079836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61542e565b905092915050565b600061508f82600001615451565b9050919050565b60006150a2838361542e565b6150fb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050615100565b600090505b92915050565b600080831182906151b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561517757808201518184015260208101905061515c565b50505050905090810190601f1680156151a45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816151be57fe5b049050809150509392505050565b606061522e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166154629092919063ffffffff16565b90506000815111156152b65780806020019051602081101561524f57600080fd5b81019080805190602001909291905050506152b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615a84602a913960400191505060405180910390fd5b5b505050565b6000838311158290615368576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561532d578082015181840152602081019050615312565b50505050905090810190601f16801561535a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006153a3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61547a565b905092915050565b60008183600001805490501161540c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061583e6022913960400191505060405180910390fd5b82600001828154811061541b57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60606154718484600085615562565b90509392505050565b6000808360010160008481526020019081526020016000205490506000811461555657600060018203905060006001866000018054905003905060008660000182815481106154c557fe5b90600052602060002001549050808760000184815481106154e257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061551a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061555c565b60009150505b92915050565b606061556d85615768565b6155df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061562f578051825260208201915060208101905060208303925061560c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615691576040519150601f19603f3d011682016040523d82523d6000602084013e615696565b606091505b509150915081156156ab578092505050615760565b6000815111156156be5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561572557808201518184015260208101905061570a565b50505050905090810190601f1680156157525780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156157aa57506000801b8214155b92505050919050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744c69717569646974794d696e696e673a2054686973206163636f756e7420616c726561647920686173206120706f736974696f6e4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b654c69717569646974794d696e696e673a204d6573736167652053656e646572206d757374206265205f41444d494e4c69717569646974794d696e696e673a20436f6e7472616374206973205061757365644c6971756964794d696e696e673a2045697468657220796f7520646f206e6f742068617665206120706f736974696f6e206f7220796f75206d7573742072656d6f76652074686520656e7469726520616d6f756e742e4c69717569646974794d696e696e673a20416464696e67206120506f736974696f6e2069732063757272656e746c792064697361626c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c69717569646974794d696e696e673a20496e636f6d70617469626c65204c6f636b20506572696f644c69717569646974794d696e696e673a204f6e6c792052656d6f76696e67206120706f736974696f6e20697320616c6c6f77656420617420746865206d6f6d656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212206a7519d44c13dbe48df9768cec8b48b4d5bae5779b836a3e16e4c2752c74697a64736f6c63430007040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806364d9d3a711610167578063973d4555116100ce578063a5b0dc5211610087578063a5b0dc5214610c70578063bbcd5bbe14610d0b578063c20d125614610d4f578063ca15c87314610d6d578063d547741f14610daf578063f2fde38b14610dfd576102a0565b8063973d455514610b625780639b46818d14610b82578063a204ccab14610ba0578063a217fddf14610c04578063a308b8f514610c22578063a4a1b5c114610c40576102a0565b80637fdb7774116101205780637fdb7774146109da5780638d580b9f14610a085780638da5cb5b14610a265780639010d07c14610a5a57806391d1485414610abc5780639469ae4f14610b20576102a0565b806364d9d3a7146108ba5780636d7ddc8d146108f2578063715018a614610920578063716064191461092a5780637724336c146109785780637b50bae714610998576102a0565b80632f2ff15d1161020b57806348132f48116101c457806348132f48146107665780634e092a01146107b457806350938af6146107f6578063515572891461082e5780635303a6631461084c5780635c975abb1461089a576102a0565b80632f2ff15d146105d257806336568abe1461062057806337bc03e51461066e578063404e36451461069a57806341f431fd146106ca57806344117db114610738576102a0565b806316c38b3c1161025d57806316c38b3c1461049a5780631facdcec146104ca57806322a0c64e146104f8578063248a9ca31461053a5780632c2076df1461057c5780632ed7643f1461059a576102a0565b8063029c3d4b146102a55780630694eea3146102e7578063081e3eda1461039f5780631134918a146103bd57806312dbd7dc146103ff5780631526fe271461042d575b600080fd5b6102e5600480360360608110156102bb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e41565b005b610333600480360360408110156102fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eda565b604051808873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200197505050505050505060405180910390f35b6103a76110b5565b6040518082815260200191505060405180910390f35b6103e9600480360360208110156103d357600080fd5b81019080803590602001909291905050506110c2565b6040518082815260200191505060405180910390f35b61042b6004803603602081101561041557600080fd5b81019080803590602001909291905050506112bf565b005b6104596004803603602081101561044357600080fd5b8101908080359060200190929190505050611348565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104c8600480360360208110156104b057600080fd5b810190808035151590602001909291905050506113a8565b005b6104f6600480360360208110156104e057600080fd5b8101908080359060200190929190505050611444565b005b6105246004803603602081101561050e57600080fd5b81019080803590602001909291905050506114cd565b6040518082815260200191505060405180910390f35b6105666004803603602081101561055057600080fd5b8101908080359060200190929190505050611627565b6040518082815260200191505060405180910390f35b610584611647565b6040518082815260200191505060405180910390f35b6105d0600480360360408110156105b057600080fd5b81019080803590602001909291908035906020019092919050505061166b565b005b61061e600480360360408110156105e857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aa3565b005b61066c6004803603604081101561063657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2d565b005b610676611bc6565b60405180848152602001838152602001828152602001935050505060405180910390f35b6106c8600480360360208110156106b057600080fd5b81019080803515159060200190929190505050611bdf565b005b610736600480360360608110156106e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c7b565b005b6107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611cde565b005b6107b26004803603604081101561077c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dbd565b005b6107f4600480360360608110156107ca57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611e3b565b005b61082c6004803603604081101561080c57600080fd5b810190808035906020019092919080359060200190929190505050611ed4565b005b610836613141565b6040518082815260200191505060405180910390f35b6108986004803603604081101561086257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613165565b005b6108a26132b3565b60405180821515815260200191505060405180910390f35b6108f0600480360360408110156108d057600080fd5b8101908080359060200190929190803590602001909291905050506132c6565b005b61091e6004803603602081101561090857600080fd5b8101908080359060200190929190505050613326565b005b6109286133af565b005b6109766004803603604081101561094057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613535565b005b610980613875565b60405180821515815260200191505060405180910390f35b6109d8600480360360608110156109ae57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613888565b005b610a06600480360360208110156109f057600080fd5b8101908080359060200190929190505050614408565b005b610a10614491565b6040518082815260200191505060405180910390f35b610a2e6144b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a9060048036036040811015610a7057600080fd5b8101908080359060200190929190803590602001909291905050506144de565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b0860048036036040811015610ad257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614510565b60405180821515815260200191505060405180910390f35b610b6060048036036060811015610b3657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050614542565b005b610b6a6145f2565b60405180821515815260200191505060405180910390f35b610b8a614605565b6040518082815260200191505060405180910390f35b610bec60048036036040811015610bb657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061460b565b60405180821515815260200191505060405180910390f35b610c0c61471d565b6040518082815260200191505060405180910390f35b610c2a614724565b6040518082815260200191505060405180910390f35b610c6e60048036036020811015610c5657600080fd5b8101908080351515906020019092919050505061472a565b005b610cbc60048036036040811015610c8657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147c6565b604051808773ffffffffffffffffffffffffffffffffffffffff168152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610d4d60048036036020811015610d2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061482f565b005b610d576148f2565b6040518082815260200191505060405180910390f35b610d9960048036036020811015610d8357600080fd5b8101908080359060200190929190505050614916565b6040518082815260200191505060405180910390f35b610dfb60048036036040811015610dc557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061493d565b005b610e3f60048036036020811015610e1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506149c7565b005b610e6b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b8260098190555081600a8190555080600b81905550505050565b6000806000806000806000610eed6157b3565b601160008a815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050610fda6157ff565b60108a81548110610fe757fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481525050905081600001518260200151836040015184606001518560800151856000015186602001519850985098509850985098509850505092959891949750929550565b6000601080549050905090565b60006110cc6157b3565b6011600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090506111b96157ff565b601084815481106111c657fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481525050905060006112b283606001516112a4600c5461129661128387606001518960800151614c0290919063ffffffff16565b8860400151614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b9050809350505050919050565b6112e97fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600e8190555050565b6010818154811061135857600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6113d27fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260146101000a81548160ff02191690831515021790555050565b61146e7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6114c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600c8190555050565b60006114d76157ff565b601083815481106114e457fe5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000309050816000015173ffffffffffffffffffffffffffffffffffffffff166370a08231826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b810190808051906020019092919050505092505050919050565b600060016000838152602001908152602001600020600201549050919050565b7f1576982a69a60d25f6f70cf95669d3ad90f1e113fdf73888ab5fd7636c75970581565b600260149054906101000a900460ff16156116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006010838154811061173457fe5b90600052602060002090600402019050816002015484146117a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605681526020018061596a6056913960600191505060405180910390fd5b43826001015410611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4c69717569646974794d696e696e673a204e6f74204c6f6e6720456e6f75676881525060200191505060405180910390fd5b61186833858360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b6000611873846110c2565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561190857600080fd5b505af115801561191c573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001611965878660020154614dfc90919063ffffffff16565b8152602001600081526020016000815260200161198f838660050154614c0290919063ffffffff16565b8152506011600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050611a75818360010154614c0290919063ffffffff16565b8260010181905550611a94858360020154614dfc90919063ffffffff16565b82600201819055505050505050565b611aca6001600084815260200190815260200160002060020154611ac5614e46565b614510565b611b1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615860602f913960400191505060405180910390fd5b611b298282614e4e565b5050565b611b35614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615aae602f913960400191505060405180910390fd5b611bc28282614ee2565b5050565b6000806000600354600454600554925092509250909192565b611c097fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260166101000a81548160ff02191690831515021790555050565b611ca57fe5357ba5bae5443507e284a98f8439a15d25af61dd51d16ca07976c48e268aea33614510565b611cae57600080fd5b611cd982828573ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b505050565b611d087fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611d5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b60108181548110611d6a57fe5b9060005260206000209060040201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160009055505050565b611de77f508f8f8be8f5dbcb88f4f4500430b8b3684c471ed936f31fea912c78ad46a6b933614510565b611df057600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e36573d6000803e3d6000fd5b505050565b611e657fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b611eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b826006819055508160078190555080600881905550505050565b600260169054906101000a900460ff1615611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180615a426042913960600191505060405180910390fd5b600260149054906101000a900460ff1615611fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006010848154811061200357fe5b90600052602060002090600402019050600061201e856110c2565b905060001515600260169054906101000a900460ff1615151461204057600080fd5b4383600101541061205057600080fd5b60008414612950576003548360030154141561233857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156120f957600080fd5b505af115801561210d573d6000803e3d6000fd5b505050506121623330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016121b26121a3600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b81526020016121ce856002015487614c0290919063ffffffff16565b8152602001600354815260200161220a600d54866004015410156121f4576009546121f7565b60005b8660040154614c0290919063ffffffff16565b8152602001612226838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061230c818360010154614c0290919063ffffffff16565b826001018190555061232b848360020154614c0290919063ffffffff16565b826002018190555061294b565b6004548360030154141561261857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156123d957600080fd5b505af11580156123ed573d6000803e3d6000fd5b505050506124423330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612492612483600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b81526020016124ae856002015487614c0290919063ffffffff16565b815260200160045481526020016124ea600d54866004015410156124d457600a546124d7565b60005b8660040154614c0290919063ffffffff16565b8152602001612506838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506125ec818360010154614c0290919063ffffffff16565b826001018190555061260b848360020154614c0290919063ffffffff16565b826002018190555061294a565b600554836003015414156128f857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126b957600080fd5b505af11580156126cd573d6000803e3d6000fd5b505050506127223330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612772612763600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200161278e856002015487614c0290919063ffffffff16565b815260200160055481526020016127ca600d54866004015410156127b457600b546127b7565b60005b8660040154614c0290919063ffffffff16565b81526020016127e6838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506128cc818360010154614c0290919063ffffffff16565b82600101819055506128eb848360020154614c0290919063ffffffff16565b8260020181905550612949565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b61313a565b60008414156130cb5760035483600301541415612bb757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129fa57600080fd5b505af1158015612a0e573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612a62612a53600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016003548152602001612aa8600d5486600401541015612a9257600954612a95565b60005b8660040154614c0290919063ffffffff16565b8152602001612ac4838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050612baa818360010154614c0290919063ffffffff16565b82600101819055506130c6565b60045483600301541415612e1557600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612c5857600080fd5b505af1158015612c6c573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612cc0612cb1600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016004548152602001612d06600d5486600401541015612cf057600a54612cf3565b60005b8660040154614c0290919063ffffffff16565b8152602001612d22838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050612e08818360010154614c0290919063ffffffff16565b82600101819055506130c5565b6005548360030154141561307357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015612eb657600080fd5b505af1158015612eca573d6000803e3d6000fd5b505050506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001612f1e612f0f600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001846002015481526020016005548152602001612f64600d5486600401541015612f4e57600b54612f51565b60005b8660040154614c0290919063ffffffff16565b8152602001612f80838660050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050613066818360010154614c0290919063ffffffff16565b82600101819055506130c4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b613139565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4c69717569646974794d696e696e673a203f000000000000000000000000000081525060200191505060405180910390fd5b5b5050505050565b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d381565b61318f7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b601060405180608001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505050565b600260149054906101000a900460ff1681565b6132f07fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6132f957600080fd5b60006010838154811061330857fe5b90600052602060002090600402019050818160030181905550505050565b6133507fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600d8190555050565b6133b7614e46565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613477576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61355f7f1576982a69a60d25f6f70cf95669d3ad90f1e113fdf73888ab5fd7636c75970533614510565b61356857600080fd5b60006011600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000601084815481106135cb57fe5b9060005260206000209060040201905060008260020154905061363384828460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614d5a9092919063ffffffff16565b600061364c828560020154614dfc90919063ffffffff16565b90506000613659876110c2565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156136ee57600080fd5b505af1158015613702573d6000803e3d6000fd5b505050506040518060c001604052808773ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001838152602001600081526020016000815260200161375f838860050154614c0290919063ffffffff16565b8152506011600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050613845818560010154614c0290919063ffffffff16565b8460010181905550613864838560020154614dfc90919063ffffffff16565b846002018190555050505050505050565b600260169054906101000a900460ff1681565b600260159054906101000a900460ff16156138ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806159c06038913960400191505060405180910390fd5b600260149054906101000a900460ff1615613954576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806159476023913960400191505060405180910390fd5b60006011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000601083815481106139b757fe5b9060005260206000209060040201905060003090506000836002015414613a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061588f6034913960400191505060405180910390fd5b600354851415613d5557613a843382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6000613ad786613ac9600c54613abb613aac8860030154600654614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001613b29613b1a600354600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200188815260200160035481526020016006548152602001613b6f613b5c600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833613c92600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613ce557600080fd5b505af1158015613cf9573d6000803e3d6000fd5b50505050613d14878460020154614c0290919063ffffffff16565b8360020181905550613d47613d34600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b836001018190555050614400565b60045485141561408157613db03382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b6000613e0386613df5600c54613de7613dd88860030154600754614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001613e55613e46600454600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b815260200188815260200160045481526020016007548152602001613e9b613e88600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f833613fbe600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561401157600080fd5b505af1158015614025573d6000803e3d6000fd5b50505050614040878460020154614c0290919063ffffffff16565b8360020181905550614073614060600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b8360010181905550506143ff565b6005548514156143ad576140dc3382888560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614f76909392919063ffffffff16565b600061412f86614121600c546141136141048860030154600854614c0290919063ffffffff16565b8c614c8a90919063ffffffff16565b614d1090919063ffffffff16565b614c8a90919063ffffffff16565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001614181614172600554600f54614c8a90919063ffffffff16565b43614c0290919063ffffffff16565b8152602001888152602001600554815260200160085481526020016141c76141b4600e5485614d1090919063ffffffff16565b8760050154614c0290919063ffffffff16565b8152506011600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449a52f8336142ea600e5485614d1090919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561433d57600080fd5b505af1158015614351573d6000803e3d6000fd5b5050505061436c878460020154614c0290919063ffffffff16565b836002018190555061439f61438c600e5483614d1090919063ffffffff16565b8460010154614c0290919063ffffffff16565b8360010181905550506143fe565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615a196029913960400191505060405180910390fd5b5b5b505050505050565b6144327fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b614487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600f8190555050565b7f508f8f8be8f5dbcb88f4f4500430b8b3684c471ed936f31fea912c78ad46a6b981565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000614508826001600086815260200190815260200160002060000161503790919063ffffffff16565b905092915050565b600061453a826001600086815260200190815260200160002060000161505190919063ffffffff16565b905092915050565b61456c7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6145c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b81811180156145cf57508282115b6145d857600080fd5b826003819055508160048190555080600581905550505050565b600260159054906101000a900460ff1681565b600d5481565b60006146156157b3565b6011600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050600081604001511415614711576000915050614717565b60019150505b92915050565b6000801b81565b600f5481565b6147547fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6147a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260156101000a81548160ff02191690831515021790555050565b6011602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b6148597fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333614510565b6148ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615919602e913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7fe5357ba5bae5443507e284a98f8439a15d25af61dd51d16ca07976c48e268aea81565b600061493660016000848152602001908152602001600020600001615081565b9050919050565b614964600160008481526020019081526020016000206002015461495f614e46565b614510565b6149b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806158e96030913960400191505060405180910390fd5b6149c38282614ee2565b5050565b6149cf614e46565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158c36026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000614bfa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b615096565b905092915050565b600080828401905083811015614c80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415614c9d5760009050614d0a565b6000828402905082848281614cae57fe5b0414614d05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159f86021913960400191505060405180910390fd5b809150505b92915050565b6000614d5283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615106565b905092915050565b614df78363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506151cc565b505050565b6000614e3e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152bb565b905092915050565b600033905090565b614e768160016000858152602001908152602001600020600001614bd290919063ffffffff16565b15614ede57614e83614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b614f0a816001600085815260200190815260200160002060000161537b90919063ffffffff16565b15614f7257614f17614e46565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b615031846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506151cc565b50505050565b600061504683600001836153ab565b60001c905092915050565b6000615079836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61542e565b905092915050565b600061508f82600001615451565b9050919050565b60006150a2838361542e565b6150fb578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050615100565b600090505b92915050565b600080831182906151b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561517757808201518184015260208101905061515c565b50505050905090810190601f1680156151a45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816151be57fe5b049050809150509392505050565b606061522e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166154629092919063ffffffff16565b90506000815111156152b65780806020019051602081101561524f57600080fd5b81019080805190602001909291905050506152b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615a84602a913960400191505060405180910390fd5b5b505050565b6000838311158290615368576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561532d578082015181840152602081019050615312565b50505050905090810190601f16801561535a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006153a3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61547a565b905092915050565b60008183600001805490501161540c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061583e6022913960400191505060405180910390fd5b82600001828154811061541b57fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60606154718484600085615562565b90509392505050565b6000808360010160008481526020019081526020016000205490506000811461555657600060018203905060006001866000018054905003905060008660000182815481106154c557fe5b90600052602060002001549050808760000184815481106154e257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061551a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061555c565b60009150505b92915050565b606061556d85615768565b6155df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061562f578051825260208201915060208101905060208303925061560c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615691576040519150601f19603f3d011682016040523d82523d6000602084013e615696565b606091505b509150915081156156ab578092505050615760565b6000815111156156be5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561572557808201518184015260208101905061570a565b50505050905090810190601f1680156157525780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156157aa57506000801b8214155b92505050919050565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744c69717569646974794d696e696e673a2054686973206163636f756e7420616c726561647920686173206120706f736974696f6e4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b654c69717569646974794d696e696e673a204d6573736167652053656e646572206d757374206265205f41444d494e4c69717569646974794d696e696e673a20436f6e7472616374206973205061757365644c6971756964794d696e696e673a2045697468657220796f7520646f206e6f742068617665206120706f736974696f6e206f7220796f75206d7573742072656d6f76652074686520656e7469726520616d6f756e742e4c69717569646974794d696e696e673a20416464696e67206120506f736974696f6e2069732063757272656e746c792064697361626c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774c69717569646974794d696e696e673a20496e636f6d70617469626c65204c6f636b20506572696f644c69717569646974794d696e696e673a204f6e6c792052656d6f76696e67206120706f736974696f6e20697320616c6c6f77656420617420746865206d6f6d656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212206a7519d44c13dbe48df9768cec8b48b4d5bae5779b836a3e16e4c2752c74697a64736f6c63430007040033
Deployed Bytecode Sourcemap
38817:23774:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49564:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45719:687;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45110:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56663:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50163:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41478:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43217:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49123:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45350:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21792:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39106:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53994:1053;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22168:227;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23377:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46968:276;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43402:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62214:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44759:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62416:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48650:461;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57418:4724;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39047:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44360:385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39348:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49964:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49357:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2668:148;;;:::i;:::-;;55473:920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39403:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50697:3099;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48218:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39226:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2026:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21465:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20426:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47741:380;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39373:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40039:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46613:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19171:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40502:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43616:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41842:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47442:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39169:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20739:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22640:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2971:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49564:388;49731:27;39080:19;49747:10;49731:7;:27::i;:::-;49723:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49832:18;49819:10;:31;;;;49874:18;49861:10;:31;;;;49916:18;49903:10;:31;;;;49564:388;;;:::o;45719:687::-;45807:23;45842:21;45875;45908:25;45945:16;45973:22;46006:33;46058:27;;:::i;:::-;46088:8;:14;46097:4;46088:14;;;;;;;;;;;:24;46103:8;46088:24;;;;;;;;;;;;;;;46058:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46123:20;;:::i;:::-;46146:8;46155:4;46146:14;;;;;;;;;;;;;;;;;;46123:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46193:1;:10;;;46219:1;:14;;;46249:1;:14;;;46279:1;:6;;;46301:1;:8;;;46325:4;:20;;;46360:4;:27;;;46171:227;;;;;;;;;;;;;;;;45719:687;;;;;;;;;;:::o;45110:95::-;45155:7;45182:8;:15;;;;45175:22;;45110:95;:::o;56663:355::-;56731:19;56763:27;;:::i;:::-;56793:8;:14;56802:4;56793:14;;;;;;;;;;;:26;56808:10;56793:26;;;;;;;;;;;;;;;56763:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56830:20;;:::i;:::-;56853:8;56862:4;56853:14;;;;;;;;;;;;;;;;;;56830:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56878:18;56899:83;56975:1;:6;;;56899:71;56952:17;;56899:48;56918:28;56931:4;:14;;;56918:1;:8;;;:12;;:28;;;;:::i;:::-;56899:1;:14;;;:18;;:48;;;;:::i;:::-;:52;;:71;;;;:::i;:::-;:75;;:83;;;;:::i;:::-;56878:104;;57000:10;56993:17;;;;;56663:355;;;:::o;50163:197::-;50235:27;39080:19;50251:10;50235:7;:27::i;:::-;50227:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50341:11;50323:15;:29;;;;50163:197;:::o;41478:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43217:173::-;43278:27;39080:19;43294:10;43278:7;:27::i;:::-;43270:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43375:7;43366:6;;:16;;;;;;;;;;;;;;;;;;43217:173;:::o;49123:226::-;49208:27;39080:19;49224:10;49208:7;:27::i;:::-;49200:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49316:19;49296:17;:39;;;;49123:226;:::o;45350:225::-;45415:13;45441:20;;:::i;:::-;45464:8;45473:4;45464:14;;;;;;;;;;;;;;;;;;45441:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45489:10;45510:4;45489:26;;45533:4;:20;;;:30;;;45564:2;45533:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45526:41;;;;45350:225;;;:::o;21792:114::-;21849:7;21876:6;:12;21883:4;21876:12;;;;;;;;;;;:22;;;21869:29;;21792:114;;;:::o;39106:56::-;39141:21;39106:56;:::o;53994:1053::-;42757:6;;;;;;;;;;;42756:7;42748:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54082:28:::1;54113:8;:14;54122:4;54113:14;;;;;;;;;;;:26;54128:10;54113:26;;;;;;;;;;;;;;;54082:57;;54150:21;54174:8;54183:4;54174:14;;;;;;;;;;;;;;;;;;54150:38;;54225:1;:14;;;54207;:32;54199:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54366:12;54349:1;:14;;;:29;54341:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;54430:61;54464:10;54476:14;54430:4;:20;;;;;;;;;;;;:33;;;;:61;;;;;:::i;:::-;54506:10;54519:29;54543:4;54519:23;:29::i;:::-;54506:42;;54563:10;;;;;;;;;;;:17;;;54581:10;54593:5;54563:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54643:227;;;;;;;;54681:10;54643:227;;;;;;54711:1;54643:227;;;;54732:34;54751:14;54732:1;:14;;;:18;;:34;;;;:::i;:::-;54643:227;;;;54785:1;54643:227;;;;54806:1;54643:227;;;;54826:29;54849:5;54826:1;:18;;;:22;;:29;;;;:::i;:::-;54643:227;;::::0;54614:8:::1;:14;54623:4;54614:14;;;;;;;;;;;:26;54629:10;54614:26;;;;;;;;;;;;;;;:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54915:38;54947:5;54915:4;:27;;;:31;;:38;;;;:::i;:::-;54885:4;:27;;:68;;;;54995:44;55024:14;54995:4;:24;;;:28;;:44;;;;:::i;:::-;54968:4;:24;;:71;;;;42814:1;;;53994:1053:::0;;:::o;22168:227::-;22252:45;22260:6;:12;22267:4;22260:12;;;;;;;;;;;:22;;;22284:12;:10;:12::i;:::-;22252:7;:45::i;:::-;22244:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22362:25;22373:4;22379:7;22362:10;:25::i;:::-;22168:227;;:::o;23377:209::-;23475:12;:10;:12::i;:::-;23464:23;;:7;:23;;;23456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23552:26;23564:4;23570:7;23552:11;:26::i;:::-;23377:209;;:::o;46968:276::-;47035:20;47067;47099;47160:11;;47187;;47214;;47138:98;;;;;;46968:276;;;:::o;43402:200::-;43474:27;39080:19;43490:10;43474:7;:27::i;:::-;43466:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43583:11;43562:18;;:32;;;;;;;;;;;;;;;;;;43402:200;:::o;62214:194::-;62312:26;39201:18;62327:10;62312:7;:26::i;:::-;62304:35;;;;;;62350:48;62378:5;62385:12;62357:6;62350:27;;;;:48;;;;;:::i;:::-;62214:194;;;:::o;44759:200::-;44832:27;39080:19;44848:10;44832:7;:27::i;:::-;44824:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:8;44936:4;44927:14;;;;;;;;;;;;;;;;;;;44920:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44759:200;:::o;62416:166::-;62506:28;39260:20;62523:10;62506:7;:28::i;:::-;62498:37;;;;;;62546:5;:14;;:28;62561:12;62546:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62416:166;;:::o;48650:461::-;48846:27;39080:19;48862:10;48846:7;:27::i;:::-;48838:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48958:25;48934:21;:49;;;;49018:25;48994:21;:49;;;;49078:25;49054:21;:49;;;;48650:461;;;:::o;57418:4724::-;43036:18;;;;;;;;;;;43035:19;43027:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42757:6:::1;;;;;;;;;;;42756:7;42748:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57523:28:::2;57554:8;:14;57563:4;57554:14;;;;;;;;;;;:26;57569:10;57554:26;;;;;;;;;;;;;;;57523:57;;57591:21;57615:8;57624:4;57615:14;;;;;;;;;;;;;;;;;;57591:38;;57640:10;57653:29;57677:4;57653:23;:29::i;:::-;57640:42;;57723:5;57701:27;;:18;;;;;;;;;;;:27;;;57693:36;;;::::0;::::2;;57765:12;57748:1;:14;;;:29;57740:38;;;::::0;::::2;;57811:1;57793:14;:19;57789:4345;;57842:11;;57832:1;:6;;;:21;57829:2412;;;57874:10;;;;;;;;;;;:17;;;57892:10;57904:5;57874:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;57929:80;57967:10;57987:4;57994:14;57929:4;:20;;;;;;;;;;;;:37;;;;:80;;;;;;:::i;:::-;58057:357;;;;;;;;58095:10;58057:357;;;;;;58129:45;58146:27;58161:11;;58146:10;;:14;;:27;;;;:::i;:::-;58129:12;:16;;:45;;;;:::i;:::-;58057:357;;;;58198:34;58217:1;:14;;;58198;:18;;:34;;;;:::i;:::-;58057:357;;;;58256:11;;58057:357;;;;58291:52;58316:9;;58304:1;:8;;;:21;;:38;;58332:10;;58304:38;;;58328:1;58304:38;58291:1;:8;;;:12;;:52;;;;:::i;:::-;58057:357;;;;58366:29;58389:5;58366:1;:18;;;:22;;:29;;;;:::i;:::-;58057:357;;::::0;58028:8:::2;:14;58037:4;58028:14;;;;;;;;;;;:26;58043:10;58028:26;;;;;;;;;;;;;;;:386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58463:38;58495:5;58463:4;:27;;;:31;;:38;;;;:::i;:::-;58433:4;:27;;:68;;;;58547:44;58576:14;58547:4;:24;;;:28;;:44;;;;:::i;:::-;58520:4;:24;;:71;;;;57829:2412;;;58627:11;;58617:1;:6;;;:21;58613:1628;;;58659:10;;;;;;;;;;;:17;;;58677:10;58689:5;58659:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;58714:80;58752:10;58772:4;58779:14;58714:4;:20;;;;;;;;;;;;:37;;;;:80;;;;;;:::i;:::-;58842:360;;;;;;;;58884:10;58842:360;;;;;;58918:45;58935:27;58950:11;;58935:10;;:14;;:27;;;;:::i;:::-;58918:12;:16;;:45;;;;:::i;:::-;58842:360;;;;58986:34;59005:1;:14;;;58986;:18;;:34;;;;:::i;:::-;58842:360;;;;59044:11;;58842:360;;;;59079:52;59104:9;;59092:1;:8;;;:21;;:38;;59120:10;;59092:38;;;59116:1;59092:38;59079:1;:8;;;:12;;:52;;;;:::i;:::-;58842:360;;;;59154:29;59177:5;59154:1;:18;;;:22;;:29;;;;:::i;:::-;58842:360;;::::0;58813:8:::2;:14;58822:4;58813:14;;;;;;;;;;;:26;58828:10;58813:26;;;;;;;;;;;;;;;:389;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59251:38;59283:5;59251:4;:27;;;:31;;:38;;;;:::i;:::-;59221:4;:27;;:68;;;;59335:44;59364:14;59335:4;:24;;;:28;;:44;;;;:::i;:::-;59308:4;:24;;:71;;;;58613:1628;;;59415:11;;59405:1;:6;;;:21;59401:840;;;59447:10;;;;;;;;;;;:17;;;59465:10;59477:5;59447:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;59502:80;59540:10;59560:4;59567:14;59502:4;:20;;;;;;;;;;;;:37;;;;:80;;;;;;:::i;:::-;59630:361;;;;;;;;59672:10;59630:361;;;;;;59706:45;59723:27;59738:11;;59723:10;;:14;;:27;;;;:::i;:::-;59706:12;:16;;:45;;;;:::i;:::-;59630:361;;;;59775:34;59794:1;:14;;;59775;:18;;:34;;;;:::i;:::-;59630:361;;;;59833:11;;59630:361;;;;59868:52;59893:9;;59881:1;:8;;;:21;;:38;;59909:10;;59881:38;;;59905:1;59881:38;59868:1;:8;;;:12;;:52;;;;:::i;:::-;59630:361;;;;59943:29;59966:5;59943:1;:18;;;:22;;:29;;;;:::i;:::-;59630:361;;::::0;59601:8:::2;:14;59610:4;59601:14;;;;;;;;;;;:26;59616:10;59601:26;;;;;;;;;;;;;;;:390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60040:38;60072:5;60040:4;:27;;;:31;;:38;;;;:::i;:::-;60010:4;:27;;:68;;;;60124:44;60153:14;60124:4;:24;;;:28;;:44;;;;:::i;:::-;60097:4;:24;;:71;;;;59401:840;;;60190:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59401:840;58613:1628;57829:2412;57789:4345;;;60281:1;60263:14;:19;60259:1875;;;60312:11;;60302:1;:6;;;:21;60299:1789;;;60344:10;;;;;;;;;;;:17;;;60362:10;60374:5;60344:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;60428:341;;;;;;;;60470:10;60428:341;;;;;;60504:45;60521:27;60536:11;;60521:10;;:14;;:27;;;;:::i;:::-;60504:12;:16;;:45;;;;:::i;:::-;60428:341;;;;60573:1;:14;;;60428:341;;;;60611:11;;60428:341;;;;60646:52;60671:9;;60659:1;:8;;;:21;;:38;;60687:10;;60659:38;;;60683:1;60659:38;60646:1;:8;;;:12;;:52;;;;:::i;:::-;60428:341;;;;60721:29;60744:5;60721:1;:18;;;:22;;:29;;;;:::i;:::-;60428:341;;::::0;60399:8:::2;:14;60408:4;60399:14;;;;;;;;;;;:26;60414:10;60399:26;;;;;;;;;;;;;;;:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60818:38;60850:5;60818:4;:27;;;:31;;:38;;;;:::i;:::-;60788:4;:27;;:68;;;;60299:1789;;;60892:11;;60882:1;:6;;;:21;60878:1210;;;60924:10;;;;;;;;;;;:17;;;60942:10;60954:5;60924:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;61008:341;;;;;;;;61050:10;61008:341;;;;;;61084:45;61101:27;61116:11;;61101:10;;:14;;:27;;;;:::i;:::-;61084:12;:16;;:45;;;;:::i;:::-;61008:341;;;;61153:1;:14;;;61008:341;;;;61191:11;;61008:341;;;;61226:52;61251:9;;61239:1;:8;;;:21;;:38;;61267:10;;61239:38;;;61263:1;61239:38;61226:1;:8;;;:12;;:52;;;;:::i;:::-;61008:341;;;;61301:29;61324:5;61301:1;:18;;;:22;;:29;;;;:::i;:::-;61008:341;;::::0;60979:8:::2;:14;60988:4;60979:14;;;;;;;;;;;:26;60994:10;60979:26;;;;;;;;;;;;;;;:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61398:38;61430:5;61398:4;:27;;;:31;;:38;;;;:::i;:::-;61368:4;:27;;:68;;;;60878:1210;;;61472:11;;61462:1;:6;;;:21;61458:630;;;61504:10;;;;;;;;;;;:17;;;61522:10;61534:5;61504:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;61588:341;;;;;;;;61630:10;61588:341;;;;;;61664:45;61681:27;61696:11;;61681:10;;:14;;:27;;;;:::i;:::-;61664:12;:16;;:45;;;;:::i;:::-;61588:341;;;;61733:1;:14;;;61588:341;;;;61771:11;;61588:341;;;;61806:52;61831:9;;61819:1;:8;;;:21;;:38;;61847:10;;61819:38;;;61843:1;61819:38;61806:1;:8;;;:12;;:52;;;;:::i;:::-;61588:341;;;;61881:29;61904:5;61881:1;:18;;;:22;;:29;;;;:::i;:::-;61588:341;;::::0;61559:8:::2;:14;61568:4;61559:14;;;;;;;;;;;:26;61574:10;61559:26;;;;;;;;;;;;;;;:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61978:38;62010:5;61978:4;:27;;;:31;;:38;;;;:::i;:::-;61948:4;:27;;:68;;;;61458:630;;;62037:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61458:630;60878:1210;60299:1789;60259:1875;;;62105:29;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;60259:1875;57789:4345;42814:1;;;57418:4724:::0;;:::o;39047:52::-;39080:19;39047:52;:::o;44360:385::-;44453:27;39080:19;44469:10;44453:7;:27::i;:::-;44445:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44541:8;44555:177;;;;;;;;44596:15;44555:177;;;;;;44650:1;44555:177;;;;44687:1;44555:177;;;;44714:6;44555:177;;;44541:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44360:385;;:::o;39348:18::-;;;;;;;;;;;;;:::o;49964:191::-;50036:27;39080:19;50052:10;50036:7;:27::i;:::-;50028:36;;;;;;50075:21;50099:8;50108:4;50099:14;;;;;;;;;;;;;;;;;;50075:38;;50141:6;50124:4;:14;;:23;;;;49964:191;;;:::o;49357:195::-;49428:27;39080:19;49444:10;49428:7;:27::i;:::-;49420:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49528:13;49516:9;:25;;;;49357:195;:::o;2668:148::-;2248:12;:10;:12::i;:::-;2238:22;;:6;;;;;;;;;;:22;;;2230:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2775:1:::1;2738:40;;2759:6;::::0;::::1;;;;;;;;2738:40;;;;;;;;;;;;2806:1;2789:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2668:148::o:0;55473:920::-;55561:29;39141:21;55579:10;55561:7;:29::i;:::-;55553:38;;;;;;55602:28;55633:8;:14;55642:4;55633:14;;;;;;;;;;;:24;55648:8;55633:24;;;;;;;;;;;;;;;55602:55;;55668:21;55692:8;55701:4;55692:14;;;;;;;;;;;;;;;;;;55668:38;;55717:22;55742:1;:14;;;55717:39;;55767:59;55801:8;55811:14;55767:4;:20;;;;;;;;;;;;:33;;;;:59;;;;;:::i;:::-;55837:25;55865:34;55884:14;55865:1;:14;;;:18;;:34;;;;:::i;:::-;55837:62;;55910:10;55923:29;55947:4;55923:23;:29::i;:::-;55910:42;;55963:10;;;;;;;;;;;:17;;;55981:10;55993:5;55963:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56037:181;;;;;;;;56071:8;56037:181;;;;;;56095:1;56037:181;;;;56112:17;56037:181;;;;56145:1;56037:181;;;;56162:1;56037:181;;;;56178:29;56201:5;56178:1;:18;;;:22;;:29;;;;:::i;:::-;56037:181;;;56010:8;:14;56019:4;56010:14;;;;;;;;;;;:24;56025:8;56010:24;;;;;;;;;;;;;;;:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56259:38;56291:5;56259:4;:27;;;:31;;:38;;;;:::i;:::-;56229:4;:27;;:68;;;;56335:44;56364:14;56335:4;:24;;;:28;;:44;;;;:::i;:::-;56308:4;:24;;:71;;;;55473:920;;;;;;;:::o;39403:30::-;;;;;;;;;;;;;:::o;50697:3099::-;42890:11;;;;;;;;;;;42889:12;42881:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42757:6:::1;;;;;;;;;;;42756:7;42748:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50826:28:::2;50857:8;:14;50866:4;50857:14;;;;;;;;;;;:26;50872:10;50857:26;;;;;;;;;;;;;;;50826:57;;50894:21;50918:8;50927:4;50918:14;;;;;;;;;;;;;;;;;;50894:38;;50943:10;50964:4;50943:26;;51006:1;50988;:14;;;:19;50980:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51093:11;;51078;:26;51075:2713;;;51121:69;51159:10;51171:2;51175:14;51121:4;:20;;;;;;;;;;;;:37;;;;:69;;;;;;:::i;:::-;51205:14;51222:101;51311:11;51222:84;51288:17;;51222:61;51241:41;51267:4;:14;;;51241:21;;:25;;:41;;;;:::i;:::-;51222:14;:18;;:61;;;;:::i;:::-;:65;;:84;;;;:::i;:::-;:88;;:101;;;;:::i;:::-;51205:118;;51367:307;;;;;;;;51405:10;51367:307;;;;;;51435:45;51452:27;51467:11;;51452:10;;:14;;:27;;;;:::i;:::-;51435:12;:16;;:45;;;;:::i;:::-;51367:307;;;;51500:14;51367:307;;;;51534:11;;51367:307;;;;51565:21;;51367:307;;;;51605:54;51628:30;51642:15;;51628:9;:13;;:30;;;;:::i;:::-;51605:1;:18;;;:22;;:54;;;;:::i;:::-;51367:307;;::::0;51338:8:::2;:14;51347:4;51338:14;;;;;;;;;;;:26;51353:10;51338:26;;;;;;;;;;;;;;;:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51689:10;;;;;;;;;;;:17;;;51707:10;51719:30;51733:15;;51719:9;:13;;:30;;;;:::i;:::-;51689:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;51792:44;51821:14;51792:4;:24;;;:28;;:44;;;;:::i;:::-;51765:4;:24;;:71;;;;51881:63;51913:30;51927:15;;51913:9;:13;;:30;;;;:::i;:::-;51881:4;:27;;;:31;;:63;;;;:::i;:::-;51851:4;:27;;:93;;;;51075:2713;;;;51981:11;;51966;:26;51962:1826;;;52009:69;52047:10;52059:2;52063:14;52009:4;:20;;;;;;;;;;;;:37;;;;:69;;;;;;:::i;:::-;52093:14;52110:101;52199:11;52110:84;52176:17;;52110:61;52129:41;52155:4;:14;;;52129:21;;:25;;:41;;;;:::i;:::-;52110:14;:18;;:61;;;;:::i;:::-;:65;;:84;;;;:::i;:::-;:88;;:101;;;;:::i;:::-;52093:118;;52255:307;;;;;;;;52293:10;52255:307;;;;;;52323:45;52340:27;52355:11;;52340:10;;:14;;:27;;;;:::i;:::-;52323:12;:16;;:45;;;;:::i;:::-;52255:307;;;;52388:14;52255:307;;;;52422:11;;52255:307;;;;52453:21;;52255:307;;;;52493:54;52516:30;52530:15;;52516:9;:13;;:30;;;;:::i;:::-;52493:1;:18;;;:22;;:54;;;;:::i;:::-;52255:307;;::::0;52226:8:::2;:14;52235:4;52226:14;;;;;;;;;;;:26;52241:10;52226:26;;;;;;;;;;;;;;;:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52577:10;;;;;;;;;;;:17;;;52595:10;52607:30;52621:15;;52607:9;:13;;:30;;;;:::i;:::-;52577:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;52680:44;52709:14;52680:4;:24;;;:28;;:44;;;;:::i;:::-;52653:4;:24;;:71;;;;52769:63;52801:30;52815:15;;52801:9;:13;;:30;;;;:::i;:::-;52769:4;:27;;;:31;;:63;;;;:::i;:::-;52739:4;:27;;:93;;;;51962:1826;;;;52869:11;;52854;:26;52850:938;;;52897:69;52935:10;52947:2;52951:14;52897:4;:20;;;;;;;;;;;;:37;;;;:69;;;;;;:::i;:::-;52981:14;52998:101;53087:11;52998:84;53064:17;;52998:61;53017:41;53043:4;:14;;;53017:21;;:25;;:41;;;;:::i;:::-;52998:14;:18;;:61;;;;:::i;:::-;:65;;:84;;;;:::i;:::-;:88;;:101;;;;:::i;:::-;52981:118;;53143:307;;;;;;;;53181:10;53143:307;;;;;;53211:45;53228:27;53243:11;;53228:10;;:14;;:27;;;;:::i;:::-;53211:12;:16;;:45;;;;:::i;:::-;53143:307;;;;53276:14;53143:307;;;;53310:11;;53143:307;;;;53341:21;;53143:307;;;;53381:54;53404:30;53418:15;;53404:9;:13;;:30;;;;:::i;:::-;53381:1;:18;;;:22;;:54;;;;:::i;:::-;53143:307;;::::0;53114:8:::2;:14;53123:4;53114:14;;;;;;;;;;;:26;53129:10;53114:26;;;;;;;;;;;;;;;:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53465:10;;;;;;;;;;;:17;;;53483:10;53495:30;53509:15;;53495:9;:13;;:30;;;;:::i;:::-;53465:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;53568:44;53597:14;53568:4;:24;;;:28;;:44;;;;:::i;:::-;53541:4;:24;;:71;;;;53657:63;53689:30;53703:15;;53689:9;:13;;:30;;;;:::i;:::-;53657:4;:27;;;:31;;:63;;;;:::i;:::-;53627:4;:27;;:93;;;;52850:938;;;;53737:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52850:938;51962:1826;51075:2713;42814:1;;;50697:3099:::0;;;:::o;48218:196::-;48291:27;39080:19;48307:10;48291:7;:27::i;:::-;48283:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48392:14;48379:10;:27;;;;48218:196;:::o;39226:54::-;39260:20;39226:54;:::o;2026:79::-;2064:7;2091:6;;;;;;;;;;;2084:13;;2026:79;:::o;21465:138::-;21538:7;21565:30;21589:5;21565:6;:12;21572:4;21565:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;21558:37;;21465:138;;;;:::o;20426:139::-;20495:4;20519:38;20549:7;20519:6;:12;20526:4;20519:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;20512:45;;20426:139;;;;:::o;47741:380::-;47854:27;39080:19;47870:10;47854:7;:27::i;:::-;47846:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47964:11;47950;:25;:54;;;;;47993:11;47979;:25;47950:54;47942:63;;;;;;48030:11;48016;:25;;;;48066:11;48052;:25;;;;48102:11;48088;:25;;;;47741:380;;;:::o;39373:23::-;;;;;;;;;;;;;:::o;40039:24::-;;;;:::o;46613:267::-;46691:17;46721:27;;:::i;:::-;46751:8;:14;46760:4;46751:14;;;;;;;;;;;:28;46766:12;46751:28;;;;;;;;;;;;;;;46721:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46811:1;46793;:14;;;:19;46790:82;;;46830:5;46823:12;;;;;46790:82;46868:4;46861:11;;;46613:267;;;;;:::o;19171:49::-;19216:4;19171:49;;;:::o;40502:25::-;;;;:::o;43616:191::-;43685:27;39080:19;43701:10;43685:7;:27::i;:::-;43677:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43787:12;43773:11;;:26;;;;;;;;;;;;;;;;;;43616:191;:::o;41842:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47442:188::-;47516:27;39080:19;47532:10;47516:7;:27::i;:::-;47508:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47617:5;47604:10;;:18;;;;;;;;;;;;;;;;;;47442:188;:::o;39169:50::-;39201:18;39169:50;:::o;20739:127::-;20802:7;20829:29;:6;:12;20836:4;20829:12;;;;;;;;;;;:20;;:27;:29::i;:::-;20822:36;;20739:127;;;:::o;22640:230::-;22725:45;22733:6;:12;22740:4;22733:12;;;;;;;;;;;:22;;;22757:12;:10;:12::i;:::-;22725:7;:45::i;:::-;22717:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22836:26;22848:4;22854:7;22836:11;:26::i;:::-;22640:230;;:::o;2971:244::-;2248:12;:10;:12::i;:::-;2238:22;;:6;;;;;;;;;;:22;;;2230:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3080:1:::1;3060:22;;:8;:22;;;;3052:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3170:8;3141:38;;3162:6;::::0;::::1;;;;;;;;3141:38;;;;;;;;;;;;3199:8;3190:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;2971:244:::0;:::o;8241:143::-;8311:4;8335:41;8340:3;:10;;8368:5;8360:14;;8352:23;;8335:4;:41::i;:::-;8328:48;;8241:143;;;;:::o;25921:181::-;25979:7;25999:9;26015:1;26011;:5;25999:17;;26040:1;26035;:6;;26027:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26093:1;26086:8;;;25921:181;;;;:::o;27275:471::-;27333:7;27583:1;27578;:6;27574:47;;;27608:1;27601:8;;;;27574:47;27633:9;27649:1;27645;:5;27633:17;;27678:1;27673;27669;:5;;;;;;:10;27661:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27737:1;27730:8;;;27275:471;;;;;:::o;28222:132::-;28280:7;28307:39;28311:1;28314;28307:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;28300:46;;28222:132;;;;:::o;34014:177::-;34097:86;34117:5;34147:23;;;34172:2;34176:5;34124:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34097:19;:86::i;:::-;34014:177;;;:::o;26385:136::-;26443:7;26470:43;26474:1;26477;26470:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;26463:50;;26385:136;;;;:::o;608:106::-;661:15;696:10;689:17;;608:106;:::o;24620:188::-;24694:33;24719:7;24694:6;:12;24701:4;24694:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;24690:111;;;24776:12;:10;:12::i;:::-;24749:40;;24767:7;24749:40;;24761:4;24749:40;;;;;;;;;;24690:111;24620:188;;:::o;24816:192::-;24891:36;24919:7;24891:6;:12;24898:4;24891:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;24887:114;;;24976:12;:10;:12::i;:::-;24949:40;;24967:7;24949:40;;24961:4;24949:40;;;;;;;;;;24887:114;24816:192;;:::o;34199:205::-;34300:96;34320:5;34350:27;;;34379:4;34385:2;34389:5;34327:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34300:19;:96::i;:::-;34199:205;;;;:::o;9500:149::-;9574:7;9617:22;9621:3;:10;;9633:5;9617:3;:22::i;:::-;9609:31;;9594:47;;9500:149;;;;:::o;8795:158::-;8875:4;8899:46;8909:3;:10;;8937:5;8929:14;;8921:23;;8899:9;:46::i;:::-;8892:53;;8795:158;;;;:::o;9039:117::-;9102:7;9129:19;9137:3;:10;;9129:7;:19::i;:::-;9122:26;;9039:117;;;:::o;4895:414::-;4958:4;4980:21;4990:3;4995:5;4980:9;:21::i;:::-;4975:327;;5018:3;:11;;5035:5;5018:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5201:3;:11;;:18;;;;5179:3;:12;;:19;5192:5;5179:19;;;;;;;;;;;:40;;;;5241:4;5234:11;;;;4975:327;5285:5;5278:12;;4895:414;;;;;:::o;28850:278::-;28936:7;28968:1;28964;:5;28971:12;28956:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28995:9;29011:1;29007;:5;;;;;;28995:17;;29119:1;29112:8;;;28850:278;;;;;:::o;36319:761::-;36743:23;36769:69;36797:4;36769:69;;;;;;;;;;;;;;;;;36777:5;36769:27;;;;:69;;;;;:::i;:::-;36743:95;;36873:1;36853:10;:17;:21;36849:224;;;36995:10;36984:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36976:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36849:224;36319:761;;;:::o;26824:192::-;26910:7;26943:1;26938;:6;;26946:12;26930:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26970:9;26986:1;26982;:5;26970:17;;27007:1;27000:8;;;26824:192;;;;;:::o;8560:149::-;8633:4;8657:44;8665:3;:10;;8693:5;8685:14;;8677:23;;8657:7;:44::i;:::-;8650:51;;8560:149;;;;:::o;7783:204::-;7850:7;7899:5;7878:3;:11;;:18;;;;:26;7870:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7961:3;:11;;7973:5;7961:18;;;;;;;;;;;;;;;;7954:25;;7783:204;;;;:::o;7115:129::-;7188:4;7235:1;7212:3;:12;;:19;7225:5;7212:19;;;;;;;;;;;;:24;;7205:31;;7115:129;;;;:::o;7330:109::-;7386:7;7413:3;:11;;:18;;;;7406:25;;7330:109;;;:::o;15124:196::-;15227:12;15259:53;15282:6;15290:4;15296:1;15299:12;15259:22;:53::i;:::-;15252:60;;15124:196;;;;;:::o;5485:1544::-;5551:4;5669:18;5690:3;:12;;:19;5703:5;5690:19;;;;;;;;;;;;5669:40;;5740:1;5726:10;:15;5722:1300;;6088:21;6125:1;6112:10;:14;6088:38;;6141:17;6182:1;6161:3;:11;;:18;;;;:22;6141:42;;6428:17;6448:3;:11;;6460:9;6448:22;;;;;;;;;;;;;;;;6428:42;;6594:9;6565:3;:11;;6577:13;6565:26;;;;;;;;;;;;;;;:38;;;;6713:1;6697:13;:17;6671:3;:12;;:23;6684:9;6671:23;;;;;;;;;;;:43;;;;6823:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;6918:3;:12;;:19;6931:5;6918:19;;;;;;;;;;;6911:26;;;6961:4;6954:11;;;;;;;;5722:1300;7005:5;6998:12;;;5485:1544;;;;;:::o;16501:979::-;16631:12;16664:18;16675:6;16664:10;:18::i;:::-;16656:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16790:12;16804:23;16831:6;:11;;16851:8;16862:4;16831:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16789:78;;;;16882:7;16878:595;;;16913:10;16906:17;;;;;;16878:595;17047:1;17027:10;:17;:21;17023:439;;;17290:10;17284:17;17351:15;17338:10;17334:2;17330:19;17323:44;17238:148;17433:12;17426:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16501:979;;;;;;;:::o;12009:619::-;12069:4;12331:16;12358:19;12380:66;12358:88;;;;12549:7;12537:20;12525:32;;12589:11;12577:8;:23;;:42;;;;;12616:3;12604:15;;:8;:15;;12577:42;12569:51;;;;12009:619;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6a7519d44c13dbe48df9768cec8b48b4d5bae5779b836a3e16e4c2752c74697a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.