Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000,067,239.22511169350621523 LAMBO
Holders
93
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000000000001 LAMBOValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LamboToken
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /* 🌎 Website: https://Lambo.DefiFactory.finance 👉 Telegram: https://t.me/LamboTokenOwners */ struct TaxAmountsInput { address sender; address recipient; uint transferAmount; uint senderRealBalance; uint recipientRealBalance; } struct TaxAmountsOutput { uint senderRealBalance; uint recipientRealBalance; uint burnAndRewardAmount; uint recipientGetsAmount; } struct TemporaryReferralRealAmountsBulk { address addr; uint realBalance; } interface INoBotsTech { function prepareTaxAmounts( TaxAmountsInput calldata taxAmountsInput ) external returns(TaxAmountsOutput memory taxAmountsOutput); function getTemporaryReferralRealAmountsBulk(address[] calldata addrs) external view returns (TemporaryReferralRealAmountsBulk[] memory); function prepareHumanAddressMintOrBurnRewardsAmounts(bool isMint, address account, uint desiredAmountToMintOrBurn) external returns (uint realAmountToMintOrBurn); function getBalance(address account, uint accountBalance) external view returns(uint); function getRealBalance(address account, uint accountBalance) external view returns(uint); function getRealBalanceTeamVestingContract(uint accountBalance) external view returns(uint); function getTotalSupply() external view returns (uint); function grantRole(bytes32 role, address account) external; function getCalculatedReferrerRewards(address addr, address[] calldata referrals) external view returns (uint); function getCachedReferrerRewards(address addr) external view returns (uint); function updateReferrersRewards(address[] calldata referrals) external; function clearReferrerRewards(address addr) external; function chargeCustomTax(uint taxAmount, uint accountBalance) external returns (uint); function chargeCustomTaxTeamVestingContract(uint taxAmount, uint accountBalance) external returns (uint); function registerReferral(address referral, address referrer) external; function filterNonZeroReferrals(address[] calldata referrals) external view returns (address[] memory); function publicForcedUpdateCacheMultiplier() external; event MultiplierUpdated(uint newMultiplier); event BotTransactionDetected(address from, address to, uint transferAmount, uint taxedAmount); event ReferrerRewardUpdated(address referrer, uint amount); event ReferralRegistered(address referral, address referrer); event ReferrerReplaced(address referral, address referrerFrom, address referrerTo); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `ROLE_ADMIN`, 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 `ROLE_ADMIN` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant ROLE_ADMIN = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // 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)); } } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping (bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } } /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Mod is Context, IERC20, IERC20Metadata { mapping (address => uint256) internal _RealBalances; mapping (address => mapping (address => uint256)) internal _allowances; string internal _name; string internal _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // overriden in parent contract } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _RealBalances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) { return keccak256( abi.encode( typeHash, name, version, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20Mod, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping (address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") { } /** * @dev See {IERC20Permit-permit}. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override { // solhint-disable-next-line not-rely-on-time require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( _PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline ) ); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } contract LamboToken is Context, AccessControlEnumerable, ERC20Mod, ERC20Permit { bytes32 public constant ROLE_MINTER = keccak256("ROLE_MINTER"); bytes32 public constant ROLE_BURNER = keccak256("ROLE_BURNER"); bytes32 public constant ROLE_TRANSFERER = keccak256("ROLE_TRANSFERER"); bytes32 public constant ROLE_MODERATOR = keccak256("ROLE_MODERATOR"); bytes32 public constant ROLE_TAXER = keccak256("ROLE_TAXER"); uint constant NOBOTS_TECH_CONTRACT_ID = 0; uint constant TEAM_VESTING_CONTRACT_ID = 1; address[] utilsContracts; struct AccessSettings { bool isMinter; bool isBurner; bool isTransferer; bool isModerator; bool isTaxer; address addr; } bool public isPaused; address constant BURN_ADDRESS = address(0x0); address constant DEAD_ADDRESS = 0xdEad000000000000000000000000000000000000; event VestedAmountClaimed(address recipient, uint amount); event UpdatedUtilsContracts(AccessSettings[] accessSettings); event TransferCustom(address sender, address recipient, uint amount); event MintHumanAddress(address recipient, uint amount); event BurnHumanAddress(address sender, uint amount); event MintedByBridge(address recipient, uint amount); event BurnedByBridge(address sender, uint amount); constructor() ERC20Mod("Lambo Token t.me/LamboTokenOwners", "LAMBO") ERC20Permit("Lambo Token") { _setupRole(ROLE_ADMIN, _msgSender()); _setupRole(ROLE_MINTER, _msgSender()); _setupRole(ROLE_BURNER, _msgSender()); _setupRole(ROLE_TRANSFERER, _msgSender()); _setupRole(ROLE_MODERATOR, _msgSender()); _setupRole(ROLE_TAXER, _msgSender()); } modifier notPausedContract { require( !isPaused, "T: paused" ); _; } modifier pausedContract { require( isPaused, "T: !paused" ); _; } function updateNameAndSymbol(string calldata __name, string calldata __symbol) external onlyRole(ROLE_ADMIN) { _name = __name; _symbol = __symbol; } function balanceOf(address account) public view override returns(uint) { return INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]). getBalance(account, _RealBalances[account]); } function totalSupply() public view override returns (uint) { return INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]). getTotalSupply(); } function pauseContract() external notPausedContract onlyRole(ROLE_ADMIN) { isPaused = true; } function resumeContract() external pausedContract onlyRole(ROLE_ADMIN) { isPaused = false; } function transfer(address recipient, uint256 amount) public notPausedContract virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public notPausedContract virtual override returns (bool) { require( sender != BURN_ADDRESS, "T: !burn" ); _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "T: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } function moderatorTransferFromWhilePaused(address sender, address recipient, uint256 amount) external pausedContract onlyRole(ROLE_MODERATOR) returns (bool) { require( sender != BURN_ADDRESS, "T: !burn" ); _transfer(sender, recipient, amount); return true; } function transferCustom(address sender, address recipient, uint256 amount) external notPausedContract onlyRole(ROLE_TRANSFERER) { require( sender != BURN_ADDRESS, "T: !burn" ); _transfer(sender, recipient, amount); emit TransferCustom(sender, recipient, amount); } function _transfer(address sender, address recipient, uint amount) internal virtual override { require( recipient != BURN_ADDRESS, "T: !burn" ); require( sender != recipient, "T: !self" ); INoBotsTech iNoBotsTech = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]); TaxAmountsOutput memory taxAmountsOutput = iNoBotsTech.prepareTaxAmounts( TaxAmountsInput( sender, recipient, amount, _RealBalances[sender], _RealBalances[recipient] ) ); _RealBalances[sender] = taxAmountsOutput.senderRealBalance; _RealBalances[recipient] = taxAmountsOutput.recipientRealBalance; emit Transfer(sender, recipient, taxAmountsOutput.recipientGetsAmount); if (taxAmountsOutput.burnAndRewardAmount > 0) { emit Transfer(sender, BURN_ADDRESS, taxAmountsOutput.burnAndRewardAmount); } } function transferFromTeamVestingContract(address recipient, uint256 amount) external notPausedContract { address vestingContract = utilsContracts[TEAM_VESTING_CONTRACT_ID]; require(vestingContract == _msgSender(), "T: !VESTING_CONTRACT"); INoBotsTech iNoBotsTech = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]); _RealBalances[vestingContract] -= amount; _RealBalances[recipient] += iNoBotsTech.getRealBalanceTeamVestingContract(amount); iNoBotsTech.publicForcedUpdateCacheMultiplier(); emit Transfer(vestingContract, recipient, amount); emit VestedAmountClaimed(recipient, amount); } function chargeCustomTax(address from, uint amount) external notPausedContract onlyRole(ROLE_TAXER) { uint balanceBefore = _RealBalances[from]; INoBotsTech iNoBotsTech = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]); _RealBalances[from] = iNoBotsTech.chargeCustomTax(amount, balanceBefore); uint taxAmount = iNoBotsTech.getBalance(from, balanceBefore - _RealBalances[from]); emit Transfer(from, address(0), taxAmount); } function updateUtilsContracts(AccessSettings[] calldata accessSettings) external onlyRole(ROLE_ADMIN) { for(uint i = 0; i < utilsContracts.length; i++) { revokeRole(ROLE_MINTER, utilsContracts[i]); revokeRole(ROLE_BURNER, utilsContracts[i]); revokeRole(ROLE_TRANSFERER, utilsContracts[i]); revokeRole(ROLE_MODERATOR, utilsContracts[i]); revokeRole(ROLE_TAXER, utilsContracts[i]); } delete utilsContracts; for(uint i = 0; i < accessSettings.length; i++) { if (accessSettings[i].isMinter) grantRole(ROLE_MINTER, accessSettings[i].addr); if (accessSettings[i].isBurner) grantRole(ROLE_BURNER, accessSettings[i].addr); if (accessSettings[i].isTransferer) grantRole(ROLE_TRANSFERER, accessSettings[i].addr); if (accessSettings[i].isModerator) grantRole(ROLE_MODERATOR, accessSettings[i].addr); if (accessSettings[i].isTaxer) grantRole(ROLE_TAXER, accessSettings[i].addr); utilsContracts.push(accessSettings[i].addr); } emit UpdatedUtilsContracts(accessSettings); } function getUtilsContractAtPos(uint pos) external view returns (address) { return utilsContracts[pos]; } function getUtilsContractsCount() external view returns(uint) { return utilsContracts.length; } function mintByBridge(address to, uint desiredAmountToMint) external notPausedContract onlyRole(ROLE_MINTER) { _mintHumanAddress(to, desiredAmountToMint); emit MintedByBridge(to, desiredAmountToMint); } function mintHumanAddress(address to, uint desiredAmountToMint) external notPausedContract onlyRole(ROLE_MINTER) { _mintHumanAddress(to, desiredAmountToMint); emit MintHumanAddress(to, desiredAmountToMint); } function _mintHumanAddress(address to, uint desiredAmountToMint) private { INoBotsTech iNoBotsTech = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]); uint realAmountToMint = iNoBotsTech. prepareHumanAddressMintOrBurnRewardsAmounts( true, to, desiredAmountToMint ); _RealBalances[to] += realAmountToMint; iNoBotsTech.publicForcedUpdateCacheMultiplier(); emit Transfer(address(0), to, desiredAmountToMint); } function burnByBridge(address from, uint desiredAmountToBurn) external notPausedContract onlyRole(ROLE_BURNER) { _burnHumanAddress(from, desiredAmountToBurn); emit BurnedByBridge(from, desiredAmountToBurn); } function burnHumanAddress(address from, uint desiredAmountToBurn) external notPausedContract onlyRole(ROLE_BURNER) { _burnHumanAddress(from, desiredAmountToBurn); emit BurnHumanAddress(from, desiredAmountToBurn); } function _burnHumanAddress(address from, uint desiredAmountToBurn) private { INoBotsTech iNoBotsTech = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]); uint realAmountToBurn = INoBotsTech(utilsContracts[NOBOTS_TECH_CONTRACT_ID]). prepareHumanAddressMintOrBurnRewardsAmounts( false, from, desiredAmountToBurn ); _RealBalances[from] -= realAmountToBurn; iNoBotsTech.publicForcedUpdateCacheMultiplier(); emit Transfer(from, address(0), desiredAmountToBurn); } function getChainId() external view returns (uint) { return block.chainid; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnHumanAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnedByBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintHumanAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintedByBridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferCustom","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"bool","name":"isMinter","type":"bool"},{"internalType":"bool","name":"isBurner","type":"bool"},{"internalType":"bool","name":"isTransferer","type":"bool"},{"internalType":"bool","name":"isModerator","type":"bool"},{"internalType":"bool","name":"isTaxer","type":"bool"},{"internalType":"address","name":"addr","type":"address"}],"indexed":false,"internalType":"struct LamboToken.AccessSettings[]","name":"accessSettings","type":"tuple[]"}],"name":"UpdatedUtilsContracts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestedAmountClaimed","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BURNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MODERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_TAXER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_TRANSFERER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"desiredAmountToBurn","type":"uint256"}],"name":"burnByBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"desiredAmountToBurn","type":"uint256"}],"name":"burnHumanAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"chargeCustomTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pos","type":"uint256"}],"name":"getUtilsContractAtPos","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUtilsContractsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"desiredAmountToMint","type":"uint256"}],"name":"mintByBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"desiredAmountToMint","type":"uint256"}],"name":"mintHumanAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"moderatorTransferFromWhilePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","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":[],"name":"resumeContract","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromTeamVestingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__name","type":"string"},{"internalType":"string","name":"__symbol","type":"string"}],"name":"updateNameAndSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isMinter","type":"bool"},{"internalType":"bool","name":"isBurner","type":"bool"},{"internalType":"bool","name":"isTransferer","type":"bool"},{"internalType":"bool","name":"isModerator","type":"bool"},{"internalType":"bool","name":"isTaxer","type":"bool"},{"internalType":"address","name":"addr","type":"address"}],"internalType":"struct LamboToken.AccessSettings[]","name":"accessSettings","type":"tuple[]"}],"name":"updateUtilsContracts","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600b81526020016a2630b6b137902a37b5b2b760a91b81525080604051806040016040528060018152602001603160f81b81525060405180606001604052806021815260200162003b2a60219139604051806040016040528060058152602001644c414d424f60d81b8152508160049080519060200190620000c7929190620003bf565b508051620000dd906005906020840190620003bf565b5050825160209384012082519284019290922060c083815260e08290524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818a0181905281830198909852606081019590955260808086019390935230858301528051808603909201825293909201909252805194019390932090925261010052506200017890506000336200025a565b620001a47faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b601461336200025a565b620001d07fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d8336200025a565b620001fc7f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e524336200025a565b620002287f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c1336200025a565b620002547f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d1336200025a565b620004a2565b6200027182826200029d60201b62001e061760201c565b60008281526001602090815260409091206200029891839062001e14620002ad821b17901c565b505050565b620002a98282620002cd565b5050565b6000620002c4836001600160a01b0384166200036d565b90505b92915050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620002a9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620003293390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054620003b657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620002c7565b506000620002c7565b828054620003cd9062000465565b90600052602060002090601f016020900481019282620003f157600085556200043c565b82601f106200040c57805160ff19168380011785556200043c565b828001600101855582156200043c579182015b828111156200043c5782518255916020019190600101906200041f565b506200044a9291506200044e565b5090565b5b808211156200044a57600081556001016200044f565b600181811c908216806200047a57607f821691505b602082108114156200049c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051613638620004f26000396000611cbf015260006126c101526000612710015260006126eb0152600061266f0152600061269801526136386000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c8063789210b311610191578063a9059cbb116100e3578063ca15c87311610097578063d547741f11610071578063d547741f14610677578063dd62ed3e1461068a578063eaf9d194146106c357600080fd5b8063ca15c87314610649578063d391014b1461065c578063d505accf1461066457600080fd5b8063b492da91116100c8578063b492da911461061b578063c238651b1461062e578063c4bc5da51461064157600080fd5b8063a9059cbb146105fb578063b187bd261461060e57600080fd5b806391d148541161014557806397c1d32f1161011f57806397c1d32f146105ae5780639cff2eba146105d5578063a457c2d7146105e857600080fd5b806391d148541461054857806392afc33a1461057f57806395d89b41146105a657600080fd5b80638493712a116101765780638493712a146104fb5780638cbfeb0c146105225780639010d07c1461053557600080fd5b8063789210b3146104d55780637ecebe00146104e857600080fd5b8063248a9ca31161024a57806336568abe116101fe57806354ff02d8116101d857806354ff02d81461048857806366830b21146104af57806370a08231146104c257600080fd5b806336568abe1461045a578063395093511461046d578063439766ce1461048057600080fd5b8063313ce5671161022f578063313ce5671461043d5780633408e4701461044c5780633644e5151461045257600080fd5b8063248a9ca3146104075780632f2ff15d1461042a57600080fd5b80630bb9ff5d116102ac5780631bf73b72116102865780631bf73b72146103d95780631f2eba24146103e157806323b872dd146103f457600080fd5b80630bb9ff5d146103a957806318160ddd146103be57806318a8ad87146103c657600080fd5b806306fb1a07116102dd57806306fb1a071461035657806306fdde0314610381578063095ea7b31461039657600080fd5b806301ffc9a7146102f95780630288f0fb14610321575b600080fd5b61030c61030736600461328c565b6106d6565b60405190151581526020015b60405180910390f35b6103487f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c181565b604051908152602001610318565b610369610364366004613231565b61071a565b6040516001600160a01b039091168152602001610318565b610389610758565b60405161031891906134d4565b61030c6103a436600461317e565b6107ea565b6103bc6103b736600461317e565b610800565b005b6103486108c1565b6103bc6103d436600461317e565b610984565b600754610348565b6103bc6103ef36600461317e565b610a37565b61030c6104023660046130d2565b610aea565b610348610415366004613231565b60009081526020819052604090206001015490565b6103bc610438366004613249565b610c30565b60405160128152602001610318565b46610348565b610348610c57565b6103bc610468366004613249565b610c61565b61030c61047b36600461317e565b610c83565b6103bc610cba565b6103487fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d881565b6103bc6104bd36600461317e565b610d15565b6103486104d0366004613086565b610dc8565b6103bc6104e33660046131a7565b610eb3565b6103486104f6366004613086565b6113cc565b6103487f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e52481565b6103bc61053036600461317e565b6113ea565b61036961054336600461326b565b6116c0565b61030c610556366004613249565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6103487faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146181565b6103896116df565b6103487f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d181565b6103bc6105e33660046130d2565b6116ee565b61030c6105f636600461317e565b6117ec565b61030c61060936600461317e565b61189f565b60085461030c9060ff1681565b6103bc61062936600461317e565b6118ec565b61030c61063c3660046130d2565b611b43565b6103bc611bfc565b610348610657366004613231565b611c54565b610348600081565b6103bc61067236600461310d565b611c6b565b6103bc610685366004613249565b611dcf565b6103486106983660046130a0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6103bc6106d13660046132b4565b611dd9565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610714575061071482611e29565b92915050565b60006007828154811061073d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6060600480546107679061359c565b80601f01602080910402602001604051908101604052809291908181526020018280546107939061359c565b80156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b60006107f7338484611e90565b50600192915050565b60085460ff16156108445760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b60448201526064015b60405180910390fd5b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146161086f8133611fe8565b6108798383612066565b604080516001600160a01b0385168152602081018490527f099fc78bcf3c24b8cd6ad4eda1e3eb007e511c09c640af1c46437ded34cf10f291015b60405180910390a1505050565b600060076000815481106108e557634e487b7160e01b600052603260045260246000fd5b60009182526020918290200154604080517fc4e41b2200000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169263c4e41b2292600480840193829003018186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f919061338e565b905090565b60085460ff16156109c35760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d86109ee8133611fe8565b6109f883836121f1565b604080516001600160a01b0385168152602081018490527f0a5b82707bc4ce1d57e909b70adb28e393a34c2ab77e30f862ca2e0e9f8da90591016108b4565b60085460ff1615610a765760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b601461610aa18133611fe8565b610aab8383612066565b604080516001600160a01b0385168152602081018490527f7d48429c6eb871d47dea691d65bb2d1f99eaf5d33e7a06363b8fafb3f6ea017891016108b4565b60085460009060ff1615610b2c5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6001600160a01b038416610b6d5760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b610b788484846123a7565b6001600160a01b038416600090815260036020908152604080832033845290915290205482811015610c115760405162461bcd60e51b8152602060048201526024808201527f543a207472616e7366657220616d6f756e74206578636565647320616c6c6f7760448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161083b565b610c258533610c20868561353e565b611e90565b506001949350505050565b610c3a8282612645565b6000828152600160205260409020610c529082611e14565b505050565b600061097f61266b565b610c6b828261275e565b6000828152600160205260409020610c5290826127e6565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107f7918590610c20908690613507565b60085460ff1615610cf95760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6000610d058133611fe8565b506008805460ff19166001179055565b60085460ff1615610d545760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d8610d7f8133611fe8565b610d8983836121f1565b604080516001600160a01b0385168152602081018490527f3eac2380fcf2b255bd916ae212498a2e55f3c99baab43d3eb29cb6349639d0d291016108b4565b60006007600081548110610dec57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03858116845260029092526040928390205492517f2b04e840000000000000000000000000000000000000000000000000000000008152911691632b04e84091610e639186916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015610e7b57600080fd5b505afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610714919061338e565b6000610ebf8133611fe8565b60005b60075481101561105157610f2b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611dcf565b610f707fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d860078381548110610f1157634e487b7160e01b600052603260045260246000fd5b610fb57f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e52460078381548110610f1157634e487b7160e01b600052603260045260246000fd5b610ffa7f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b61103f7f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b80611049816135d1565b915050610ec2565b5061105e60076000612f59565b60005b8281101561139a5783838281811061108957634e487b7160e01b600052603260045260246000fd5b61109f92602060c0909202019081019150613217565b15611100576111007faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b6014618585848181106110e857634e487b7160e01b600052603260045260246000fd5b905060c0020160a00160208101906104389190613086565b83838281811061112057634e487b7160e01b600052603260045260246000fd5b905060c0020160200160208101906111389190613217565b15611181576111817fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d88585848181106110e857634e487b7160e01b600052603260045260246000fd5b8383828181106111a157634e487b7160e01b600052603260045260246000fd5b905060c0020160400160208101906111b99190613217565b15611202576112027f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e5248585848181106110e857634e487b7160e01b600052603260045260246000fd5b83838281811061122257634e487b7160e01b600052603260045260246000fd5b905060c00201606001602081019061123a9190613217565b15611283576112837f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c18585848181106110e857634e487b7160e01b600052603260045260246000fd5b8383828181106112a357634e487b7160e01b600052603260045260246000fd5b905060c0020160800160208101906112bb9190613217565b15611304576113047f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d18585848181106110e857634e487b7160e01b600052603260045260246000fd5b600784848381811061132657634e487b7160e01b600052603260045260246000fd5b905060c0020160a001602081019061133e9190613086565b81546001810183556000928352602090922090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390921691909117905580611392816135d1565b915050611061565b507f13340c8e795b6b33898709afdee63a73df74c7ca9d8204d3265aa483ac0e403783836040516108b4929190613427565b6001600160a01b038116600090815260066020526040812054610714565b60085460ff16156114295760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6000600760018154811061144d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690503381146114b35760405162461bcd60e51b815260206004820152601460248201527f543a202156455354494e475f434f4e5452414354000000000000000000000000604482015260640161083b565b600060076000815481106114d757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03858116845260029092526040832080549290911693508592909161151290849061353e565b90915550506040517fcb123637000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0382169063cb1236379060240160206040518083038186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a8919061338e565b6001600160a01b038516600090815260026020526040812080549091906115d0908490613507565b92505081905550806001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561161257600080fd5b505af1158015611626573d6000803e3d6000fd5b50505050836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161166f91815260200190565b60405180910390a3604080516001600160a01b0386168152602081018590527f814f4cde641f205fbac4d156545ee0a5850d9338c94b952acec9852c0a52804391015b60405180910390a150505050565b60008281526001602052604081206116d890836127fb565b9392505050565b6060600580546107679061359c565b60085460ff161561172d5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e5246117588133611fe8565b6001600160a01b0384166117995760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b6117a48484846123a7565b604080516001600160a01b038087168252851660208201529081018390527f4f21c37c3184c9b0bbc63a812b0a1a148f15f1bd6db127e7e562d9b043680325906060016116b2565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156118865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083b565b6118953385610c20868561353e565b5060019392505050565b60085460009060ff16156118e15760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6107f73384846123a7565b60085460ff161561192b5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d16119568133611fe8565b6001600160a01b03831660009081526002602052604081205460078054919291829061199257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040517f3609875800000000000000000000000000000000000000000000000000000000815260048101869052602481018490526001600160a01b0390911691508190633609875890604401602060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c919061338e565b6001600160a01b0380871660009081526002602052604081208390559190831690632b04e840908890611a6f908761353e565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aeb919061338e565b905060006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b3391815260200190565b60405180910390a3505050505050565b60085460009060ff16611b855760405162461bcd60e51b815260206004820152600a602482015269150e88085c185d5cd95960b21b604482015260640161083b565b7f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c1611bb08133611fe8565b6001600160a01b038516611bf15760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b610c258585856123a7565b60085460ff16611c3b5760405162461bcd60e51b815260206004820152600a602482015269150e88085c185d5cd95960b21b604482015260640161083b565b6000611c478133611fe8565b506008805460ff19169055565b600081815260016020526040812061071490612807565b83421115611cbb5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161083b565b60007f0000000000000000000000000000000000000000000000000000000000000000888888611cea8c612811565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000611d4582612839565b90506000611d55828787876128a2565b9050896001600160a01b0316816001600160a01b031614611db85760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161083b565b611dc38a8a8a611e90565b50505050505050505050565b610c6b8282612a4b565b6000611de58133611fe8565b611df160048686612f7a565b50611dfe60058484612f7a565b505050505050565b611e108282612a71565b5050565b60006116d8836001600160a01b038416612b0f565b60006001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061071457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610714565b6001600160a01b038316611f0b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083b565b6001600160a01b038216611f875760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16611e1057612024816001600160a01b03166014612b5e565b61202f836020612b5e565b6040516020016120409291906133a6565b60408051601f198184030181529082905262461bcd60e51b825261083b916004016134d4565b6000600760008154811061208a57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546040516342e58a6360e01b8152600160048201526001600160a01b03868116602483015260448201869052909116925082906342e58a6390606401602060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612122919061338e565b6001600160a01b03851660009081526002602052604081208054929350839290919061214f908490613507565b92505081905550816001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b50506040518581526001600160a01b0387169250600091507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6000600760008154811061221557634e487b7160e01b600052603260045260246000fd5b6000918252602082200154600780546001600160a01b03909216935090829061224e57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546040516342e58a6360e01b815260048101929092526001600160a01b0386811660248401526044830186905216906342e58a6390606401602060405180830381600087803b1580156122aa57600080fd5b505af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e2919061338e565b6001600160a01b03851660009081526002602052604081208054929350839290919061230f90849061353e565b92505081905550816001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b5050604051858152600092506001600160a01b03871691507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016121e3565b6001600160a01b0382166123e85760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b816001600160a01b0316836001600160a01b0316141561244a5760405162461bcd60e51b815260206004820152600860248201527f543a202173656c66000000000000000000000000000000000000000000000000604482015260640161083b565b6000600760008154811061246e57634e487b7160e01b600052603260045260246000fd5b6000918252602080832091909101546040805160a0810182526001600160a01b038981168083528982168387018181528486018b81529289526002808952868a205460608701908152928a52909752848820546080850190815294517f815a61e0000000000000000000000000000000000000000000000000000000008152935183166004850152955182166024840152516044830152935160648201529051608482015291169250829063815a61e09060a401608060405180830381600087803b15801561253c57600080fd5b505af1158015612550573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612574919061331d565b80516001600160a01b0387811660008181526002602090815260408083209590955580860151938a16808352918590209390935560608501519351938452939450917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408101511561263e5760006001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040015160405161263591815260200190565b60405180910390a35b5050505050565b6000828152602081905260409020600101546126618133611fe8565b610c528383612a71565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126ba57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03811633146127dc5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161083b565b611e108282612d85565b60006116d8836001600160a01b038416612e04565b60006116d88383612f21565b6000610714825490565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b600061071461284661266b565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561291f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161083b565b8360ff16601b148061293457508360ff16601c145b61298b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161083b565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156129df573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a425760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161083b565b95945050505050565b600082815260208190526040902060010154612a678133611fe8565b610c528383612d85565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16611e10576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612acb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054612b5657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610714565b506000610714565b60606000612b6d83600261351f565b612b78906002613507565b67ffffffffffffffff811115612b9e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bc8576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c0d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c6657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000612c8a84600261351f565b612c95906001613507565b90505b6001811115612d36577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612ce457634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612d0857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612d2f81613585565b9050612c98565b5083156116d85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161083b565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615611e10576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015612f17576000612e2860018361353e565b8554909150600090612e3c9060019061353e565b9050818114612ebd576000866000018281548110612e6a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612e9b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612edc57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610714565b6000915050610714565b6000826000018281548110612f4657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b5080546000825590600052602060002090810190612f779190612ffe565b50565b828054612f869061359c565b90600052602060002090601f016020900481019282612fa85760008555612fee565b82601f10612fc15782800160ff19823516178555612fee565b82800160010185558215612fee579182015b82811115612fee578235825591602001919060010190612fd3565b50612ffa929150612ffe565b5090565b5b80821115612ffa5760008155600101612fff565b80356001600160a01b038116811461302a57600080fd5b919050565b8035801515811461302a57600080fd5b60008083601f840112613050578182fd5b50813567ffffffffffffffff811115613067578182fd5b60208301915083602082850101111561307f57600080fd5b9250929050565b600060208284031215613097578081fd5b6116d882613013565b600080604083850312156130b2578081fd5b6130bb83613013565b91506130c960208401613013565b90509250929050565b6000806000606084860312156130e6578081fd5b6130ef84613013565b92506130fd60208501613013565b9150604084013590509250925092565b600080600080600080600060e0888a031215613127578283fd5b61313088613013565b965061313e60208901613013565b95506040880135945060608801359350608088013560ff81168114613161578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613190578182fd5b61319983613013565b946020939093013593505050565b600080602083850312156131b9578182fd5b823567ffffffffffffffff808211156131d0578384fd5b818501915085601f8301126131e3578384fd5b8135818111156131f1578485fd5b86602060c083028501011115613205578485fd5b60209290920196919550909350505050565b600060208284031215613228578081fd5b6116d88261302f565b600060208284031215613242578081fd5b5035919050565b6000806040838503121561325b578182fd5b823591506130c960208401613013565b6000806040838503121561327d578182fd5b50508035926020909101359150565b60006020828403121561329d578081fd5b81356001600160e01b0319811681146116d8578182fd5b600080600080604085870312156132c9578384fd5b843567ffffffffffffffff808211156132e0578586fd5b6132ec8883890161303f565b90965094506020870135915080821115613304578384fd5b506133118782880161303f565b95989497509550505050565b60006080828403121561332e578081fd5b6040516080810181811067ffffffffffffffff8211171561335d57634e487b7160e01b83526041600452602483fd5b8060405250825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b60006020828403121561339f578081fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133de816017850160208801613555565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161341b816028840160208801613555565b01602801949350505050565b6020808252818101839052600090604080840186845b878110156134c75761344e8261302f565b1515835261345d85830161302f565b15158584015261346e84830161302f565b151584840152606061348181840161302f565b151590840152608061349483820161302f565b15159084015260a06134a7838201613013565b6001600160a01b03169084015260c092830192919091019060010161343d565b5090979650505050505050565b60208152600082518060208401526134f3816040850160208701613555565b601f01601f19169190910160400192915050565b6000821982111561351a5761351a6135ec565b500190565b6000816000190483118215151615613539576135396135ec565b500290565b600082821015613550576135506135ec565b500390565b60005b83811015613570578181015183820152602001613558565b8381111561357f576000848401525b50505050565b600081613594576135946135ec565b506000190190565b600181811c908216806135b057607f821691505b6020821081141561283357634e487b7160e01b600052602260045260246000fd5b60006000198214156135e5576135e56135ec565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220fd4cb3b4874c102196e10505a891c630b6905c83d07c07ccce7392d624b567f564736f6c634300080400334c616d626f20546f6b656e20742e6d652f4c616d626f546f6b656e4f776e657273
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f45760003560e01c8063789210b311610191578063a9059cbb116100e3578063ca15c87311610097578063d547741f11610071578063d547741f14610677578063dd62ed3e1461068a578063eaf9d194146106c357600080fd5b8063ca15c87314610649578063d391014b1461065c578063d505accf1461066457600080fd5b8063b492da91116100c8578063b492da911461061b578063c238651b1461062e578063c4bc5da51461064157600080fd5b8063a9059cbb146105fb578063b187bd261461060e57600080fd5b806391d148541161014557806397c1d32f1161011f57806397c1d32f146105ae5780639cff2eba146105d5578063a457c2d7146105e857600080fd5b806391d148541461054857806392afc33a1461057f57806395d89b41146105a657600080fd5b80638493712a116101765780638493712a146104fb5780638cbfeb0c146105225780639010d07c1461053557600080fd5b8063789210b3146104d55780637ecebe00146104e857600080fd5b8063248a9ca31161024a57806336568abe116101fe57806354ff02d8116101d857806354ff02d81461048857806366830b21146104af57806370a08231146104c257600080fd5b806336568abe1461045a578063395093511461046d578063439766ce1461048057600080fd5b8063313ce5671161022f578063313ce5671461043d5780633408e4701461044c5780633644e5151461045257600080fd5b8063248a9ca3146104075780632f2ff15d1461042a57600080fd5b80630bb9ff5d116102ac5780631bf73b72116102865780631bf73b72146103d95780631f2eba24146103e157806323b872dd146103f457600080fd5b80630bb9ff5d146103a957806318160ddd146103be57806318a8ad87146103c657600080fd5b806306fb1a07116102dd57806306fb1a071461035657806306fdde0314610381578063095ea7b31461039657600080fd5b806301ffc9a7146102f95780630288f0fb14610321575b600080fd5b61030c61030736600461328c565b6106d6565b60405190151581526020015b60405180910390f35b6103487f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c181565b604051908152602001610318565b610369610364366004613231565b61071a565b6040516001600160a01b039091168152602001610318565b610389610758565b60405161031891906134d4565b61030c6103a436600461317e565b6107ea565b6103bc6103b736600461317e565b610800565b005b6103486108c1565b6103bc6103d436600461317e565b610984565b600754610348565b6103bc6103ef36600461317e565b610a37565b61030c6104023660046130d2565b610aea565b610348610415366004613231565b60009081526020819052604090206001015490565b6103bc610438366004613249565b610c30565b60405160128152602001610318565b46610348565b610348610c57565b6103bc610468366004613249565b610c61565b61030c61047b36600461317e565b610c83565b6103bc610cba565b6103487fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d881565b6103bc6104bd36600461317e565b610d15565b6103486104d0366004613086565b610dc8565b6103bc6104e33660046131a7565b610eb3565b6103486104f6366004613086565b6113cc565b6103487f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e52481565b6103bc61053036600461317e565b6113ea565b61036961054336600461326b565b6116c0565b61030c610556366004613249565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6103487faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146181565b6103896116df565b6103487f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d181565b6103bc6105e33660046130d2565b6116ee565b61030c6105f636600461317e565b6117ec565b61030c61060936600461317e565b61189f565b60085461030c9060ff1681565b6103bc61062936600461317e565b6118ec565b61030c61063c3660046130d2565b611b43565b6103bc611bfc565b610348610657366004613231565b611c54565b610348600081565b6103bc61067236600461310d565b611c6b565b6103bc610685366004613249565b611dcf565b6103486106983660046130a0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6103bc6106d13660046132b4565b611dd9565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610714575061071482611e29565b92915050565b60006007828154811061073d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6060600480546107679061359c565b80601f01602080910402602001604051908101604052809291908181526020018280546107939061359c565b80156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b60006107f7338484611e90565b50600192915050565b60085460ff16156108445760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b60448201526064015b60405180910390fd5b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146161086f8133611fe8565b6108798383612066565b604080516001600160a01b0385168152602081018490527f099fc78bcf3c24b8cd6ad4eda1e3eb007e511c09c640af1c46437ded34cf10f291015b60405180910390a1505050565b600060076000815481106108e557634e487b7160e01b600052603260045260246000fd5b60009182526020918290200154604080517fc4e41b2200000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169263c4e41b2292600480840193829003018186803b15801561094757600080fd5b505afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f919061338e565b905090565b60085460ff16156109c35760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d86109ee8133611fe8565b6109f883836121f1565b604080516001600160a01b0385168152602081018490527f0a5b82707bc4ce1d57e909b70adb28e393a34c2ab77e30f862ca2e0e9f8da90591016108b4565b60085460ff1615610a765760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b601461610aa18133611fe8565b610aab8383612066565b604080516001600160a01b0385168152602081018490527f7d48429c6eb871d47dea691d65bb2d1f99eaf5d33e7a06363b8fafb3f6ea017891016108b4565b60085460009060ff1615610b2c5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6001600160a01b038416610b6d5760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b610b788484846123a7565b6001600160a01b038416600090815260036020908152604080832033845290915290205482811015610c115760405162461bcd60e51b8152602060048201526024808201527f543a207472616e7366657220616d6f756e74206578636565647320616c6c6f7760448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161083b565b610c258533610c20868561353e565b611e90565b506001949350505050565b610c3a8282612645565b6000828152600160205260409020610c529082611e14565b505050565b600061097f61266b565b610c6b828261275e565b6000828152600160205260409020610c5290826127e6565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916107f7918590610c20908690613507565b60085460ff1615610cf95760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6000610d058133611fe8565b506008805460ff19166001179055565b60085460ff1615610d545760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d8610d7f8133611fe8565b610d8983836121f1565b604080516001600160a01b0385168152602081018490527f3eac2380fcf2b255bd916ae212498a2e55f3c99baab43d3eb29cb6349639d0d291016108b4565b60006007600081548110610dec57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03858116845260029092526040928390205492517f2b04e840000000000000000000000000000000000000000000000000000000008152911691632b04e84091610e639186916004016001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015610e7b57600080fd5b505afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610714919061338e565b6000610ebf8133611fe8565b60005b60075481101561105157610f2b7faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b60146160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611dcf565b610f707fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d860078381548110610f1157634e487b7160e01b600052603260045260246000fd5b610fb57f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e52460078381548110610f1157634e487b7160e01b600052603260045260246000fd5b610ffa7f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b61103f7f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d160078381548110610f1157634e487b7160e01b600052603260045260246000fd5b80611049816135d1565b915050610ec2565b5061105e60076000612f59565b60005b8281101561139a5783838281811061108957634e487b7160e01b600052603260045260246000fd5b61109f92602060c0909202019081019150613217565b15611100576111007faeaef46186eb59f884e36929b6d682a6ae35e1e43d8f05f058dcefb92b6014618585848181106110e857634e487b7160e01b600052603260045260246000fd5b905060c0020160a00160208101906104389190613086565b83838281811061112057634e487b7160e01b600052603260045260246000fd5b905060c0020160200160208101906111389190613217565b15611181576111817fb5b5a86cc252b1b75a439c6ff372933ceb0690188924e6461150adeb00ab80d88585848181106110e857634e487b7160e01b600052603260045260246000fd5b8383828181106111a157634e487b7160e01b600052603260045260246000fd5b905060c0020160400160208101906111b99190613217565b15611202576112027f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e5248585848181106110e857634e487b7160e01b600052603260045260246000fd5b83838281811061122257634e487b7160e01b600052603260045260246000fd5b905060c00201606001602081019061123a9190613217565b15611283576112837f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c18585848181106110e857634e487b7160e01b600052603260045260246000fd5b8383828181106112a357634e487b7160e01b600052603260045260246000fd5b905060c0020160800160208101906112bb9190613217565b15611304576113047f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d18585848181106110e857634e487b7160e01b600052603260045260246000fd5b600784848381811061132657634e487b7160e01b600052603260045260246000fd5b905060c0020160a001602081019061133e9190613086565b81546001810183556000928352602090922090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390921691909117905580611392816135d1565b915050611061565b507f13340c8e795b6b33898709afdee63a73df74c7ca9d8204d3265aa483ac0e403783836040516108b4929190613427565b6001600160a01b038116600090815260066020526040812054610714565b60085460ff16156114295760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6000600760018154811061144d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690503381146114b35760405162461bcd60e51b815260206004820152601460248201527f543a202156455354494e475f434f4e5452414354000000000000000000000000604482015260640161083b565b600060076000815481106114d757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03858116845260029092526040832080549290911693508592909161151290849061353e565b90915550506040517fcb123637000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0382169063cb1236379060240160206040518083038186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a8919061338e565b6001600160a01b038516600090815260026020526040812080549091906115d0908490613507565b92505081905550806001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561161257600080fd5b505af1158015611626573d6000803e3d6000fd5b50505050836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161166f91815260200190565b60405180910390a3604080516001600160a01b0386168152602081018590527f814f4cde641f205fbac4d156545ee0a5850d9338c94b952acec9852c0a52804391015b60405180910390a150505050565b60008281526001602052604081206116d890836127fb565b9392505050565b6060600580546107679061359c565b60085460ff161561172d5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7f02a8464c3e212c8f1064432774c6cc3e76f14bd7ccdafd9a1d1cf9b43b51e5246117588133611fe8565b6001600160a01b0384166117995760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b6117a48484846123a7565b604080516001600160a01b038087168252851660208201529081018390527f4f21c37c3184c9b0bbc63a812b0a1a148f15f1bd6db127e7e562d9b043680325906060016116b2565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156118865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083b565b6118953385610c20868561353e565b5060019392505050565b60085460009060ff16156118e15760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b6107f73384846123a7565b60085460ff161561192b5760405162461bcd60e51b8152602060048201526009602482015268150e881c185d5cd95960ba1b604482015260640161083b565b7f5772712b2943d95a931c0b3a7ddf59cba41b664500d9b93626000a17809f04d16119568133611fe8565b6001600160a01b03831660009081526002602052604081205460078054919291829061199257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040517f3609875800000000000000000000000000000000000000000000000000000000815260048101869052602481018490526001600160a01b0390911691508190633609875890604401602060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c919061338e565b6001600160a01b0380871660009081526002602052604081208390559190831690632b04e840908890611a6f908761353e565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440160206040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aeb919061338e565b905060006001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b3391815260200190565b60405180910390a3505050505050565b60085460009060ff16611b855760405162461bcd60e51b815260206004820152600a602482015269150e88085c185d5cd95960b21b604482015260640161083b565b7f233299fc8224c0cb5b2b8b651b93354cf11d5245f1374bb37773608ffa1913c1611bb08133611fe8565b6001600160a01b038516611bf15760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b610c258585856123a7565b60085460ff16611c3b5760405162461bcd60e51b815260206004820152600a602482015269150e88085c185d5cd95960b21b604482015260640161083b565b6000611c478133611fe8565b506008805460ff19169055565b600081815260016020526040812061071490612807565b83421115611cbb5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161083b565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888611cea8c612811565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000611d4582612839565b90506000611d55828787876128a2565b9050896001600160a01b0316816001600160a01b031614611db85760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161083b565b611dc38a8a8a611e90565b50505050505050505050565b610c6b8282612a4b565b6000611de58133611fe8565b611df160048686612f7a565b50611dfe60058484612f7a565b505050505050565b611e108282612a71565b5050565b60006116d8836001600160a01b038416612b0f565b60006001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061071457507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610714565b6001600160a01b038316611f0b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083b565b6001600160a01b038216611f875760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16611e1057612024816001600160a01b03166014612b5e565b61202f836020612b5e565b6040516020016120409291906133a6565b60408051601f198184030181529082905262461bcd60e51b825261083b916004016134d4565b6000600760008154811061208a57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546040516342e58a6360e01b8152600160048201526001600160a01b03868116602483015260448201869052909116925082906342e58a6390606401602060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612122919061338e565b6001600160a01b03851660009081526002602052604081208054929350839290919061214f908490613507565b92505081905550816001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b50506040518581526001600160a01b0387169250600091507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6000600760008154811061221557634e487b7160e01b600052603260045260246000fd5b6000918252602082200154600780546001600160a01b03909216935090829061224e57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546040516342e58a6360e01b815260048101929092526001600160a01b0386811660248401526044830186905216906342e58a6390606401602060405180830381600087803b1580156122aa57600080fd5b505af11580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e2919061338e565b6001600160a01b03851660009081526002602052604081208054929350839290919061230f90849061353e565b92505081905550816001600160a01b031663e8ac6e4e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b5050604051858152600092506001600160a01b03871691507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016121e3565b6001600160a01b0382166123e85760405162461bcd60e51b81526020600482015260086024820152672a1d1010b13ab93760c11b604482015260640161083b565b816001600160a01b0316836001600160a01b0316141561244a5760405162461bcd60e51b815260206004820152600860248201527f543a202173656c66000000000000000000000000000000000000000000000000604482015260640161083b565b6000600760008154811061246e57634e487b7160e01b600052603260045260246000fd5b6000918252602080832091909101546040805160a0810182526001600160a01b038981168083528982168387018181528486018b81529289526002808952868a205460608701908152928a52909752848820546080850190815294517f815a61e0000000000000000000000000000000000000000000000000000000008152935183166004850152955182166024840152516044830152935160648201529051608482015291169250829063815a61e09060a401608060405180830381600087803b15801561253c57600080fd5b505af1158015612550573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612574919061331d565b80516001600160a01b0387811660008181526002602090815260408083209590955580860151938a16808352918590209390935560608501519351938452939450917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408101511561263e5760006001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040015160405161263591815260200190565b60405180910390a35b5050505050565b6000828152602081905260409020600101546126618133611fe8565b610c528383612a71565b60007f00000000000000000000000000000000000000000000000000000000000000014614156126ba57507f8d7abbdfd166a856779d151b4fb4781b2c47363e4d5af0aad87d43e9b7eaf3f690565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f83df4f97cd5f1d776e5b9fdf564123ca957882b8f56187c0a15ffef598ee085a828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b03811633146127dc5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161083b565b611e108282612d85565b60006116d8836001600160a01b038416612e04565b60006116d88383612f21565b6000610714825490565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b600061071461284661266b565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561291f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161083b565b8360ff16601b148061293457508360ff16601c145b61298b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161083b565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156129df573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a425760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161083b565b95945050505050565b600082815260208190526040902060010154612a678133611fe8565b610c528383612d85565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16611e10576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055612acb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054612b5657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610714565b506000610714565b60606000612b6d83600261351f565b612b78906002613507565b67ffffffffffffffff811115612b9e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bc8576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612c0d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c6657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000612c8a84600261351f565b612c95906001613507565b90505b6001811115612d36577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612ce457634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110612d0857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93612d2f81613585565b9050612c98565b5083156116d85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161083b565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615611e10576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60008181526001830160205260408120548015612f17576000612e2860018361353e565b8554909150600090612e3c9060019061353e565b9050818114612ebd576000866000018281548110612e6a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612e9b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612edc57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610714565b6000915050610714565b6000826000018281548110612f4657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b5080546000825590600052602060002090810190612f779190612ffe565b50565b828054612f869061359c565b90600052602060002090601f016020900481019282612fa85760008555612fee565b82601f10612fc15782800160ff19823516178555612fee565b82800160010185558215612fee579182015b82811115612fee578235825591602001919060010190612fd3565b50612ffa929150612ffe565b5090565b5b80821115612ffa5760008155600101612fff565b80356001600160a01b038116811461302a57600080fd5b919050565b8035801515811461302a57600080fd5b60008083601f840112613050578182fd5b50813567ffffffffffffffff811115613067578182fd5b60208301915083602082850101111561307f57600080fd5b9250929050565b600060208284031215613097578081fd5b6116d882613013565b600080604083850312156130b2578081fd5b6130bb83613013565b91506130c960208401613013565b90509250929050565b6000806000606084860312156130e6578081fd5b6130ef84613013565b92506130fd60208501613013565b9150604084013590509250925092565b600080600080600080600060e0888a031215613127578283fd5b61313088613013565b965061313e60208901613013565b95506040880135945060608801359350608088013560ff81168114613161578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613190578182fd5b61319983613013565b946020939093013593505050565b600080602083850312156131b9578182fd5b823567ffffffffffffffff808211156131d0578384fd5b818501915085601f8301126131e3578384fd5b8135818111156131f1578485fd5b86602060c083028501011115613205578485fd5b60209290920196919550909350505050565b600060208284031215613228578081fd5b6116d88261302f565b600060208284031215613242578081fd5b5035919050565b6000806040838503121561325b578182fd5b823591506130c960208401613013565b6000806040838503121561327d578182fd5b50508035926020909101359150565b60006020828403121561329d578081fd5b81356001600160e01b0319811681146116d8578182fd5b600080600080604085870312156132c9578384fd5b843567ffffffffffffffff808211156132e0578586fd5b6132ec8883890161303f565b90965094506020870135915080821115613304578384fd5b506133118782880161303f565b95989497509550505050565b60006080828403121561332e578081fd5b6040516080810181811067ffffffffffffffff8211171561335d57634e487b7160e01b83526041600452602483fd5b8060405250825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b60006020828403121561339f578081fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133de816017850160208801613555565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161341b816028840160208801613555565b01602801949350505050565b6020808252818101839052600090604080840186845b878110156134c75761344e8261302f565b1515835261345d85830161302f565b15158584015261346e84830161302f565b151584840152606061348181840161302f565b151590840152608061349483820161302f565b15159084015260a06134a7838201613013565b6001600160a01b03169084015260c092830192919091019060010161343d565b5090979650505050505050565b60208152600082518060208401526134f3816040850160208701613555565b601f01601f19169190910160400192915050565b6000821982111561351a5761351a6135ec565b500190565b6000816000190483118215151615613539576135396135ec565b500290565b600082821015613550576135506135ec565b500390565b60005b83811015613570578181015183820152602001613558565b8381111561357f576000848401525b50505050565b600081613594576135946135ec565b506000190190565b600181811c908216806135b057607f821691505b6020821081141561283357634e487b7160e01b600052602260045260246000fd5b60006000198214156135e5576135e56135ec565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220fd4cb3b4874c102196e10505a891c630b6905c83d07c07ccce7392d624b567f564736f6c63430008040033
Deployed Bytecode Sourcemap
55176:11231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26137:227;;;;;;:::i;:::-;;:::i;:::-;;;10254:14:1;;10247:22;10229:41;;10217:2;10202:18;26137:227:0;;;;;;;;55477:68;;55518:27;55477:68;;;;;10810:25:1;;;10798:2;10783:18;55477:68:0;10765:76:1;63586:150:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8046:55:1;;;8028:74;;8016:2;8001:18;63586:150:0;7983:125:1;35779:100:0;;;:::i;:::-;;;;;;;:::i;37881:169::-;;;;;;:::i;:::-;;:::i;64171:264::-;;;;;;:::i;:::-;;:::i;:::-;;57763:214;;;:::i;65333:269::-;;;;;;:::i;:::-;;:::i;63748:141::-;63860:14;:21;63748:141;;63901:258;;;;;;:::i;:::-;;:::i;58550:582::-;;;;;;:::i;:::-;;:::i;12886:123::-;;;;;;:::i;:::-;12952:7;12979:12;;;;;;;;;;:22;;;;12886:123;27508:165;;;;;;:::i;:::-;;:::i;36741:93::-;;;36824:2;19902:36:1;;19890:2;19875:18;36741:93:0;19857:87:1;66278:126:0;66383:13;66278:126;;54709:115;;;:::i;28031:174::-;;;;;;:::i;:::-;;:::i;39056:215::-;;;;;;:::i;:::-;;:::i;57989:139::-;;;:::i;55331:62::-;;55369:24;55331:62;;65062:263;;;;;;:::i;:::-;;:::i;57498:253::-;;;;;;:::i;:::-;;:::i;62338:1236::-;;;;;;:::i;:::-;;:::i;54451:128::-;;;;;;:::i;:::-;;:::i;55400:70::-;;55442:28;55400:70;;61051:734;;;;;;:::i;:::-;;:::i;26963:145::-;;;;;;:::i;:::-;;:::i;11884:139::-;;;;;;:::i;:::-;11962:4;11986:12;;;;;;;;;;;-1:-1:-1;;;;;11986:29:0;;;;;;;;;;;;;;;11884:139;55262:62;;55300:24;55262:62;;35998:104;;;:::i;55552:60::-;;55589:23;55552:60;;59527:373;;;;;;:::i;:::-;;:::i;39774:377::-;;;;;;:::i;:::-;;:::i;58290:248::-;;;;;;:::i;:::-;;:::i;55966:20::-;;;;;;;;;61797:529;;;;;;:::i;:::-;;:::i;59144:371::-;;;;;;:::i;:::-;;:::i;58140:138::-;;;:::i;27282:134::-;;;;;;:::i;:::-;;:::i;9857:41::-;;9894:4;9857:41;;53614:771;;;;;;:::i;:::-;;:::i;27766:170::-;;;;;;:::i;:::-;;:::i;37583:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;37699:18:0;;;37672:7;37699:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37583:151;57292:194;;;;;;:::i;:::-;;:::i;26137:227::-;26222:4;-1:-1:-1;;;;;;26246:57:0;;26261:42;26246:57;;:110;;;26320:36;26344:11;26320:23;:36::i;:::-;26239:117;26137:227;-1:-1:-1;;26137:227:0:o;63586:150::-;63677:7;63709:14;63724:3;63709:19;;;;;;-1:-1:-1;;;63709:19:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63709:19:0;;63586:150;-1:-1:-1;;63586:150:0:o;35779:100::-;35833:13;35866:5;35859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35779:100;:::o;37881:169::-;37964:4;37981:39;3728:10;38004:7;38013:6;37981:8;:39::i;:::-;-1:-1:-1;38038:4:0;37881:169;;;;:::o;64171:264::-;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;;;;;;;;;55300:24:::1;11453:30;55300:24:::0;3728:10;11453::::1;:30::i;:::-;64328:42:::2;64346:2;64350:19;64328:17;:42::i;:::-;64386:41;::::0;;-1:-1:-1;;;;;8708:55:1;;8690:74;;8795:2;8780:18;;8773:34;;;64386:41:0::2;::::0;8663:18:1;64386:41:0::2;;;;;;;;57136:1:::1;64171:264:::0;;:::o;57763:214::-;57856:4;57898:14;55665:1;57898:39;;;;;;-1:-1:-1;;;57898:39:0;;;;;;;;;;;;;;;;;;;;57886:83;;;;;;;;-1:-1:-1;;;;;57898:39:0;;;;57886:81;;:83;;;;;;;;;;57898:39;57886:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57879:90;;57763:214;:::o;65333:269::-;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;55369:24:::1;11453:30;55369:24:::0;3728:10;11453::::1;:30::i;:::-;65491:44:::2;65509:4;65515:19;65491:17;:44::i;:::-;65551:43;::::0;;-1:-1:-1;;;;;8708:55:1;;8690:74;;8795:2;8780:18;;8773:34;;;65551:43:0::2;::::0;8663:18:1;65551:43:0::2;8645:168:1::0;63901:258:0;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;55300:24:::1;11453:30;55300:24:::0;3728:10;11453::::1;:30::i;:::-;64054:42:::2;64072:2;64076:19;64054:17;:42::i;:::-;64112:39;::::0;;-1:-1:-1;;;;;8708:55:1;;8690:74;;8795:2;8780:18;;8773:34;;;64112:39:0::2;::::0;8663:18:1;64112:39:0::2;8645:168:1::0;58550:582:0;57080:8;;58723:4;;57080:8;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;-1:-1:-1;;;;;58768:22:0;::::1;58746:80;;;::::0;-1:-1:-1;;;58746:80:0;;16369:2:1;58746:80:0::1;::::0;::::1;16351:21:1::0;16408:1;16388:18;;;16381:29;-1:-1:-1;;;16426:18:1;;;16419:38;16474:18;;58746:80:0::1;16341:157:1::0;58746:80:0::1;58837:36;58847:6;58855:9;58866:6;58837:9;:36::i;:::-;-1:-1:-1::0;;;;;58913:19:0;::::1;58886:24;58913:19:::0;;;:11:::1;:19;::::0;;;;;;;3728:10;58913:33;;;;;;;;58965:26;;::::1;;58957:75;;;::::0;-1:-1:-1;;;58957:75:0;;13689:2:1;58957:75:0::1;::::0;::::1;13671:21:1::0;13728:2;13708:18;;;13701:30;13767:34;13747:18;;;13740:62;13838:6;13818:18;;;13811:34;13862:19;;58957:75:0::1;13661:226:1::0;58957:75:0::1;59043:57;59052:6:::0;3728:10;59074:25:::1;59093:6:::0;59074:16;:25:::1;:::i;:::-;59043:8;:57::i;:::-;-1:-1:-1::0;59120:4:0::1;::::0;58550:582;-1:-1:-1;;;;58550:582:0:o;27508:165::-;27593:30;27609:4;27615:7;27593:15;:30::i;:::-;27634:18;;;;:12;:18;;;;;:31;;27657:7;27634:22;:31::i;:::-;;27508:165;;:::o;54709:115::-;54769:7;54796:20;:18;:20::i;28031:174::-;28119:33;28138:4;28144:7;28119:18;:33::i;:::-;28163:18;;;;:12;:18;;;;;:34;;28189:7;28163:25;:34::i;39056:215::-;3728:10;39144:4;39193:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;39193:34:0;;;;;;;;;;39144:4;;39161:80;;39184:7;;39193:47;;39230:10;;39193:47;:::i;57989:139::-;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;9894:4:::1;11453:30;9894:4:::0;3728:10;11453::::1;:30::i;:::-;-1:-1:-1::0;58105:8:0::2;:15:::0;;-1:-1:-1;;58105:15:0::2;58116:4;58105:15;::::0;;57989:139::o;65062:263::-;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;55369:24:::1;11453:30;55369:24:::0;3728:10;11453::::1;:30::i;:::-;65216:44:::2;65234:4;65240:19;65216:17;:44::i;:::-;65276:41;::::0;;-1:-1:-1;;;;;8708:55:1;;8690:74;;8795:2;8780:18;;8773:34;;;65276:41:0::2;::::0;8663:18:1;65276:41:0::2;8645:168:1::0;57498:253:0;57603:4;57645:14;55665:1;57645:39;;;;;;-1:-1:-1;;;57645:39:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57720:22:0;;;;;:13;:22;;;;;;;;;57633:110;;;;;57645:39;;;57633:77;;:110;;57711:7;;57633:110;;-1:-1:-1;;;;;8708:55:1;;;;8690:74;;8795:2;8780:18;;8773:34;8678:2;8663:18;;8645:168;57633:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;62338:1236::-;9894:4;11453:30;9894:4;3728:10;11453::::1;:30::i;:::-:0;62478:6:::1;62474:360;62494:14;:21:::0;62490:25;::::1;62474:360;;;62546:42;55300:24;62570:14;62585:1;62570:17;;;;;;-1:-1:-1::0;;;62570:17:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;62570:17:0::1;62546:10;:42::i;:::-;62603;55369:24;62627:14;62642:1;62627:17;;;;;;-1:-1:-1::0;;;62627:17:0::1;;;;;;;;62603:42;62660:46;55442:28;62688:14;62703:1;62688:17;;;;;;-1:-1:-1::0;;;62688:17:0::1;;;;;;;;62660:46;62721:45;55518:27;62748:14;62763:1;62748:17;;;;;;-1:-1:-1::0;;;62748:17:0::1;;;;;;;;62721:45;62781:41;55589:23;62804:14;62819:1;62804:17;;;;;;-1:-1:-1::0;;;62804:17:0::1;;;;;;;;62781:41;62517:3:::0;::::1;::::0;::::1;:::i;:::-;;;;62474:360;;;-1:-1:-1::0;62844:21:0::1;62851:14;;62844:21;:::i;:::-;62890:6;62886:618;62902:25:::0;;::::1;62886:618;;;62962:14;;62977:1;62962:17;;;;;-1:-1:-1::0;;;62962:17:0::1;;;;;;;;;:26;::::0;::::1;:17;::::0;;::::1;;:26:::0;;::::1;::::0;-1:-1:-1;62962:26:0::1;:::i;:::-;62958:78;;;62990:46;55300:24;63013:14;;63028:1;63013:17;;;;;-1:-1:-1::0;;;63013:17:0::1;;;;;;;;;;;;;;:22;;;;;;;;;;:::i;62990:46::-;63055:14;;63070:1;63055:17;;;;;-1:-1:-1::0;;;63055:17:0::1;;;;;;;;;;;;;;:26;;;;;;;;;;:::i;:::-;63051:78;;;63083:46;55369:24;63106:14;;63121:1;63106:17;;;;;-1:-1:-1::0;;;63106:17:0::1;;;;;;;;63083:46;63148:14;;63163:1;63148:17;;;;;-1:-1:-1::0;;;63148:17:0::1;;;;;;;;;;;;;;:30;;;;;;;;;;:::i;:::-;63144:86;;;63180:50;55442:28;63207:14;;63222:1;63207:17;;;;;-1:-1:-1::0;;;63207:17:0::1;;;;;;;;63180:50;63249:14;;63264:1;63249:17;;;;;-1:-1:-1::0;;;63249:17:0::1;;;;;;;;;;;;;;:29;;;;;;;;;;:::i;:::-;63245:84;;;63280:49;55518:27;63306:14;;63321:1;63306:17;;;;;-1:-1:-1::0;;;63306:17:0::1;;;;;;;;63280:49;63348:14;;63363:1;63348:17;;;;;-1:-1:-1::0;;;63348:17:0::1;;;;;;;;;;;;;;:25;;;;;;;;;;:::i;:::-;63344:76;;;63375:45;55589:23;63397:14;;63412:1;63397:17;;;;;-1:-1:-1::0;;;63397:17:0::1;;;;;;;;63375:45;63449:14;63469;;63484:1;63469:17;;;;;-1:-1:-1::0;;;63469:17:0::1;;;;;;;;;;;;;;:22;;;;;;;;;;:::i;:::-;63449:43:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;63449:43:0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;63449:43:0;;::::1;::::0;;;::::1;::::0;;62929:3;::::1;::::0;::::1;:::i;:::-;;;;62886:618;;;;63529:37;63551:14;;63529:37;;;;;;;:::i;54451:128::-:0;-1:-1:-1;;;;;54547:14:0;;54520:7;54547:14;;;:7;:14;;;;;51946;54547:24;51854:114;61051:734;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;61188:23:::1;61214:14;55714:1;61214:40;;;;;;-1:-1:-1::0;;;61214:40:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61214:40:0::1;::::0;-1:-1:-1;3728:10:0;61273:31;::::1;61265:64;;;::::0;-1:-1:-1;;;61265:64:0;;15258:2:1;61265:64:0::1;::::0;::::1;15240:21:1::0;15297:2;15277:18;;;15270:30;15336:22;15316:18;;;15309:50;15376:18;;61265:64:0::1;15230:170:1::0;61265:64:0::1;61350:23;61388:14;55665:1;61388:39;;;;;;-1:-1:-1::0;;;61388:39:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;61439:30:0;;::::1;::::0;;:13:::1;:30:::0;;;;;;:40;;61388:39;;;::::1;::::0;-1:-1:-1;61473:6:0;;61439:30;;:40:::1;::::0;61473:6;;61439:40:::1;:::i;:::-;::::0;;;-1:-1:-1;;61532:53:0::1;::::0;;;;::::1;::::0;::::1;10810:25:1::0;;;-1:-1:-1;;;;;61532:45:0;::::1;::::0;::::1;::::0;10783:18:1;;61532:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61490:24:0;::::1;;::::0;;;:13:::1;:24;::::0;;;;:95;;:24;;;:95:::1;::::0;;;::::1;:::i;:::-;;;;;;;;61606:11;-1:-1:-1::0;;;;;61606:45:0::1;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61705:9;-1:-1:-1::0;;;;;61679:44:0::1;61688:15;-1:-1:-1::0;;;;;61679:44:0::1;;61716:6;61679:44;;;;10810:25:1::0;;10798:2;10783:18;;10765:76;61679:44:0::1;;;;;;;;61739:38;::::0;;-1:-1:-1;;;;;8708:55:1;;8690:74;;8795:2;8780:18;;8773:34;;;61739:38:0::1;::::0;8663:18:1;61739:38:0::1;;;;;;;;57136:1;;61051:734:::0;;:::o;26963:145::-;27045:7;27072:18;;;:12;:18;;;;;:28;;27094:5;27072:21;:28::i;:::-;27065:35;26963:145;-1:-1:-1;;;26963:145:0:o;35998:104::-;36054:13;36087:7;36080:14;;;;;:::i;59527:373::-;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;55442:28:::1;11453:30;55442:28:::0;3728:10;11453::::1;:30::i;:::-;-1:-1:-1::0;;;;;59720:22:0;::::2;59698:80;;;::::0;-1:-1:-1;;;59698:80:0;;16369:2:1;59698:80:0::2;::::0;::::2;16351:21:1::0;16408:1;16388:18;;;16381:29;-1:-1:-1;;;16426:18:1;;;16419:38;16474:18;;59698:80:0::2;16341:157:1::0;59698:80:0::2;59789:36;59799:6;59807:9;59818:6;59789:9;:36::i;:::-;59851:41;::::0;;-1:-1:-1;;;;;8394:15:1;;;8376:34;;8446:15;;8441:2;8426:18;;8419:43;8478:18;;;8471:34;;;59851:41:0::2;::::0;8303:2:1;8288:18;59851:41:0::2;8270:241:1::0;39774:377:0;3728:10;39867:4;39911:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;39911:34:0;;;;;;;;;;39964:35;;;;39956:85;;;;-1:-1:-1;;;39956:85:0;;18122:2:1;39956:85:0;;;18104:21:1;18161:2;18141:18;;;18134:30;18200:34;18180:18;;;18173:62;18271:7;18251:18;;;18244:35;18296:19;;39956:85:0;18094:227:1;39956:85:0;40052:67;3728:10;40075:7;40084:34;40103:15;40084:16;:34;:::i;40052:67::-;-1:-1:-1;40139:4:0;;39774:377;-1:-1:-1;;;39774:377:0:o;58290:248::-;57080:8;;58443:4;;57080:8;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;58466:42:::1;3728:10:::0;58490:9:::1;58501:6;58466:9;:42::i;61797:529::-:0;57080:8;;;;57079:9;57057:68;;;;-1:-1:-1;;;57057:68:0;;16705:2:1;57057:68:0;;;16687:21:1;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:1;;;16755:39;16811:18;;57057:68:0;16677:158:1;57057:68:0;55589:23:::1;11453:30;55589:23:::0;3728:10;11453::::1;:30::i;:::-;-1:-1:-1::0;;;;;61961:19:0;::::2;61940:18;61961:19:::0;;;:13:::2;:19;::::0;;;;;62039:14:::2;:39:::0;;61961:19;;61940:18;;;62039:39:::2;;-1:-1:-1::0;;;62039:39:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;62112:50:::2;::::0;;;;::::2;::::0;::::2;19681:25:1::0;;;19722:18;;;19715:34;;;-1:-1:-1;;;;;62039:39:0;;::::2;::::0;-1:-1:-1;62039:39:0;;62112:27:::2;::::0;19654:18:1;;62112:50:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62090:19:0;;::::2;;::::0;;;:13:::2;:19;::::0;;;;:72;;;:19;62200:22;;::::2;::::0;::::2;::::0;62104:4;;62229:35:::2;::::0;:13;:35:::2;:::i;:::-;62200:65;::::0;-1:-1:-1;;;;;;62200:65:0::2;::::0;;;;;;-1:-1:-1;;;;;8708:55:1;;;62200:65:0::2;::::0;::::2;8690:74:1::0;8780:18;;;8773:34;8663:18;;62200:65:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62183:82;;62304:1;-1:-1:-1::0;;;;;62281:37:0::2;62290:4;-1:-1:-1::0;;;;;62281:37:0::2;;62308:9;62281:37;;;;10810:25:1::0;;10798:2;10783:18;;10765:76;62281:37:0::2;;;;;;;;11494:1;;;57136::::1;61797:529:::0;;:::o;59144:371::-;57214:8;;59333:4;;57214:8;;57192:68;;;;-1:-1:-1;;;57192:68:0;;17783:2:1;57192:68:0;;;17765:21:1;17822:2;17802:18;;;17795:30;-1:-1:-1;;;17841:18:1;;;17834:40;17891:18;;57192:68:0;17755:160:1;57192:68:0;55518:27:::1;11453:30;55518:27:::0;3728:10;11453::::1;:30::i;:::-;-1:-1:-1::0;;;;;59378:22:0;::::2;59356:80;;;::::0;-1:-1:-1;;;59356:80:0;;16369:2:1;59356:80:0::2;::::0;::::2;16351:21:1::0;16408:1;16388:18;;;16381:29;-1:-1:-1;;;16426:18:1;;;16419:38;16474:18;;59356:80:0::2;16341:157:1::0;59356:80:0::2;59447:36;59457:6;59465:9;59476:6;59447:9;:36::i;58140:138::-:0;57214:8;;;;57192:68;;;;-1:-1:-1;;;57192:68:0;;17783:2:1;57192:68:0;;;17765:21:1;17822:2;17802:18;;;17795:30;-1:-1:-1;;;17841:18:1;;;17834:40;17891:18;;57192:68:0;17755:160:1;57192:68:0;9894:4:::1;11453:30;9894:4:::0;3728:10;11453::::1;:30::i;:::-;-1:-1:-1::0;58254:8:0::2;:16:::0;;-1:-1:-1;;58254:16:0::2;::::0;;58140:138::o;27282:134::-;27354:7;27381:18;;;:12;:18;;;;;:27;;:25;:27::i;53614:771::-;53843:8;53824:15;:27;;53816:69;;;;-1:-1:-1;;;53816:69:0;;14497:2:1;53816:69:0;;;14479:21:1;14536:2;14516:18;;;14509:30;14575:31;14555:18;;;14548:59;14624:18;;53816:69:0;14469:179:1;53816:69:0;53898:18;53972:16;54007:5;54031:7;54057:5;54081:16;54091:5;54081:9;:16::i;:::-;53943:196;;;;;;11133:25:1;;;;-1:-1:-1;;;;;11255:15:1;;;11235:18;;;11228:43;11307:15;;;;11287:18;;;11280:43;11339:18;;;11332:34;11382:19;;;11375:35;11426:19;;;11419:35;;;11105:19;;53943:196:0;;;;;;;;;;;;53919:231;;;;;;53898:252;;54163:12;54178:28;54195:10;54178:16;:28::i;:::-;54163:43;;54219:14;54236:28;54250:4;54256:1;54259;54262;54236:13;:28::i;:::-;54219:45;;54293:5;-1:-1:-1;;;;;54283:15:0;:6;-1:-1:-1;;;;;54283:15:0;;54275:58;;;;-1:-1:-1;;;54275:58:0;;16010:2:1;54275:58:0;;;15992:21:1;16049:2;16029:18;;;16022:30;16088:32;16068:18;;;16061:60;16138:18;;54275:58:0;15982:180:1;54275:58:0;54346:31;54355:5;54362:7;54371:5;54346:8;:31::i;:::-;53614:771;;;;;;;;;;:::o;27766:170::-;27852:31;27869:4;27875:7;27852:16;:31::i;57292:194::-;9894:4;11453:30;9894:4;3728:10;11453::::1;:30::i;:::-:0;57435:14:::1;:5;57443:6:::0;;57435:14:::1;:::i;:::-;-1:-1:-1::0;57460:18:0::1;:7;57470:8:::0;;57460:18:::1;:::i;:::-;;57292:194:::0;;;;;:::o;15120:112::-;15199:25;15210:4;15216:7;15199:10;:25::i;:::-;15120:112;;:::o;22379:152::-;22449:4;22473:50;22478:3;-1:-1:-1;;;;;22498:23:0;;22473:4;:50::i;11575:217::-;11660:4;-1:-1:-1;;;;;;11684:47:0;;11699:32;11684:47;;:100;;-1:-1:-1;7547:25:0;-1:-1:-1;;;;;;7532:40:0;;;11748:36;7423:157;41171:346;-1:-1:-1;;;;;41273:19:0;;41265:68;;;;-1:-1:-1;;;41265:68:0;;17378:2:1;41265:68:0;;;17360:21:1;17417:2;17397:18;;;17390:30;17456:34;17436:18;;;17429:62;17527:6;17507:18;;;17500:34;17551:19;;41265:68:0;17350:226:1;41265:68:0;-1:-1:-1;;;;;41352:21:0;;41344:68;;;;-1:-1:-1;;;41344:68:0;;14094:2:1;41344:68:0;;;14076:21:1;14133:2;14113:18;;;14106:30;14172:34;14152:18;;;14145:62;14243:4;14223:18;;;14216:32;14265:19;;41344:68:0;14066:224:1;41344:68:0;-1:-1:-1;;;;;41425:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;41477:32;;10810:25:1;;;41477:32:0;;10783:18:1;41477:32:0;;;;;;;41171:346;;;:::o;12313:384::-;11962:4;11986:12;;;;;;;;;;;-1:-1:-1;;;;;11986:29:0;;;;;;;;;;;;12389:301;;12525:41;12553:7;-1:-1:-1;;;;;12525:41:0;12563:2;12525:19;:41::i;:::-;12623:38;12651:4;12658:2;12623:19;:38::i;:::-;12446:230;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12446:230:0;;;;;;;;;;-1:-1:-1;;;12432:246:0;;;;;;;:::i;64447:607::-;64546:23;64584:14;55665:1;64584:39;;;;;;-1:-1:-1;;;64584:39:0;;;;;;;;;;;;;;;;;;64673:186;;-1:-1:-1;;;64673:186:0;;64584:39;64673:186;;;10477:41:1;-1:-1:-1;;;;;10554:55:1;;;10534:18;;;10527:83;10626:18;;;10619:34;;;64584:39:0;;;;-1:-1:-1;64584:39:0;;64673:73;;10450:18:1;;64673:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64880:17:0;;;;;;:13;:17;;;;;:37;;64635:224;;-1:-1:-1;64635:224:0;;64880:17;;;:37;;64635:224;;64880:37;:::i;:::-;;;;;;;;64928:11;-1:-1:-1;;;;;64928:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65001:45:0;;10810:25:1;;;-1:-1:-1;;;;;65001:45:0;;;-1:-1:-1;65018:1:0;;-1:-1:-1;65001:45:0;;10798:2:1;10783:18;65001:45:0;;;;;;;;64447:607;;;;:::o;65610:656::-;65710:23;65748:14;55665:1;65748:39;;;;;;-1:-1:-1;;;65748:39:0;;;;;;;;;;;;;;;;;;65849:14;:39;;-1:-1:-1;;;;;65748:39:0;;;;-1:-1:-1;65849:14:0;65748:39;;65849;;-1:-1:-1;;;65849:39:0;;;;;;;;;;;;;;;;;;65837:230;;-1:-1:-1;;;65837:230:0;;;;;10477:41:1;;;;-1:-1:-1;;;;;10554:55:1;;;10534:18;;;10527:83;10626:18;;;10619:34;;;65849:39:0;;65837:114;;10450:18:1;;65837:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;66088:19:0;;;;;;:13;:19;;;;;:39;;65799:268;;-1:-1:-1;65799:268:0;;66088:19;;;:39;;65799:268;;66088:39;:::i;:::-;;;;;;;;66138:11;-1:-1:-1;;;;;66138:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66211:47:0;;10810:25:1;;;66234:1:0;;-1:-1:-1;;;;;;66211:47:0;;;-1:-1:-1;66211:47:0;;10798:2:1;10783:18;66211:47:0;10765:76:1;59912:1127:0;-1:-1:-1;;;;;60073:25:0;;60051:83;;;;-1:-1:-1;;;60051:83:0;;16369:2:1;60051:83:0;;;16351:21:1;16408:1;16388:18;;;16381:29;-1:-1:-1;;;16426:18:1;;;16419:38;16474:18;;60051:83:0;16341:157:1;60051:83:0;60177:9;-1:-1:-1;;;;;60167:19:0;:6;-1:-1:-1;;;;;60167:19:0;;;60145:77;;;;-1:-1:-1;;;60145:77:0;;17042:2:1;60145:77:0;;;17024:21:1;17081:1;17061:18;;;17054:29;17119:10;17099:18;;;17092:38;17147:18;;60145:77:0;17014:157:1;60145:77:0;60243:23;60281:14;55665:1;60281:39;;;;;;-1:-1:-1;;;60281:39:0;;;;;;;;;;;;;;;;;;;;;;60419:191;;;;;;;;-1:-1:-1;;;;;60419:191:0;;;;;;;;;;;;;;;;;;;;;60531:21;;;:13;:21;;;;;;;60419:191;;;;;;60571:24;;;;;;;;;;60419:191;;;;;;60375:246;;;;;19034:13:1;;19030:22;;60375:246:0;;;19012:41:1;19095:24;;19091:33;;19069:20;;;19062:63;19163:24;19141:20;;;19134:54;19226:24;;19204:20;;;19197:54;19289:24;;19267:20;;;19260:54;60281:39:0;;;-1:-1:-1;60281:39:0;;60375:29;;18923:19:1;;60375:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60666:34;;-1:-1:-1;;;;;60642:21:0;;;60666:34;60642:21;;;:13;:21;;;;;;;;:58;;;;60738:37;;;;60711:24;;;;;;;;;;:64;;;;60829:36;;;;60801:65;;10810:25:1;;;60666:34:0;;-1:-1:-1;60642:21:0;60801:65;;10783:18:1;60801:65:0;;;;;;;60881:36;;;;:40;60877:155;;56039:3;-1:-1:-1;;;;;60952:68:0;60961:6;-1:-1:-1;;;;;60952:68:0;;60983:16;:36;;;60952:68;;;;10810:25:1;;10798:2;10783:18;;10765:76;60952:68:0;;;;;;;;60877:155;59912:1127;;;;;:::o;13271:147::-;12952:7;12979:12;;;;;;;;;;:22;;;11453:30;11464:4;3728:10;11453::::1;:30::i;:::-:0;13385:25:::1;13396:4;13402:7;13385:10;:25::i;49681:281::-:0;49734:7;49775:16;49758:13;:33;49754:201;;;-1:-1:-1;49815:24:0;;49681:281::o;49754:201::-;-1:-1:-1;50123:165:0;;;49901:10;50123:165;;;;11724:25:1;;;;49913:12:0;11765:18:1;;;11758:34;49927:15:0;11808:18:1;;;11801:34;50228:13:0;11851:18:1;;;11844:34;50268:4:0;11894:19:1;;;;11887:84;;;;50123:165:0;;;;;;;;;;11696:19:1;;;;50123:165:0;;;50099:200;;;;;;57763:214::o;14319:218::-;-1:-1:-1;;;;;14415:23:0;;3728:10;14415:23;14407:83;;;;-1:-1:-1;;;14407:83:0;;18528:2:1;14407:83:0;;;18510:21:1;18567:2;18547:18;;;18540:30;18606:34;18586:18;;;18579:62;18677:17;18657:18;;;18650:45;18712:19;;14407:83:0;18500:237:1;14407:83:0;14503:26;14515:4;14521:7;14503:11;:26::i;22707:158::-;22780:4;22804:53;22812:3;-1:-1:-1;;;;;22832:23:0;;22804:7;:53::i;23665:158::-;23739:7;23790:22;23794:3;23806:5;23790:3;:22::i;23204:117::-;23267:7;23294:19;23302:3;20045:18;;19962:109;54962:207;-1:-1:-1;;;;;55083:14:0;;55022:15;55083:14;;;:7;:14;;;;;51946;;52083:1;52065:19;;;;51946:14;55144:17;54962:207;;;;:::o;50949:167::-;51026:7;51053:55;51075:20;:18;:20::i;:::-;51097:10;46665:57;;6912:66:1;46665:57:0;;;6900:79:1;6995:11;;;6988:27;;;7031:12;;;7024:28;;;46628:7:0;;7068:12:1;;46665:57:0;;;;;;;;;;;;46655:68;;;;;;46648:75;;46535:196;;;;;44184:1432;44269:7;45194:66;45180:80;;;45172:127;;;;-1:-1:-1;;;45172:127:0;;14855:2:1;45172:127:0;;;14837:21:1;14894:2;14874:18;;;14867:30;14933:34;14913:18;;;14906:62;-1:-1:-1;;;14984:18:1;;;14977:32;15026:19;;45172:127:0;14827:224:1;45172:127:0;45318:1;:7;;45323:2;45318:7;:18;;;;45329:1;:7;;45334:2;45329:7;45318:18;45310:65;;;;-1:-1:-1;;;45310:65:0;;15607:2:1;45310:65:0;;;15589:21:1;15646:2;15626:18;;;15619:30;15685:34;15665:18;;;15658:62;-1:-1:-1;;;15736:18:1;;;15729:32;15778:19;;45310:65:0;15579:224:1;45310:65:0;45490:24;;;45473:14;45490:24;;;;;;;;;12209:25:1;;;12282:4;12270:17;;12250:18;;;12243:45;;;;12304:18;;;12297:34;;;12347:18;;;12340:34;;;45490:24:0;;12181:19:1;;45490:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45490:24:0;;-1:-1:-1;;45490:24:0;;;-1:-1:-1;;;;;;;45533:20:0;;45525:57;;;;-1:-1:-1;;;45525:57:0;;12975:2:1;45525:57:0;;;12957:21:1;13014:2;12994:18;;;12987:30;13053:26;13033:18;;;13026:54;13097:18;;45525:57:0;12947:174:1;45525:57:0;45602:6;44184:1432;-1:-1:-1;;;;;44184:1432:0:o;13663:149::-;12952:7;12979:12;;;;;;;;;;:22;;;11453:30;11464:4;3728:10;11453::::1;:30::i;:::-:0;13778:26:::1;13790:4;13796:7;13778:11;:26::i;15567:229::-:0;11962:4;11986:12;;;;;;;;;;;-1:-1:-1;;;;;11986:29:0;;;;;;;;;;;;15637:152;;15681:6;:12;;;;;;;;;;;-1:-1:-1;;;;;15681:29:0;;;;;;;;;:36;;-1:-1:-1;;15681:36:0;15713:4;15681:36;;;15764:12;3728:10;;3648:98;15764:12;-1:-1:-1;;;;;15737:40:0;15755:7;-1:-1:-1;;;;;15737:40:0;15749:4;15737:40;;;;;;;;;;15567:229;;:::o;17664:414::-;17727:4;19844:19;;;:12;;;:19;;;;;;17744:327;;-1:-1:-1;17787:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;17970:18;;17948:19;;;:12;;;:19;;;;;;:40;;;;18003:11;;17744:327;-1:-1:-1;18054:5:0;18047:12;;5519:447;5594:13;5620:19;5652:10;5656:6;5652:1;:10;:::i;:::-;:14;;5665:1;5652:14;:::i;:::-;5642:25;;;;;;-1:-1:-1;;;5642:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5642:25:0;;5620:47;;5678:15;:6;5685:1;5678:9;;;;;;-1:-1:-1;;;5678:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5678:15:0;;;;;;;;;5704;:6;5711:1;5704:9;;;;;;-1:-1:-1;;;5704:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;5704:15:0;;;;;;;;-1:-1:-1;5735:9:0;5747:10;5751:6;5747:1;:10;:::i;:::-;:14;;5760:1;5747:14;:::i;:::-;5735:26;;5730:131;5767:1;5763;:5;5730:131;;;5802:8;5811:5;5819:3;5811:11;5802:21;;;;;-1:-1:-1;;;5802:21:0;;;;;;;;;;;;5790:6;5797:1;5790:9;;;;;;-1:-1:-1;;;5790:9:0;;;;;;;;;;;;:33;-1:-1:-1;;;;;5790:33:0;;;;;;;;-1:-1:-1;5848:1:0;5838:11;;;;;5770:3;;;:::i;:::-;;;5730:131;;;-1:-1:-1;5879:10:0;;5871:55;;;;-1:-1:-1;;;5871:55:0;;13328:2:1;5871:55:0;;;13310:21:1;;;13347:18;;;13340:30;13406:34;13386:18;;;13379:62;13458:18;;5871:55:0;13300:182:1;15804:230:0;11962:4;11986:12;;;;;;;;;;;-1:-1:-1;;;;;11986:29:0;;;;;;;;;;;;15875:152;;;15950:5;15918:12;;;;;;;;;;;-1:-1:-1;;;;;15918:29:0;;;;;;;;;;:37;;-1:-1:-1;;15918:37:0;;;15975:40;3728:10;;15918:12;;15975:40;;15950:5;15975:40;15804:230;;:::o;18254:1407::-;18320:4;18459:19;;;:12;;;:19;;;;;;18495:15;;18491:1163;;18857:21;18881:14;18894:1;18881:10;:14;:::i;:::-;18930:18;;18857:38;;-1:-1:-1;18910:17:0;;18930:22;;18951:1;;18930:22;:::i;:::-;18910:42;;18986:13;18973:9;:26;18969:405;;19020:17;19040:3;:11;;19052:9;19040:22;;;;;;-1:-1:-1;;;19040:22:0;;;;;;;;;;;;;;;;;19020:42;;19194:9;19165:3;:11;;19177:13;19165:26;;;;;;-1:-1:-1;;;19165:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;19279:23;;;:12;;;:23;;;;;:36;;;18969:405;19455:17;;:3;;:17;;;-1:-1:-1;;;19455:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;19550:3;:12;;:19;19563:5;19550:19;;;;;;;;;;;19543:26;;;19593:4;19586:11;;;;;;;18491:1163;19637:5;19630:12;;;;;20415:120;20482:7;20509:3;:11;;20521:5;20509:18;;;;;;-1:-1:-1;;;20509:18:0;;;;;;;;;;;;;;;;;20502:25;;20415:120;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:2;;200:1;197;190:12;111:2;63:147;;;:::o;215:160::-;280:20;;336:13;;329:21;319:32;;309:2;;365:1;362;355:12;380:376;432:8;442:6;496:3;489:4;481:6;477:17;473:27;463:2;;521:8;511;504:26;463:2;-1:-1:-1;551:20:1;;594:18;583:30;;580:2;;;633:8;623;616:26;580:2;677:4;669:6;665:17;653:29;;729:3;722:4;713:6;705;701:19;697:30;694:39;691:2;;;746:1;743;736:12;691:2;453:303;;;;;:::o;761:196::-;820:6;873:2;861:9;852:7;848:23;844:32;841:2;;;894:6;886;879:22;841:2;922:29;941:9;922:29;:::i;962:270::-;1030:6;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1140:29;1159:9;1140:29;:::i;:::-;1130:39;;1188:38;1222:2;1211:9;1207:18;1188:38;:::i;:::-;1178:48;;1049:183;;;;;:::o;1237:338::-;1314:6;1322;1330;1383:2;1371:9;1362:7;1358:23;1354:32;1351:2;;;1404:6;1396;1389:22;1351:2;1432:29;1451:9;1432:29;:::i;:::-;1422:39;;1480:38;1514:2;1503:9;1499:18;1480:38;:::i;:::-;1470:48;;1565:2;1554:9;1550:18;1537:32;1527:42;;1341:234;;;;;:::o;1580:713::-;1691:6;1699;1707;1715;1723;1731;1739;1792:3;1780:9;1771:7;1767:23;1763:33;1760:2;;;1814:6;1806;1799:22;1760:2;1842:29;1861:9;1842:29;:::i;:::-;1832:39;;1890:38;1924:2;1913:9;1909:18;1890:38;:::i;:::-;1880:48;;1975:2;1964:9;1960:18;1947:32;1937:42;;2026:2;2015:9;2011:18;1998:32;1988:42;;2080:3;2069:9;2065:19;2052:33;2125:4;2118:5;2114:16;2107:5;2104:27;2094:2;;2150:6;2142;2135:22;2094:2;1750:543;;;;-1:-1:-1;1750:543:1;;;;2178:5;2230:3;2215:19;;2202:33;;-1:-1:-1;2282:3:1;2267:19;;;2254:33;;1750:543;-1:-1:-1;;1750:543:1:o;2298:264::-;2366:6;2374;2427:2;2415:9;2406:7;2402:23;2398:32;2395:2;;;2448:6;2440;2433:22;2395:2;2476:29;2495:9;2476:29;:::i;:::-;2466:39;2552:2;2537:18;;;;2524:32;;-1:-1:-1;;;2385:177:1:o;2567:702::-;2687:6;2695;2748:2;2736:9;2727:7;2723:23;2719:32;2716:2;;;2769:6;2761;2754:22;2716:2;2814:9;2801:23;2843:18;2884:2;2876:6;2873:14;2870:2;;;2905:6;2897;2890:22;2870:2;2948:6;2937:9;2933:22;2923:32;;2993:7;2986:4;2982:2;2978:13;2974:27;2964:2;;3020:6;3012;3005:22;2964:2;3065;3052:16;3091:2;3083:6;3080:14;3077:2;;;3112:6;3104;3097:22;3077:2;3173:7;3168:2;3160:4;3152:6;3148:17;3144:2;3140:26;3136:35;3133:48;3130:2;;;3199:6;3191;3184:22;3130:2;3235;3227:11;;;;;3257:6;;-1:-1:-1;2706:563:1;;-1:-1:-1;;;;2706:563:1:o;3274:190::-;3330:6;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;3404:6;3396;3389:22;3351:2;3432:26;3448:9;3432:26;:::i;3469:190::-;3528:6;3581:2;3569:9;3560:7;3556:23;3552:32;3549:2;;;3602:6;3594;3587:22;3549:2;-1:-1:-1;3630:23:1;;3539:120;-1:-1:-1;3539:120:1:o;3664:264::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:2;;;3814:6;3806;3799:22;3761:2;3855:9;3842:23;3832:33;;3884:38;3918:2;3907:9;3903:18;3884:38;:::i;3933:258::-;4001:6;4009;4062:2;4050:9;4041:7;4037:23;4033:32;4030:2;;;4083:6;4075;4068:22;4030:2;-1:-1:-1;;4111:23:1;;;4181:2;4166:18;;;4153:32;;-1:-1:-1;4020:171:1:o;4196:352::-;4254:6;4307:2;4295:9;4286:7;4282:23;4278:32;4275:2;;;4328:6;4320;4313:22;4275:2;4372:9;4359:23;-1:-1:-1;;;;;;4415:5:1;4411:78;4404:5;4401:89;4391:2;;4509:6;4501;4494:22;4553:751;4645:6;4653;4661;4669;4722:2;4710:9;4701:7;4697:23;4693:32;4690:2;;;4743:6;4735;4728:22;4690:2;4788:9;4775:23;4817:18;4858:2;4850:6;4847:14;4844:2;;;4879:6;4871;4864:22;4844:2;4923:59;4974:7;4965:6;4954:9;4950:22;4923:59;:::i;:::-;5001:8;;-1:-1:-1;4897:85:1;-1:-1:-1;5089:2:1;5074:18;;5061:32;;-1:-1:-1;5105:16:1;;;5102:2;;;5139:6;5131;5124:22;5102:2;;5183:61;5236:7;5225:8;5214:9;5210:24;5183:61;:::i;:::-;4680:624;;;;-1:-1:-1;5263:8:1;-1:-1:-1;;;;4680:624:1:o;5309:802::-;5411:6;5464:3;5452:9;5443:7;5439:23;5435:33;5432:2;;;5486:6;5478;5471:22;5432:2;5524;5518:9;5566:3;5558:6;5554:16;5636:6;5624:10;5621:22;5600:18;5588:10;5585:34;5582:62;5579:2;;;-1:-1:-1;;;5674:6:1;5667:93;5783:4;5780:1;5773:15;5816:4;5808:6;5801:20;5579:2;5851:10;5847:2;5840:22;;5892:9;5886:16;5878:6;5871:32;5957:2;5946:9;5942:18;5936:25;5931:2;5923:6;5919:15;5912:50;6016:2;6005:9;6001:18;5995:25;5990:2;5982:6;5978:15;5971:50;6075:2;6064:9;6060:18;6054:25;6049:2;6041:6;6037:15;6030:50;6099:6;6089:16;;;5422:689;;;;:::o;6311:194::-;6381:6;6434:2;6422:9;6413:7;6409:23;6405:32;6402:2;;;6455:6;6447;6440:22;6402:2;-1:-1:-1;6483:16:1;;6392:113;-1:-1:-1;6392:113:1:o;7091:786::-;7502:25;7497:3;7490:38;7472:3;7557:6;7551:13;7573:62;7628:6;7623:2;7618:3;7614:12;7607:4;7599:6;7595:17;7573:62;:::i;:::-;7699:19;7694:2;7654:16;;;7686:11;;;7679:40;7744:13;;7766:63;7744:13;7815:2;7807:11;;7800:4;7788:17;;7766:63;:::i;:::-;7849:17;7868:2;7845:26;;7480:397;-1:-1:-1;;;;7480:397:1:o;8818:1266::-;9065:2;9117:21;;;9090:18;;;9173:22;;;9036:4;;9214:2;9232:18;;;9273:6;9036:4;9310:748;9324:6;9321:1;9318:13;9310:748;;;9399:23;9415:6;9399:23;:::i;:::-;9392:31;9385:39;9380:3;9373:52;9473:32;9501:2;9493:6;9489:15;9473:32;:::i;:::-;9466:40;9459:48;9454:2;9449:3;9445:12;9438:70;9556:32;9584:2;9576:6;9572:15;9556:32;:::i;:::-;9549:40;9542:48;9537:2;9532:3;9528:12;9521:70;9614:4;9666:32;9694:2;9686:6;9682:15;9666:32;:::i;:::-;9659:40;9652:48;9638:12;;;9631:70;9724:4;9776:32;9792:15;;;9776:32;:::i;:::-;9769:40;9762:48;9748:12;;;9741:70;9834:4;9864:35;9883:15;;;9864:35;:::i;:::-;-1:-1:-1;;;;;6576:54:1;9938:12;;;6564:67;9974:4;9998:12;;;;10033:15;;;;;9346:1;9339:9;9310:748;;;-1:-1:-1;10075:3:1;;9045:1039;-1:-1:-1;;;;;;;9045:1039:1:o;12385:383::-;12534:2;12523:9;12516:21;12497:4;12566:6;12560:13;12609:6;12604:2;12593:9;12589:18;12582:34;12625:66;12684:6;12679:2;12668:9;12664:18;12659:2;12651:6;12647:15;12625:66;:::i;:::-;12752:2;12731:15;-1:-1:-1;;12727:29:1;12712:45;;;;12759:2;12708:54;;12506:262;-1:-1:-1;;12506:262:1:o;19949:128::-;19989:3;20020:1;20016:6;20013:1;20010:13;20007:2;;;20026:18;;:::i;:::-;-1:-1:-1;20062:9:1;;19997:80::o;20082:168::-;20122:7;20188:1;20184;20180:6;20176:14;20173:1;20170:21;20165:1;20158:9;20151:17;20147:45;20144:2;;;20195:18;;:::i;:::-;-1:-1:-1;20235:9:1;;20134:116::o;20255:125::-;20295:4;20323:1;20320;20317:8;20314:2;;;20328:18;;:::i;:::-;-1:-1:-1;20365:9:1;;20304:76::o;20385:258::-;20457:1;20467:113;20481:6;20478:1;20475:13;20467:113;;;20557:11;;;20551:18;20538:11;;;20531:39;20503:2;20496:10;20467:113;;;20598:6;20595:1;20592:13;20589:2;;;20633:1;20624:6;20619:3;20615:16;20608:27;20589:2;;20438:205;;;:::o;20648:136::-;20687:3;20715:5;20705:2;;20724:18;;:::i;:::-;-1:-1:-1;;;20760:18:1;;20695:89::o;20789:437::-;20868:1;20864:12;;;;20911;;;20932:2;;20986:4;20978:6;20974:17;20964:27;;20932:2;21039;21031:6;21028:14;21008:18;21005:38;21002:2;;;-1:-1:-1;;;21073:1:1;21066:88;21177:4;21174:1;21167:15;21205:4;21202:1;21195:15;21231:135;21270:3;-1:-1:-1;;21291:17:1;;21288:2;;;21311:18;;:::i;:::-;-1:-1:-1;21358:1:1;21347:13;;21278:88::o;21371:184::-;-1:-1:-1;;;21420:1:1;21413:88;21520:4;21517:1;21510:15;21544:4;21541:1;21534:15
Swarm Source
ipfs://fd4cb3b4874c102196e10505a891c630b6905c83d07c07ccce7392d624b567f5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.