Source Code
Overview
S Balance
2.1 S
More Info
ContractCreator
Latest 5 from a total of 5 transactions
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8237988 | 3 hrs ago | 0 S | ||||
8237972 | 3 hrs ago | 0 S | ||||
8237972 | 3 hrs ago | 0 S | ||||
7104247 | 4 days ago | 0 S | ||||
7104228 | 4 days ago | 0 S | ||||
7104228 | 4 days ago | 0 S | ||||
5309008 | 10 days ago | 0 S | ||||
5309008 | 10 days ago | 0 S | ||||
5309008 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5309005 | 10 days ago | 0 S | ||||
5308809 | 10 days ago | 0 S | ||||
5308805 | 10 days ago | 0 S | ||||
5308805 | 10 days ago | 0 S | ||||
5296560 | 11 days ago | 0 S | ||||
5296560 | 11 days ago | 0 S | ||||
5039571 | 11 days ago | 0 S | ||||
5039561 | 11 days ago | 0 S | ||||
5039561 | 11 days ago | 0 S | ||||
5039317 | 11 days ago | 0 S | ||||
5039306 | 11 days ago | 0 S |
Loading...
Loading
Contract Name:
DepositContract
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import {EnumerableSet} from "./EnumerableSet.sol"; import {Ownable2Step} from "./Ownable2Step.sol"; import {Pausable} from "./Pausable.sol"; import {IDepositContract} from "./IDepositContract.sol"; import {CheckContractAddress} from "./CheckContractAddress.sol"; contract DepositContract is Ownable2Step, Pausable, IDepositContract, CheckContractAddress { uint256 constant SUBSCRIPTION_DURATION = 180 days; using EnumerableSet for EnumerableSet.AddressSet; // Whitelisting EnumerableSet.AddressSet private whitelist; mapping(address => EnumerableSet.AddressSet) private contractWhitelisted; // Subscriptions mapping(address => Subscription) private subscriptionPeriod; struct Subscription { uint256 startDate; uint256 endDate; bool isSnap; } // Funds management mapping(address => uint256) private minBalanceLimitClient; mapping(address => uint256) private clientFund; uint256 private supraFund; uint256 private minBalanceLimitSupra; // Miscellaneous address public generator; address public router; address public coldWallet; address public _tempWallet; address public approver; address public developer; bool public adminFeelsOK; /// @dev Emitted when a client is whitelisted. /// @param _clientAddress Address of the client that has been whitelisted. /// @param _startTime The timestamp representing the start time of the subscription period. /// @param _endTime The timestamp representing the end time of the subscription period. /// @param _isSnap A boolean flag indicating if the client is a part of the SNAP program or not. event ClientWhitelisted( address _clientAddress, uint256 _startTime, uint256 _endTime, bool _isSnap ); /// @dev Emitted when a client is removed from the whitelist. /// @param _clientAddress Address of the client that has been removed from the whitelist. /// @param _removedTime The timestamp representing the time at which the client was removed. event ClientRemovedFromWhitelist( address _clientAddress, uint256 _removedTime ); /// @dev Emitted when contracts are removed from the whitelist for a client /// @param _clientAddress The address of the client whose contracts were removed /// @param _removedTime The timestamp when the contracts were removed event ContractsDeletedFromWhitelist( address _clientAddress, uint256 _removedTime ); /// @dev Emitted when a contract is whitelisted for a client. /// @param _clientAddress Address of the client whose contract has been whitelisted. /// @param _contractAddress Address of the contract that has been whitelisted. /// @param _timeStamp The timestamp representing the time at which the contract was whitelisted. event ContractWhitelisted( address _clientAddress, address _contractAddress, uint256 _timeStamp ); /// @dev Emitted when a client deposits funds into their account. /// @param _depositer The address of the client who deposited funds. /// @param amount The amount of funds that were deposited. event ClientDeposited(address _depositer, uint256 amount); /// @dev Emitted when a client withdraws funds from their account. /// @param _withdrawer The address of the client who withdrew funds. /// @param amount The amount of funds that were withdrawn. event ClientWithdrwal(address _withdrawer, uint256 amount); /// @dev Emitted when Supra collects funds from a client's account. /// @param _fromClient The address of the client from whom funds were collected. /// @param amount The amount of funds that were collected. event SupraCollected(address _fromClient, uint256 amount); /// @dev Emitted when Supra refunds funds to a client's account. /// @param _toClient The address of the client to whom funds were refunded. /// @param amount The amount of funds that were refunded. event SupraRefunded(address _toClient, uint256 amount); /// @dev Emitted when the approver confirms the new cold wallet address /// @param _coldWalletAddress The new address of the cold wallet event ColdWalletConfirmed(address _coldWalletAddress); /// @dev Emitted when the client set the minimum balance limit to hold in wallet /// @param _clientAddress The client wallet address through which and for which the limit is to be set /// @param limit The value which client wants to be a minimum limit for the specified wallet event MinBalanceClientSet(address _clientAddress, uint256 limit); /// @dev Constructor to initialize contract with provided parameters. /// @param _approver Address of the approver who will approve changes. /// @param _developer Address of the developer who will manage the contract. /// @param _newGenerator Address of the new generator contract. /// @param _newRouter Address of the new router contract. /// @param _minBalanceLimitSupra Minimum balance limit to execute supra transactions. /// The value must be greater than or equal to zero. constructor( address _approver, address _developer, address _newGenerator, address _newRouter, uint256 _minBalanceLimitSupra ) { require(_approver != msg.sender, "Admin cannot be the approver"); require( _developer != address(0) && _approver != address(0) && _newGenerator != address(0) && _newRouter != address(0), "Address cannot be a zero address" ); require(_minBalanceLimitSupra != 0, "Invalid Minimum balance limit"); developer = _developer; approver = _approver; generator = _newGenerator; router = _newRouter; minBalanceLimitSupra = _minBalanceLimitSupra; } modifier checkClientWhitelisted(address _clientAddress) { require( isClientWhitelisted(_clientAddress), "Client address not whitelisted" ); _; } /** ####################################################################################### :::::::::::::::::::::::: SUPRA ADMIN OPERATIONS :::::::::::::::::::::::::::::: ####################################################################################### */ /// @dev Allows SupraAdmin to add a client to the whitelist. /// @param _clientAddress The address of the client being added. /// @param _isSnap A boolean value indicating whether the client is a Snap user or not. function addClientToWhitelist(address _clientAddress, bool _isSnap) external onlyOwner { require( !isClientWhitelisted(_clientAddress), "Client is already whitelisted" ); whitelist.add(_clientAddress); addSubscriptionInfoByClient( _clientAddress, block.timestamp, block.timestamp + SUBSCRIPTION_DURATION, _isSnap ); emit ClientWhitelisted( _clientAddress, block.timestamp, block.timestamp + SUBSCRIPTION_DURATION, _isSnap ); } /// @dev Update the end time of a client's subscription /// @param _clientAddress The address of the client /// @param _newEndTime The new end time for the subscription /// - require The client is whitelisted /// - require The new end time is in the future function updateSubscription(address _clientAddress, uint256 _newEndTime) external onlyOwner checkClientWhitelisted(_clientAddress) { require(_newEndTime > block.timestamp + 2 days, "Invalid End Time"); subscriptionPeriod[_clientAddress].endDate = _newEndTime; } /// @dev Remove a client from the whitelist /// @param _clientAddress The address of the client to remove function removeClientFromWhitelist(address _clientAddress) external onlyOwner checkClientWhitelisted(_clientAddress) { uint256 _amount = checkClientFund(_clientAddress); (bool sent, bytes memory data) = payable(_clientAddress).call{ value: _amount }(""); require(sent, "Cannot transfer client funds"); bool result = whitelist.remove(_clientAddress); require(result, "Client not whitelisted or already removed"); emit ClientRemovedFromWhitelist(_clientAddress, block.timestamp); } /// @dev Remove all contracts associated with a client /// @param _clientAddress The address of the client function removeAllContractOfClient(address _clientAddress) external onlyOwner { uint256 _totalCount = contractWhitelisted[_clientAddress].length(); require( _totalCount != 0, "Contracts not whitelisted or already removed" ); contractWhitelisted[_clientAddress].clear(); } /// @dev Allows the owner to claim free node expenses. /// Only the owner can do this. /// @param _amount The amount to be claimed to coldwallet. function claimFreeNodeExpenses(uint256 _amount) external onlyOwner { require( coldWallet != address(0), "Invalid Address: Address cannot be a zero address" ); require( _amount <= supraFund, "Insufficient Funds: Claiming free node expenses" ); supraFund -= _amount; (bool sent, bytes memory data) = payable(coldWallet).call{ value: _amount }(""); require(sent, "Cannot claim free node expenses"); } /// @dev Execute a refund from the supra fund to a client /// @param _fundReceiver The address of the client receiving the refund /// @param _amount The amount to be refunded /// - require The client is whitelisted /// - require The refund amount is less than or equal to the supra fund function executeRefund(address _fundReceiver, uint256 _amount) external onlyOwner checkClientWhitelisted(_fundReceiver) { require(_amount <= supraFund, "Insufficient funds: executing refund"); supraFund -= _amount; clientFund[_fundReceiver] = clientFund[_fundReceiver] + _amount; emit SupraRefunded(_fundReceiver, _amount); } /// @dev Updates the address of the developer. /// Only the owner is authorized to perform this action. /// @param _newDeveloper The address of the new developer to be set. function updateDeveloper(address _newDeveloper) external onlyOwner { require( _newDeveloper != address(0), "Developer address cannot be a zero address" ); developer = _newDeveloper; } /// @dev Sets the minimum balance limit for SupraAdmin. /// @param _limit The new minimum balance limit for SupraAdmin. function updateMinBalanceSupra(uint256 _limit) external onlyOwner { minBalanceLimitSupra = _limit; } /// @dev Deposits ETH into the SupraFund contract. function depositSupraFund() external payable onlyOwner { supraFund += msg.value; } /// @dev Pauses withdrawals for the contract. /// Only the owner is authorized to perform this action. /// Emits a {Paused} event. function pauseWithdrawal() external onlyOwner { _pause(); } /// @dev Resumes withdrawals for the contract. /// Only the owner is authorized to perform this action. /// Emits an {Unpaused} event. function unpauseWithdrawal() external onlyOwner { _unpause(); } /// @dev Sets the generator contract address. /// Only the owner can do this. /// @param _newGenerator The new generator contract address. /// @param _newRouter The new router contract address function updateGeneratorRouter(address _newGenerator, address _newRouter) external onlyOwner { require( isContract(_newGenerator) && isContract(_newRouter), "Address cannot be a wallet address" ); require( _newGenerator != address(0) && _newRouter != address(0), "Contract address cannot be a zero address" ); generator = _newGenerator; router = _newRouter; } /** ####################################################################################### :::::::::::::::::::::: WHITELISTED CLIENT OPERATIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Allows a client to add a contract to their whitelist. /// @param _contractAddress The address of the contract being added. function addContractToWhitelist(address _contractAddress) external checkClientWhitelisted(msg.sender) { require(isContract(_contractAddress), "Address cannot be EOA"); bool result = contractWhitelisted[msg.sender].add(_contractAddress); require(result, "Contract is Already whitelisted"); emit ContractWhitelisted(msg.sender, _contractAddress, block.timestamp); } /// @dev Removes a contract from a client's whitelist. /// Only the client who added the contract can remove it. /// @param _contractAddress The address of the contract to remove. function removeContractFromWhitelist(address _contractAddress) external { bool result = contractWhitelisted[msg.sender].remove(_contractAddress); require(result, "Contract is not whitelisted or already removed"); emit ContractsDeletedFromWhitelist(_contractAddress, block.timestamp); } /// @dev Allows a client to deposit funds into their account. function depositFundClient() external payable checkClientWhitelisted(msg.sender) { clientFund[msg.sender] = clientFund[msg.sender] + msg.value; emit ClientDeposited(msg.sender, msg.value); } /// @dev Sets the minimum balance limit for the calling client. /// @param _limit The new minimum balance limit for the calling client. function setMinBalanceClient(uint256 _limit) external checkClientWhitelisted(msg.sender) { require( _limit >= minBalanceLimitSupra, "Cannot set a lower limit than the limit set by the deployer" ); minBalanceLimitClient[msg.sender] = _limit; emit MinBalanceClientSet(msg.sender, _limit); } /// @dev Allows a client to withdraw their funds. /// @param _amount The amount to be withdrawn. /// Emits a ClientWithdrawal event. function withdrawFundClient(uint256 _amount) external whenNotPaused { require( _amount <= checkClientFund(msg.sender), "Insufficient Funds: Fund withdrawing by user" ); clientFund[msg.sender] = checkClientFund(msg.sender) - _amount; (bool sent, bytes memory data) = payable(msg.sender).call{ value: _amount }(""); require(sent, "Cannot withdraw client funds"); emit ClientWithdrwal(msg.sender, _amount); } /** ####################################################################################### ::::::::::::::::::::::::: GENERATOR RELATED FUNCTIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Allows the generator contract to collect funds from a client's balance. /// @param _clientAddress The address of the client whose funds are being collected. /// @param _amount The amount of funds to be collected. function collectFund(address _clientAddress, uint256 _amount) external override { require( msg.sender == generator, "Caller is not the owner: Only Generator can collect funds" ); require( _amount <= checkClientFund(_clientAddress), "Insufficient Funds: Collecting funds by generator" ); clientFund[_clientAddress] = clientFund[_clientAddress] - _amount; supraFund = supraFund + _amount; emit SupraCollected(_clientAddress, _amount); } /// @dev Returns the fund balance of the specified client address. /// Only authorized callers, including the whitelisted client, developer, owner, and generator, can perform this action. /// @param _clientAddress The address of the client whose fund balance is to be checked. /// @return The fund balance of the specified client address. function checkClientFund(address _clientAddress) public view override checkClientWhitelisted(_clientAddress) returns (uint256) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner() || s == generator || s == router, "Unauthorized Access: Address not allowed to check funds" ); return clientFund[_clientAddress]; } /** ####################################################################################### :::::::::::::::::::::: ROUTER RELATED FUNCTIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Returns a boolean indicating whether the given client and contract addresses are eligible for interaction. /// @param _clientAddress The address of the client. /// @param _contractAddress The address of the contract. /// @return A boolean indicating whether the given client and contract addresses are eligible for interaction. function isContractEligible( address _clientAddress, address _contractAddress ) public view override checkClientWhitelisted(_clientAddress) returns (bool) { return (isContractWhitelisted(_clientAddress, _contractAddress)); } /// @dev Checks whether the minimum balance for a given client address has been reached. /// @param _clientAddress The client address to check. /// @return A boolean indicating whether the minimum balance for the given client address has been reached. function isMinimumBalanceReached(address _clientAddress) public view override checkClientWhitelisted(_clientAddress) returns (bool) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner() || s == generator || s == router, "Unauthorized Access: Address cannot check minimum balance" ); return (checkClientFund(_clientAddress) <= checkMinBalance(_clientAddress)); } /** ####################################################################################### :::::::::::::::::::::: ADMIN + APPROVER OPERATIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Propose a new cold wallet address /// @param _newColdWallet The address of the new cold wallet function proposeColdWallet(address _newColdWallet) external onlyOwner { _tempWallet = _newColdWallet; adminFeelsOK = true; } /// @dev Confirm a proposed cold wallet address /// @notice This function can only be executed by the approver /// @notice The proposal must be confirmed by the owner before the cold wallet can be updated /// - require The proposal is ready to be confirmed function confirmColdWallet() external { require( msg.sender == approver, "Unauthorized Access: Only Approver can confirm" ); require(adminFeelsOK, "Cold wallet propose not ready"); coldWallet = _tempWallet; adminFeelsOK = false; emit ColdWalletConfirmed(coldWallet); } /** ####################################################################################### :::::::::::::::::::::: CRON AND SCRIPT RELATED FUNCTIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Returns an array of whitelisted client addresses along with their respective fund balances and minimum balance requirements. /// @return A tuple of three arrays: (1) an array of whitelisted client addresses, (2) an array of their fund balances, and (3) an array of their minimum balance requirements. function checkBalanceAllWhitelisted() external view returns ( address[] memory, uint256[] memory, uint256[] memory ) { address s = msg.sender; require( s == developer || s == owner(), "Unauthorized Access: Only developer or deployer can check the balance" ); uint256 count = countTotalWhitelistedClient(); address[] memory _clients = listAllWhitelistedClient(); uint256[] memory _funds = new uint256[](count); uint256[] memory _minBalance = new uint256[](count); for (uint256 loop = 0; loop < count; loop++) { address client = _clients[loop]; _funds[loop] = clientFund[client]; _minBalance[loop] = checkMinBalance(client); } return (_clients, _funds, _minBalance); } /// @dev Returns the minimum balance limit for the SupraAdmin. /// @return The minimum balance limit for the SupraAdmin. function checkMinBalanceSupra() public view returns (uint256) { return minBalanceLimitSupra; } /// @dev Returns the total number of whitelisted clients. /// @return The total number of whitelisted clients. function countTotalWhitelistedClient() public view returns (uint256) { return whitelist.length(); } /** ####################################################################################### ::::::::::::::::::::::::: RESTRICTED VIEW FUNCTIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Returns the effective balance for a given client address. /// @param _clientAddress The client address to check. /// @return The effective balance for the given client address. function checkEffectiveBalance(address _clientAddress) public view checkClientWhitelisted(_clientAddress) returns (uint256) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner(), "Unauthorized Access: Cannot check effective balance" ); uint256 balance; if (checkClientFund(_clientAddress) > checkMinBalance(_clientAddress)) { balance = checkClientFund(_clientAddress) - checkMinBalance(_clientAddress); } return balance; } /// @dev Returns the number of contracts whitelisted by a client. /// @param _clientAddress The client address to check. /// @return The number of contracts whitelisted by the client. function countTotalWhitelistedContractByClient(address _clientAddress) public view checkClientWhitelisted(_clientAddress) returns (uint256) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner() || s == generator, "Unauthorized Access: Cannot check the total count" ); return contractWhitelisted[_clientAddress].length(); } /// @dev Get subscription information for a client. /// @param _clientAddress The client's address. /// @return A tuple containing the start timestamp and the end timestamp of the subscription period. function getSubscriptionInfoByClient(address _clientAddress) external view checkClientWhitelisted(_clientAddress) returns ( uint256, uint256, bool ) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner() || s == generator, "Unauthorized Access: Cannot check the subscription info" ); Subscription memory subscription = subscriptionPeriod[_clientAddress]; return ( subscription.startDate, subscription.endDate, subscription.isSnap ); } /// @dev Check if a contract is whitelisted for a client /// @param _clientAddress The address of the client /// @param _contractAddress The address of the contract to check /// @return A boolean indicating whether the contract is whitelisted function isContractWhitelisted( address _clientAddress, address _contractAddress ) public view checkClientWhitelisted(_clientAddress) returns (bool) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner() || s == generator || s == router, "Unauthorized Access: Cannot check for the whitelisted contract" ); return contractWhitelisted[_clientAddress].contains(_contractAddress); } /// @dev Returns an array of all whitelisted contracts for a specified client address. /// Only authorized callers, including the whitelisted client, developer, and owner, can perform this action. /// @param _clientAddress The address of the client whose whitelisted contracts are to be listed. /// @return An array of all whitelisted contracts for the specified client address. function listAllWhitelistedContractByClient(address _clientAddress) external view checkClientWhitelisted(_clientAddress) returns (address[] memory) { address s = msg.sender; require( s == _clientAddress || s == developer || s == owner(), "Unauthorized Access: Cannot check the list of whitelisted contracts" ); require(_clientAddress != address(0), "User address cannot be zero"); uint256 totalContracts = contractWhitelisted[_clientAddress].length(); address[] memory contracts = new address[](totalContracts); uint256 count = 0; for (count; count < totalContracts; count++) { address contractAddress = contractWhitelisted[_clientAddress].at( count ); contracts[count] = contractAddress; } if (count == 0) { return new address[](0); } return contracts; } /// @dev Returns an array of all whitelisted clients. /// @return An array of all whitelisted client addresses. function listAllWhitelistedClient() public view returns (address[] memory) { address s = msg.sender; require( s == developer || s == owner(), "Unauthorized Access: Cannot list whitelisted clients" ); address[] memory clients = new address[](whitelist.length()); for (uint256 i = 0; i < whitelist.length(); i++) { address value = whitelist.at(i); clients[i] = value; } return clients; } /// @dev Returns the current balance of the SupraFund contract. /// @return The current balance of the SupraFund contract. function checkSupraFund() external view returns (uint256) { require( msg.sender == owner() || msg.sender == developer, "Unauthorized Access: Cannot check supra funds" ); return supraFund; } /** ####################################################################################### :::::::::::::::::::::::::: PUBLIC FUNCTIONS ::::::::::::::::::::::::: ####################################################################################### */ /// @dev Checks if a client is whitelisted. /// @param _clientAddress The client address to check. /// @return True if the client is whitelisted, false otherwise. function isClientWhitelisted(address _clientAddress) public view returns (bool) { return whitelist.contains(_clientAddress); } /// @dev Returns the minimum balance limit for a given client address. /// @param _clientAddress The client address to check. /// @return The minimum balance limit for the given client address. function checkMinBalance(address _clientAddress) public view override returns (uint256) { uint256 limit; if (checkMinBalanceClient(_clientAddress) > checkMinBalanceSupra()) { limit = checkMinBalanceClient(_clientAddress); } else { limit = checkMinBalanceSupra(); } return limit; } /** ####################################################################################### :::::::::::::::::::::::: INETRNAL FUNCTIONS :::::::::::::::::::::::: ####################################################################################### */ /// @dev Returns the minimum balance limit for a given client address. /// @param _clientAddress The client address to check. /// @return The minimum balance limit for the given client address. function checkMinBalanceClient(address _clientAddress) internal view returns (uint256) { return minBalanceLimitClient[_clientAddress]; } /// @dev Add subscription information for a client /// @param _clientAddress The address of the client /// @param _start The start timestamp of the subscription /// @param _end The end timestamp of the subscription /// @param _isSnap A flag indicating whether the subscription is a snapshot subscription function addSubscriptionInfoByClient( address _clientAddress, uint256 _start, uint256 _end, bool _isSnap ) internal { subscriptionPeriod[_clientAddress] = Subscription( _start, _end, _isSnap ); } }
/** * ############################################################### * this is not exact replica of OpenZepplin implementation * ############################################################### */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity 0.8.19; library EnumerableSet { 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; } 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; } } /** * ################################################################################### * :::: this is the new method added on top of openzepplin implementation :::: * ################################################################################### */ function _clear(Set storage set) private returns (bool) { for (uint256 i = 0; i < set._values.length; i++) { delete set._indexes[set._values[i]]; } delete set._values; return true; } 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) { 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; } function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } struct Bytes32Set { Set _inner; } function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function clear(AddressSet storage set) internal returns (bool) { return _clear(set._inner); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol) pragma solidity 0.8.19; import "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity 0.8.19; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// INSTRUCTIONS : Contains methods that will be used by the ROUTER and GENERATOR contracts. // SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface IDepositContract { function isContractEligible(address _clientAddress, address _contractAddress) external view returns (bool); function isMinimumBalanceReached(address _clientAddress) external view returns (bool); function checkMinBalance(address _clientAddress) external view returns (uint256); function checkClientFund(address _clientAddress) external view returns (uint256); function collectFund(address _clientAddress, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; contract CheckContractAddress { /// @dev Returns a boolean indicating whether the given address is a contract or not. /// @param _addr The address to be checked. /// @return A boolean indicating whether the given address is a contract or not. function isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity 0.8.19; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity 0.8.19; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_approver","type":"address"},{"internalType":"address","name":"_developer","type":"address"},{"internalType":"address","name":"_newGenerator","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"},{"internalType":"uint256","name":"_minBalanceLimitSupra","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_depositer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClientDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_removedTime","type":"uint256"}],"name":"ClientRemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isSnap","type":"bool"}],"name":"ClientWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClientWithdrwal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_coldWalletAddress","type":"address"}],"name":"ColdWalletConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_timeStamp","type":"uint256"}],"name":"ContractWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_removedTime","type":"uint256"}],"name":"ContractsDeletedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"MinBalanceClientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_fromClient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SupraCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_toClient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SupraRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_tempWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"bool","name":"_isSnap","type":"bool"}],"name":"addClientToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"addContractToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminFeelsOK","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalanceAllWhitelisted","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkClientFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkEffectiveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkMinBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkMinBalanceSupra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSupraFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimFreeNodeExpenses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"coldWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmColdWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"countTotalWhitelistedClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"countTotalWhitelistedContractByClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFundClient","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositSupraFund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"developer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fundReceiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"executeRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"getSubscriptionInfoByClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"isClientWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isContractEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isContractWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"isMinimumBalanceReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listAllWhitelistedClient","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"listAllWhitelistedContractByClient","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newColdWallet","type":"address"}],"name":"proposeColdWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"removeAllContractOfClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"removeClientFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"removeContractFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMinBalanceClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newDeveloper","type":"address"}],"name":"updateDeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGenerator","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"}],"name":"updateGeneratorRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updateMinBalanceSupra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"updateSubscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFundClient","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080346200023657601f62002bc338819003918201601f191683019291906001600160401b038411838510176200023b578160a092849260409687528339810103126200023657620000518162000251565b6200005f6020830162000251565b906200006d84840162000251565b9260806200007e6060830162000251565b91015193600154926000549460018060a01b031995338782161760005588519260018060a01b03968792833391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a81b0319166001551691338314620001f45750841680151580620001ea575b80620001de575b80620001d2575b156200018f5786156200014b579084929186600f541617600f5585600e541617600e551683600a541617600a551690600b541617600b556009555161295c9081620002678239f35b875162461bcd60e51b815260206004820152601d60248201527f496e76616c6964204d696e696d756d2062616c616e6365206c696d69740000006044820152606490fd5b6064885162461bcd60e51b815260206004820152602060248201527f416464726573732063616e6e6f742062652061207a65726f20616464726573736044820152fd5b50848416151562000103565b508483161515620000fc565b50811515620000f5565b62461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f742062652074686520617070726f766572000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620002365756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a264697066735822122019c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb64736f6c634300081300330000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a530700000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c920000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e000000000000000000000000000000000000000000000000002386f26fc10000
Deployed Bytecode
0x608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a264697066735822122019c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a530700000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c920000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e000000000000000000000000000000000000000000000000002386f26fc10000
-----Decoded View---------------
Arg [0] : _approver (address): 0x8B61F1C25483380Cf1eCbaC8C55c5b3B80F05B9d
Arg [1] : _developer (address): 0x578DD059Ec425F83cCCC3149ed594d4e067A5307
Arg [2] : _newGenerator (address): 0x97787E6a911480e1026B6f658f330f7B323a3c92
Arg [3] : _newRouter (address): 0x3B5F96986389f6BaCF58d5b69425fab000D3551e
Arg [4] : _minBalanceLimitSupra (uint256): 10000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d
Arg [1] : 000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a5307
Arg [2] : 00000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c92
Arg [3] : 0000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e
Arg [4] : 000000000000000000000000000000000000000000000000002386f26fc10000
Deployed Bytecode Sourcemap
321:30046:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14033:38;13933:10;6048:112;4959:55:3;13933:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;4959:55;6048:112:2;:::i;:::-;13933:10;321:30046;;13984:10;321:30046;;13984:34;321:30046;;;;14009:9;13984:34;;:::i;:::-;13933:10;321:30046;;;13984:10;321:30046;;;;;;;;;;;;;;;;14009:9;321:30046;;;;;;;;14033:38;;;;321:30046;;;;;;;;;;;;;;;;;;;1132:21;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;321:30046:2;;;-1:-1:-1;;;;;;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;1267:43:6;321:30046:2;;1267:43:6;321:30046:2;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;-1:-1:-1;;;;;321:30046:2;;;:::i;:::-;;4959:55:3;6048:112:2;4959:55:3;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;23544:10;;23585:19;:49;;;;;321:30046;23585:77;;;;321:30046;23585:107;;;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;;;23585:107;321:30046;;23683:9;321:30046;;23544:10;23678:14;23585:107;;;:77;321:30046;;;;;;23544:10;23650:12;23585:77;;;:49;321:30046;;;23625:9;321:30046;;23544:10;23620:14;23585:49;;;321:30046;;;;;;;;;;;;;;;;;1281:24;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;19415:28:2;321:30046;;-1:-1:-1;;;;;;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;19453:19;321:30046;;-1:-1:-1;;;;321:30046:2;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;1197:72:7;;;:::i;:::-;16842:7:2;14867:10;16842:7;:::i;:::-;14840:38;;321:30046;;14983:37;14867:10;16842:7;14867:10;16842:7;:::i;:::-;14983:37;:::i;:::-;14867:10;321:30046;;14958:10;321:30046;;;;;;14867:10;;;;;;15063:74;;;;:::i;:::-;;321:30046;;;-1:-1:-1;321:30046:2;14867:10;321:30046;;;;;;;;;15207:36;;321:30046;;;;15207:36;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;1251:24;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;16842:7;321:30046;;:::i;:::-;16842:7;:::i;:::-;321:30046;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;-1:-1:-1;;;;;321:30046:2;;;;:::i;:::-;;4959:55:3;6048:112:2;4959:55:3;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;24273:10;;24314:19;:49;;;;;321:30046;24314:77;;;;321:30046;24314:107;;;;321:30046;;;;;;;;;;;;24547:18;321:30046;;;;;;;:::i;:::-;;;;;;;;;28460:9;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;;24314:107;321:30046;;24412:9;321:30046;;24273:10;24407:14;24314:107;;;:77;321:30046;;;;;;24273:10;24379:12;24314:77;;;:49;321:30046;;;24354:9;321:30046;;24273:10;24349:14;24314:49;;;321:30046;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;14315:10;6048:112;4959:55:3;14315:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;14372:20;321:30046;14362:30;;321:30046;;-1:-1:-1;14315:10:2;321:30046;;;14487:21;321:30046;;;;;;;;;;;;;;;;;;;;;;14544:39;;321:30046;;;;14544:39;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25134:4;321:30046;;:::i;:::-;;;:::i;:::-;;6048:112;4959:55:3;321:30046:2;;;;;;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;25134:4;:::i;:::-;321:30046;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;22729:10;22770:19;:37;;;;;321:30046;22770:53;;;;321:30046;;;;;22910:15;;321:30046;22910:15;16842:7;;;;:::i;:::-;22973:31;;;:::i;:::-;-1:-1:-1;22935:195:2;;321:30046;;;;;;;22935:195;23042:77;16842:7;;;23088:31;16842:7;;;:::i;:::-;23088:31;;:::i;:::-;23042:77;;:::i;:::-;22935:195;;;;321:30046;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;22770:53;321:30046;;;;;22729:10;22811:12;22770:53;;;:37;321:30046;;;22798:9;321:30046;;22729:10;22793:14;22770:37;;;321:30046;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;10742:27;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;10847:25;321:30046;;;10847:25;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;13583:10;;321:30046;;;;;4790:53:3;321:30046:2;;;;;;;;;;4790:53:3;;:::i;:::-;321:30046:2;;;-1:-1:-1;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;13757:15;321:30046;;;;13709:64;;321:30046;;;;13709:64;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15926:9;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;15912:10;:23;321:30046;;16842:7;;;:::i;:::-;16049:42;;321:30046;;;16297:39;321:30046;;16297:39;321:30046;;;;;;16205:10;321:30046;;16205:36;321:30046;;;;;16205:36;:::i;:::-;321:30046;;;16205:10;321:30046;;;;;;16263:19;321:30046;16263:9;321:30046;16263:19;:::i;:::-;:9;321:30046;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:20:7;1056:62:5;;;:::i;:::-;1197:72:7;;:::i;:::-;321:30046:2;;;-1:-1:-1;;;;321:30046:2;-1:-1:-1;;;321:30046:2;;;;222:10:1;321:30046:2;;2267:20:7;321:30046:2;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;18563:10;18604:19;:49;;;;;321:30046;18604:77;;;;321:30046;18604:107;;;;;321:30046;18604:134;;;;321:30046;;;;;;16842:7;;18882:31;16842:7;;;:::i;18882:31::-;-1:-1:-1;18839:74:2;321:30046;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;18604:134;321:30046;;18732:6;321:30046;;18563:10;18727:11;18604:134;;;:107;321:30046;;;18702:9;321:30046;;18563:10;18697:14;18604:107;;;:77;321:30046;;;;;18563:10;18669:12;18604:77;;;;:49;321:30046;;;18644:9;321:30046;;18563:10;18639:14;18604:49;;;321:30046;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;16842:7;;;;;;;:::i;:::-;8262:78;;;;;:::i;:::-;;321:30046;;;4790:53:3;;;:::i;:::-;321:30046:2;;;-1:-1:-1;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;8579:15;321:30046;;;;8536:59;;321:30046;;;;8536:59;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;20957:9;321:30046;-1:-1:-1;;;;;321:30046:2;;;;20911:10;20952:14;:30;;;;321:30046;;;;;22037:9;321:30046;21170:26;;;:::i;:::-;21233:20;;;;:::i;:::-;21294;;;;:::i;:::-;21330:16;;21348:12;;;;;;321:30046;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;21362:6;21401:14;21496:23;21401:14;;21362:6;21401:14;;;:::i;:::-;321:30046;;;;;21444:10;321:30046;;;;;;21429:33;;;;:::i;:::-;321:30046;21496:23;:::i;:::-;21476:43;;;;:::i;:::-;321:30046;21362:6;:::i;:::-;21330:16;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;20952:30;321:30046;;;;;20911:10;20970:12;20952:30;;321:30046;;;;;;;;;;;;;;;;25134:4;321:30046;;:::i;:::-;;;:::i;:::-;25134:4;;:::i;321:30046::-;;;;;;;;;;;;;;1102:24;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;926:13:6;321:30046:2;;-1:-1:-1;;;;;321:30046:2;222:10:1;321:30046:2;;;1833:24:6;321:30046:2;;-1:-1:-1;;;;;;;;321:30046:2;;;926:13:6;321:30046:2;;;222:10:1;321:30046:2;;;;;;;;2123:40:5;321:30046:2;;2123:40:5;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;6048:112:2;;2891:24:3;;6048:112:2;:::i;:::-;7807:6;7789:15;459:8;7789:15;;459:8;;;7775:38;;321:30046;;;-1:-1:-1;321:30046:2;;7844:18;321:30046;;;;;7844:42;321:30046;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;459:8;-1:-1:-1;;;459:8:2;;;;;321:30046;459:8;;321:30046;;;;;;;;-1:-1:-1;;321:30046:2;;;;1056:62:5;;:::i;:::-;321:30046:2;11089:29;321:30046;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;8920:16;321:30046;;;;;;;;;1499:13:3;;321:30046:2;1564:12:3;;;;;;;1494:109;321:30046:2;;;1494:109:3;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:3:3;321:30046:2;;1514:22:3;;;;;1577:14;;1538:3;1577:14;;;:::i;:::-;321:30046:2;;;;;;;;;;;;;;;;1538:3:3;:::i;:::-;1499:13;;;1514:22;;;321:30046:2;-1:-1:-1;321:30046:2;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;1056:62:5;;:::i;:::-;9328:10:2;321:30046;-1:-1:-1;;;;;321:30046:2;9328:24;;321:30046;;9469:9;321:30046;9458:20;;;321:30046;;9561:20;;;;;;;;;;;:::i;:::-;9469:9;321:30046;9624:74;;;;:::i;:::-;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;1159:25;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;12956:10;6048:112;4959:55:3;12956:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;412:59:0;;487:8;321:30046:2;;12956:10;321:30046;;;;;4520:50:3;321:30046:2;;;;;;;;;;4520:50:3;;;:::i;:::-;321:30046:2;;;;13196:66;321:30046;;;;;12956:10;;321:30046;;;;;;13246:15;321:30046;;;;13196:66;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;1678:7:7;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1056:62:5;;;:::i;:::-;412:59:0;;487:8;;12079:51:2;;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;;12221:27;;;;:55;;321:30046;;;;;;-1:-1:-1;;;;;321:30046:2;;;;12353:25;321:30046;;;12353:25;321:30046;;;12388:19;321:30046;;;12388:19;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;12221:55;321:30046;;;;12252:24;;12221:55;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;12079:51;412:59:0;;;487:8;;12079:51:2;;321:30046;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;6048:112:2;;2891:24:3;;6048:112:2;:::i;:::-;10241:9;321:30046;10230:20;;;;321:30046;;10301:20;;10409:37;10301:20;;;10409:37;10301:20;;;:::i;:::-;10241:9;321:30046;;;;10359:10;321:30046;;10359:35;321:30046;;;;;10359:35;:::i;:::-;321:30046;;;10359:10;321:30046;;;;;;;10409:37;;;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;1056:62:5;;:::i;:::-;1678:7:7;321:30046:2;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;1678:7:7;321:30046:2;;222:10:1;321:30046:2;;2514:22:7;;321:30046:2;;2514:22:7;321:30046:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;22037:9;321:30046;;;;;;;;;;;;;;;;;;;;;;;21799:20;321:30046;;;;;;;;;;;;;;;;;;;;;1190:26;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;4959:55:3;-1:-1:-1;;;;;321:30046:2;;:::i;:::-;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;321:30046:2;;;;;;;;;;;;;;;19841:8;321:30046;-1:-1:-1;;;;;321:30046:2;;;19827:10;:22;321:30046;;19939:12;321:30046;;;;;;;;;;;;;;20064:31;321:30046;20008:11;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;19995:24;321:30046;;;19995:24;321:30046;;;;;;19939:12;321:30046;;;;;20064:31;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;6170:1;321:30046;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;6170:1;:::i;321:30046::-;;;;;;;;;;1056:62:5;;:::i;:::-;11251:22:2;11264:9;11251:22;321:30046;11251:22;:::i;:::-;;321:30046;;;;;;;;;;;;;;;;;1222:23;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;321:30046:2;;4520:50:3;;;:::i;:::-;;459:8:2;7048:15;459:8;7048:15;;;459:8;;;321:30046;7162:158;321:30046;;459:8;321:30046;;;:::i;:::-;7048:15;321:30046;;28460:9;321:30046;30277:81;;321:30046;;;;30277:81;;;321:30046;;;;;;;30240:18;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7048:15;321:30046;459:8;;321:30046;459:8;;321:30046;;459:8;;321:30046;7162:158;321:30046;;459:8;-1:-1:-1;;;459:8:2;;;;;321:30046;459:8;;321:30046;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27721:10;-1:-1:-1;;;;;321:30046:2;;;27721:21;;:48;;;;321:30046;;;;;;;27857:9;321:30046;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;;;27721:48;321:30046;;27760:9;321:30046;;27721:10;27746:23;27721:48;;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;321:30046:2;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;321:30046:2;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;459:8;;;;;;;;;;:::o;:::-;;;;;;;;;;;;321:30046;;;;:::o;:::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;459:8;;;321:30046;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;:::i;:::-;;;;;-1:-1:-1;321:30046:2;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;:::o;5982:196::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;16877:10;;16918:19;:49;;;;;5982:196;16918:77;;;;5982:196;16918:107;;;;5982:196;16918:134;;;;5982:196;321:30046;;;;;;17150:10;321:30046;;;;;;5982:196;:::o;321:30046::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;16918:134;321:30046;;17046:6;321:30046;;16877:10;17041:11;16918:134;;;:107;321:30046;;;17016:9;321:30046;;16877:10;17011:14;16918:107;;;:77;321:30046;;;;;;16877:10;16983:12;16918:77;;;:49;321:30046;;;16958:9;321:30046;;16877:10;16953:14;16918:49;;;321:30046;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;321:30046:2;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;459:8;;;321:30046;;;;;;;;5982:196;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;5982:196;321:30046;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;25162:10;;25203:19;:49;;;;5982:196;25203:77;;;;5982:196;25203:107;;;;5982:196;25203:134;;;;5982:196;321:30046;;;4959:55:3;321:30046:2;;;25442:19;321:30046;;;;;;;4959:55:3;2891:12;2795:127;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;4959:55;5982:196:2;:::o;321:30046::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;;;;25203:134;321:30046;;25331:6;321:30046;;25162:10;25326:11;25203:134;;:107;321:30046;;25301:9;321:30046;;25162:10;25296:14;25203:107;;:77;321:30046;;;;;25162:10;25268:12;25203:77;;:49;321:30046;;25243:9;321:30046;;25162:10;25238:14;25203:49;;25912:964;-1:-1:-1;;;;;321:30046:2;;;;26102:10;26143:19;;:37;;;;25912:964;26143:53;;;;25912:964;321:30046;;;26307:28;;321:30046;;26333:1;;321:30046;;;26402:19;321:30046;;;;;;;;;;;26486:29;;;:::i;:::-;26525:17;;26552:219;26564:22;;;;;;26784:10;;;;26780:64;;26853:16;;;;25912:964;:::o;26780:64::-;321:30046;;;-1:-1:-1;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;26810:23;:::o;321:30046::-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;26588:7;321:30046;;;26588:7;321:30046;;;;;;;;3209:18:3;321:30046:2;;;;3209:18:3;:::i;:::-;321:30046:2;;;;;;;26726:34;;;;:::i;26588:7::-;26557:5;;;;;321:30046;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;26143:53;321:30046;;1266:6:5;321:30046:2;;26102:10;26184:12;26143:53;;:37;321:30046;;26171:9;321:30046;;26102:10;26166:14;26143:37;;27002:493;27145:9;321:30046;-1:-1:-1;;;;;321:30046:2;;;27099:10;27140:14;:30;;;;27002:493;321:30046;;;27299:9;321:30046;;;27285:33;;;;:::i;:::-;27333:13;-1:-1:-1;27333:13:2;27348:22;;;;;;27474:14;;;;;27002:493;:::o;27372:3::-;;321:30046;;;;;;;;;;27436:18;;;;:::i;27372:3::-;27333:13;;321:30046;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;27140:30;321:30046;;-1:-1:-1;321:30046:2;;27099:10;27158:12;27140:30;;28713:368;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;29704:21;321:30046;;;;;;21799:20;321:30046;28858:62;;;;;;28936:45;28713:368;:::o;28854:199::-;29012:30;;28713:368;:::o;321:30046::-;28460:9;321:30046;;;;;;28460:9;-1:-1:-1;321:30046:2;;;;-1:-1:-1;321:30046:2;:::o;:::-;;;;;;;;-1:-1:-1;321:30046:2;;-1:-1:-1;321:30046:2;;;-1:-1:-1;321:30046:2;:::o;725:404:3:-;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;28460:9;321:30046;-1:-1:-1;;;321:30046:2;;;;;;;;;;2891:12:3;321:30046:2;;;28460:9;321:30046;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;28460:9;321:30046;;;;2891:12:3;321:30046:2;;;;2891:12:3;1058:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;725:404:3;-1:-1:-1;321:30046:2;;;2891:12:3;;;321:30046:2;;;;;;809:21:3;;321:30046:2;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;321:30046:2;1004:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;;1058:11:3;:::o;804:319::-;1100:12;;-1:-1:-1;1100:12:3;:::o;1664:1050::-;-1:-1:-1;321:30046:2;;;1867:12:3;321:30046:2;;;;;;-1:-1:-1;;321:30046:2;1901:15:3;;;;-1:-1:-1;;321:30046:2;;;;;;;;;28460:9;321:30046;;;;;;;;;;2045:26:3;;;2041:398;;1897:811;321:30046:2;;;28460:9;321:30046;;;;;;;;;;;:::i;:::-;;;;;;1867:12:3;321:30046:2;;;;;;28460:9;321:30046;;;1867:12:3;321:30046:2;;;;;;1867:12:3;2643:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;2041:398:3;321:30046:2;2111:22:3;2233:26;2111:22;;:::i;:::-;321:30046:2;;;1867:12:3;321:30046:2;;2233:26:3;;;;:::i;321:30046:2:-;;;;;1867:12:3;321:30046:2;;;;;;2041:398:3;;;;;321:30046:2;-1:-1:-1;;;459:8:2;;;;;;;;321:30046;-1:-1:-1;;;459:8:2;;;;;;;;1897:811:3;2685:12;;;:::o;1664:1050::-;;1867:12;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;1901:15:3;;;;1897:811;1901:15;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;;;;;;;;;;2045:26:3;;;2041:398;;1897:811;321:30046:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1867:12:3;2643:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;2041:398:3;321:30046:2;2111:22:3;2233:26;2111:22;;;:::i;:::-;321:30046:2;;;;;;2233:26:3;;;;;:::i;321:30046:2:-;;;;;;;;;;;;2041:398:3;;;;;321:30046:2;-1:-1:-1;;;459:8:2;;;;;;;;321:30046;-1:-1:-1;;;459:8:2;;;;;;;;1897:811:3;2685:12;;;;;:::o;1352:130:5:-;1266:6;321:30046:2;-1:-1:-1;;;;;321:30046:2;222:10:1;1415:23:5;321:30046:2;;1352:130:5:o;321:30046:2:-;;;;;;;;;;;;;;;;;;;;;;;;;1760:106:7;321:30046:2;1678:7:7;321:30046:2;;;;;;1760:106:7:o;321:30046:2:-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;
Swarm Source
ipfs://19c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.