More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,298 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repossess Items | 19260472 | 162 days ago | IN | 0 ETH | 0.01590445 | ||||
Withdraw | 17026292 | 475 days ago | IN | 0 ETH | 0.00111994 | ||||
Repossess Items | 16383642 | 565 days ago | IN | 0 ETH | 0.00726815 | ||||
Repossess Item | 16246810 | 585 days ago | IN | 0 ETH | 0.00161151 | ||||
Repossess Items | 16069501 | 609 days ago | IN | 0 ETH | 0.00500839 | ||||
Repossess Items | 16062313 | 610 days ago | IN | 0 ETH | 0.00550907 | ||||
Make Loan Paymen... | 16020599 | 616 days ago | IN | 0.43 ETH | 0.00196368 | ||||
Repossess Items | 16017188 | 617 days ago | IN | 0 ETH | 0.07507186 | ||||
Make Loan Paymen... | 15997191 | 619 days ago | IN | 0.43 ETH | 0.00151679 | ||||
Make Loan Paymen... | 15997185 | 619 days ago | IN | 0.43 ETH | 0.00163638 | ||||
Make Loan Paymen... | 15989144 | 621 days ago | IN | 0.43 ETH | 0.00143958 | ||||
Make Loan Paymen... | 15988152 | 621 days ago | IN | 0.43 ETH | 0.00171265 | ||||
Make Loan Paymen... | 15988108 | 621 days ago | IN | 0.43 ETH | 0.00169193 | ||||
Make Loan Paymen... | 15978615 | 622 days ago | IN | 0.43 ETH | 0.00167424 | ||||
Make Loan Paymen... | 15978610 | 622 days ago | IN | 0.43 ETH | 0.00172306 | ||||
Make Loan Paymen... | 15975180 | 623 days ago | IN | 0.43 ETH | 0.00180222 | ||||
Make Loan Paymen... | 15975176 | 623 days ago | IN | 0.43 ETH | 0.00178969 | ||||
Make Loan Paymen... | 15975149 | 623 days ago | IN | 0.43 ETH | 0.00161069 | ||||
Make Loan Paymen... | 15975141 | 623 days ago | IN | 0.43 ETH | 0.00168967 | ||||
Repossess Items | 15961488 | 624 days ago | IN | 0 ETH | 0.00365735 | ||||
Make Loan Paymen... | 15951546 | 626 days ago | IN | 0.43 ETH | 0.00482002 | ||||
Make Loan Paymen... | 15925565 | 629 days ago | IN | 0.43 ETH | 0.00145023 | ||||
Make Loan Paymen... | 15925560 | 629 days ago | IN | 0.43 ETH | 0.00146055 | ||||
Make Loan Paymen... | 15924050 | 630 days ago | IN | 0.43 ETH | 0.00210605 | ||||
Make Loan Paymen... | 15924045 | 630 days ago | IN | 0.43 ETH | 0.00241241 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17026292 | 475 days ago | 292.52 ETH | ||||
15360415 | 712 days ago | 0.4 ETH | ||||
15359405 | 712 days ago | 0.4 ETH | ||||
15359399 | 712 days ago | 0.4 ETH | ||||
15355046 | 713 days ago | 0.4 ETH | ||||
15355039 | 713 days ago | 0.4 ETH | ||||
15347268 | 714 days ago | 0.4 ETH | ||||
15347130 | 714 days ago | 0.4 ETH | ||||
15342350 | 715 days ago | 0.4 ETH | ||||
15342108 | 715 days ago | 0.4 ETH | ||||
15342103 | 715 days ago | 0.4 ETH | ||||
15342100 | 715 days ago | 0.4 ETH | ||||
15342025 | 715 days ago | 0.4 ETH | ||||
15342003 | 715 days ago | 0.4 ETH | ||||
15342002 | 715 days ago | 0.4 ETH | ||||
15341084 | 715 days ago | 0.4 ETH | ||||
15340811 | 715 days ago | 0.4 ETH | ||||
15340793 | 715 days ago | 0.4 ETH | ||||
15340151 | 715 days ago | 0.4 ETH | ||||
15340146 | 715 days ago | 0.4 ETH | ||||
15339344 | 716 days ago | 0.4 ETH | ||||
15339322 | 716 days ago | 0.4 ETH | ||||
15334257 | 716 days ago | 0.4 ETH | ||||
15325531 | 718 days ago | 0.4 ETH | ||||
15315286 | 719 days ago | 0.4 ETH |
Loading...
Loading
Contract Name:
Metalend
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import {Sunsetable} from "./Sunsetable.sol"; import {Constants} from "./Constants.sol"; contract Metalend is IERC721Receiver, Ownable, Pausable, Sunsetable { /** ----------------------------------------------------------------------------- * State variable definitions * ----------------------------------------------------------------------------- */ // struct object that represents a single instance of a loan: struct LoanItem { // Storage packing - try and use the smallest number of slots! // (One slot is 32 bytes, or 256 bits, and you have to declare // these in order for the EVM to pack them together. . .) // Addresses are 20 bytes. // Slot 1, 256: uint128 loanId; uint128 currentBalance; // Slot 2, 248: bool isCurrent; address payable borrower; uint32 startDate; uint32 endDate; uint16 tokenId; } // Slot 1 192 (160 + 16 + 16) // This designates the eligible NFT address, i.e. the address from which NFTs can // receive loans in exchange for custodied collateral (the NFT itself): // Contract implementation of ERC721 IERC721 public tokenContract; // Term in days: uint16 public termInDays; // How close to the end date do we need to be to extend in days? uint16 public extensionHorizon; // Slot 2 256 (128 + 64 + 64) // In this version the loan amount is a fixed amount: uint128 public loanAmount; // Each loan attracts a lending fee. The amount the borrower has to repay to redeem the // NFT is the loan amount plus the lending fee: uint64 public lendingFee; // A fee to extend the loan by another loan term: uint64 public extensionFee; // Slot 3 - 160 (160) // Reposession address - this is the address that NFTs will be send to on the expiry // of the loan term. address public repoAddress; // The array of items under loan: LoanItem[] public itemsUnderLoan; /** ----------------------------------------------------------------------------- * Contract event definitions * ----------------------------------------------------------------------------- */ // Events are broadcast and can be watched and tracked on chain: event lendingTransaction( uint128 indexed loanId, uint256 indexed transactionCode, address indexed borrower, uint16 tokenId, uint256 transactionValue, uint256 transactionFee, uint256 loanEndDate, uint256 effectiveDate ); event eligibleNFTAddressSet(address indexed nftAddress); event repoAddressSet(address indexed repoAddress); event loanAmountSet(uint128 indexed loanAmount); event lendingFeeSet(uint64 indexed lendingFee); event extensionFeeSet(uint64 indexed extensionFee); event termInDaysSet(uint16 indexed termInDays); event extensionHorizonSet(uint16 indexed extensionHorizon); event ethWithdrawn(uint256 indexed withdrawal, uint256 effectiveDate); event ethDeposited(uint256 indexed deposit, uint256 effectiveDate); constructor( address _tokenAddress, uint128 _loanAmount, uint16 _termInDays, address _repoAddress, uint64 _lendingFee, uint64 _extensionFee, uint16 _extensionHorizon ) { tokenContract = IERC721(_tokenAddress); loanAmount = _loanAmount; termInDays = _termInDays; repoAddress = _repoAddress; lendingFee = _lendingFee; extensionFee = _extensionFee; extensionHorizon = _extensionHorizon; pause(); } /** ----------------------------------------------------------------------------- * Modifier definitions * ----------------------------------------------------------------------------- */ // Check to see if the array item has the borrower as the calling address: modifier OnlyItemBorrower(uint128 _loanId) { require( itemsUnderLoan[_loanId].borrower == msg.sender, "Payments can only be made by the borrower" ); _; } // Check to see if the array item returned is no longer current: modifier IsUnderLoan(uint128 _loanId) { require( itemsUnderLoan[_loanId].isCurrent == true, "Item is not currently under loan" ); _; } // Check to see if loan can be extended: modifier LoanEligibleForExtension(uint128 _loanId) { require( extensionsAllowed() == true, "Extensions currently not allowed" ); require( isWithinExtensionHorizon(_loanId) == true, "Loan is not within extension horizon" ); _; } // Check to see if loan is within term: modifier LoanWithinLoanTerm(uint128 _loanId) { require( isWithinLoanTerm(_loanId) == true, "Loan term has expired"); _; } /** ----------------------------------------------------------------------------- * Set routines - these routines allow the owner to set parameters on this contract: * ----------------------------------------------------------------------------- */ // Set the address that assets are transfered to on repossession: function setRepoAddress(address _repoAddress) external onlyOwner returns (bool) { repoAddress = _repoAddress; emit repoAddressSet(_repoAddress); return true; } // Set the loan amount: function setLoanAmount(uint128 _loanAmount) external onlyOwner returns (bool) { require(_loanAmount != loanAmount, "No change to loan amount"); if (_loanAmount > loanAmount) { require( (_loanAmount - loanAmount) <= Constants.LOAN_AMOUNT_MAX_INCREMENT, "Change exceeds max increment" ); } else { require( (loanAmount - _loanAmount) <= Constants.LOAN_AMOUNT_MAX_INCREMENT, "Change exceeds max increment" ); } loanAmount = _loanAmount; emit loanAmountSet(_loanAmount); return true; } // Set the lending fee: function setLendingFee(uint64 _lendingFee) external onlyOwner returns (bool) { require(_lendingFee != lendingFee, "No change to lending fee"); if (_lendingFee > lendingFee) { require( (_lendingFee - lendingFee) <= Constants.FEE_MAX_INCREMENT, "Change exceeds max increment" ); } else { require( (lendingFee - _lendingFee) <= Constants.FEE_MAX_INCREMENT, "Change exceeds max increment" ); } lendingFee = _lendingFee; emit lendingFeeSet(_lendingFee); return true; } // Set the extension fee: function setExtensionFee(uint64 _extensionFee) external onlyOwner returns (bool) { require(_extensionFee != extensionFee, "No change to extension fee"); if (_extensionFee > extensionFee) { require( (_extensionFee - extensionFee) <= Constants.FEE_MAX_INCREMENT, "Change exceeds max increment" ); } else { require( (extensionFee - _extensionFee) <= Constants.FEE_MAX_INCREMENT, "Change exceeds max increment" ); } extensionFee = _extensionFee; emit extensionFeeSet(_extensionFee); return true; } // Set the term in days: function setTermInDays(uint16 _termInDays) external onlyOwner returns (bool) { require(_termInDays != termInDays, "No change to term"); require( _termInDays <= Constants.LOAN_TERM_MAX, "Change is more than max term" ); require( _termInDays >= Constants.LOAN_TERM_MIN, "Change is less than min term" ); require( _termInDays >= extensionHorizon, "Term must be greater than or equal to extension horizon" ); termInDays = _termInDays; emit termInDaysSet(_termInDays); return true; } // Set extension horizon in days: function setExtensionHorizon(uint16 _extensionHorizon) external onlyOwner returns (bool) { require(_extensionHorizon != extensionHorizon, "No change to horizon"); require( _extensionHorizon <= Constants.LOAN_TERM_MAX, "Change is more than max term" ); require( _extensionHorizon >= Constants.LOAN_TERM_MIN, "Change is less than min term" ); require( _extensionHorizon <= termInDays, "Extension horizon must be less than or equal to term" ); extensionHorizon = _extensionHorizon; emit extensionHorizonSet(_extensionHorizon); return true; } /** ----------------------------------------------------------------------------- * Contract routines - these do all the work: * ----------------------------------------------------------------------------- */ //Always returns `IERC721Receiver.onERC721Received.selector`. We need this to custody NFTs on the contract: function onERC721Received( address, address, uint256, bytes memory ) external virtual override returns (bytes4) { return this.onERC721Received.selector; } // Allow contract to receive ETH: receive() external payable { require(msg.sender == owner(), "Only owner can fund contract."); require(msg.value > 0, "No ether was sent."); emit ethDeposited(msg.value, block.timestamp); } // The fallback function is executed on a call to the contract if // none of the other functions match the given function signature. fallback() external payable { revert(); } function getParameters() external view returns ( address _tokenAddress, uint32 _loanTerm, uint128 _loanAmount, uint128 _loanFee, uint64 _extensionHorizon, uint128 _extensionFee, bool _isPaused, bool _isSunset ) { return ( address(tokenContract), termInDays, loanAmount, lendingFee, extensionHorizon, extensionFee, paused(), sunsetModeActive() ); } function getLoans() external view returns (LoanItem[] memory) { return itemsUnderLoan; } function pause() public onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function sunset() external onlyOwner { _sunset(); } function sunrise() external onlyOwner { _sunrise(); } function extensionsAllowed() public view returns (bool) { return (extensionFee > 0); } function isWithinExtensionHorizon(uint128 _loanId) public view returns (bool) { return (block.timestamp + (extensionHorizon * Constants.SECONDS_TO_DAYS_FACTOR) >= itemsUnderLoan[_loanId].endDate); } function isWithinLoanTerm(uint128 _loanId) public view returns (bool) { return (block.timestamp <= itemsUnderLoan[_loanId].endDate); } // Ensure that the owner can withdraw deposited ETH: function withdraw(uint256 _withdrawal) external onlyOwner returns (bool) { (bool success, ) = msg.sender.call{value: _withdrawal}(""); require(success, "Transfer failed."); emit ethWithdrawn(_withdrawal, block.timestamp); return true; } // This function is called to advance the borrower ETH in exchange for taking // custody of the asset. function takeLoan(uint16 tokenId) external whenNotPaused whenSun { // The id is the length of the current array as this is the next item: uint256 newItemId = itemsUnderLoan.length; uint32 endDate = uint32(block.timestamp) + (termInDays * Constants.SECONDS_TO_DAYS_FACTOR); // Add this to the array: itemsUnderLoan.push( LoanItem( uint128(newItemId), loanAmount + lendingFee, true, payable(msg.sender), uint32(block.timestamp), endDate, tokenId ) ); // Custody the asset to this contract: tokenContract.safeTransferFrom(msg.sender, address(this), tokenId); // Send the borrower their ETH: payable(msg.sender).transfer(loanAmount); emit lendingTransaction( uint128(newItemId), Constants.TXNCODE_LOAN_ADVANCED, msg.sender, tokenId, loanAmount, lendingFee, endDate, block.timestamp ); } // This function is called when the borrower makes a payment. If the payment // clears the balance of the loan this routine will also return the NFT to the // borrower: function makeLoanPayment(uint128 _loanId) external payable IsUnderLoan(_loanId) OnlyItemBorrower(_loanId) LoanWithinLoanTerm(_loanId) whenNotPaused { require( msg.value <= itemsUnderLoan[_loanId].currentBalance, "Payment exceeds current balance" ); // Reduce the balance outstanding by the amount of ETH received: itemsUnderLoan[_loanId].currentBalance -= uint128(msg.value); // See if this payment means the loan is done and we can return the asset: if (itemsUnderLoan[_loanId].currentBalance == 0) { _closeLoan(_loanId, msg.sender); emit lendingTransaction( _loanId, Constants.TXNCODE_ASSET_REDEEMED, msg.sender, itemsUnderLoan[_loanId].tokenId, msg.value, 0, itemsUnderLoan[_loanId].endDate, block.timestamp ); } else { // Emit this payment event: emit lendingTransaction( _loanId, Constants.TXNCODE_LOAN_PAYMENT_MADE, msg.sender, itemsUnderLoan[_loanId].tokenId, msg.value, 0, itemsUnderLoan[_loanId].endDate, block.timestamp ); } } // This function is called when the borrower extends a loan. The loan can be extended // by the original term in days for payment of the extension fee (if allowed): function extendLoan(uint128 _loanId) external payable IsUnderLoan(_loanId) OnlyItemBorrower(_loanId) LoanWithinLoanTerm(_loanId) LoanEligibleForExtension(_loanId) whenNotPaused whenSun { require(msg.value == extensionFee, "Payment must equal the extension fee"); // Extend the term, that's all we need to do itemsUnderLoan[_loanId].endDate += (termInDays * Constants.SECONDS_TO_DAYS_FACTOR); // Emit the extension events: emit lendingTransaction( _loanId, Constants.TXNCODE_ASSET_EXTENDED, msg.sender, itemsUnderLoan[_loanId].tokenId, msg.value, msg.value, itemsUnderLoan[_loanId].endDate, block.timestamp ); } // This function is called when an item is repossessed. This is ONLY possible when the // loan has lapsed. function repossessItem(uint128 _loanId) public IsUnderLoan(_loanId) { require( itemsUnderLoan[_loanId].endDate < block.timestamp, "Loan term has not yet elapsed" ); _closeLoan(_loanId, repoAddress); emit lendingTransaction( _loanId, Constants.TXNCODE_ASSET_REPOSSESSED, itemsUnderLoan[_loanId].borrower, itemsUnderLoan[_loanId].tokenId, itemsUnderLoan[_loanId].currentBalance, 0, itemsUnderLoan[_loanId].endDate, block.timestamp ); } // Repossess eligible items in batches: function repossessItems(uint128[] calldata repoItems) external { for (uint256 i = 0; i < repoItems.length; i++) { repossessItem(repoItems[i]); } } // Handle loan closure and asset transfer: function _closeLoan(uint128 _closeLoanId, address _tokenTransferTo) internal { itemsUnderLoan[_closeLoanId].isCurrent = false; tokenContract.safeTransferFrom( address(this), _tokenTransferTo, itemsUnderLoan[_closeLoanId].tokenId ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/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 Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which allows children to implement an sunset * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenSun` and `whenMoon`, which can be applied to * the functions of your contract. Note that they will not be useable by * simply including this module, only once the modifiers are put in place. */ abstract contract Sunsetable is Context { /** * @dev Emitted when the sunset is triggered by `account`. */ event Sunset(address account); /** * @dev Emitted when the sunrise is triggered by `account`. */ event Sunrise(address account); bool private _sunsetModeActive; /** * @dev Initializes the contract in sunrised state. */ constructor() { _sunsetModeActive = false; } /** * @dev Returns true if the sun has set, and false otherwise. */ function sunsetModeActive() public view virtual returns (bool) { return _sunsetModeActive; } /** * @dev Modifier to make a function callable only when the sun is up. * * Requirements: * * - The contract must not be in sunset mode. */ modifier whenSun() { require(!sunsetModeActive(), "Sunset: Sun has set on this contract"); _; } /** * @dev Modifier to make a function callable only when the sun has set. * * Requirements: * * - The contract must be in sunset mode. */ modifier whenMoon() { require(sunsetModeActive(), "Sunset: Sun has not set on this contract"); _; } /** * @dev Triggers sunset state. * * Requirements: * * - The contract must not be in sunset already. */ function _sunset() internal virtual whenSun { _sunsetModeActive = true; emit Sunset(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be in sunset mode. */ function _sunrise() internal virtual whenMoon { _sunsetModeActive = false; emit Sunrise(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; library Constants { // Transaction events uint256 constant TXNCODE_LOAN_ADVANCED = 1000; uint256 constant TXNCODE_LOAN_PAYMENT_MADE = 2000; uint256 constant TXNCODE_ASSET_REDEEMED = 3000; uint256 constant TXNCODE_ASSET_EXTENDED = 4000; uint256 constant TXNCODE_ASSET_REPOSSESSED = 5000; uint32 constant SECONDS_TO_DAYS_FACTOR = 86400; uint128 constant LOAN_AMOUNT_MAX_INCREMENT = 300000000000000000; uint64 constant FEE_MAX_INCREMENT = 30000000000000000; uint16 constant LOAN_TERM_MAX = 180; uint16 constant LOAN_TERM_MIN = 14; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint128","name":"_loanAmount","type":"uint128"},{"internalType":"uint16","name":"_termInDays","type":"uint16"},{"internalType":"address","name":"_repoAddress","type":"address"},{"internalType":"uint64","name":"_lendingFee","type":"uint64"},{"internalType":"uint64","name":"_extensionFee","type":"uint64"},{"internalType":"uint16","name":"_extensionHorizon","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Sunrise","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Sunset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftAddress","type":"address"}],"name":"eligibleNFTAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveDate","type":"uint256"}],"name":"ethDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"withdrawal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveDate","type":"uint256"}],"name":"ethWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"extensionFee","type":"uint64"}],"name":"extensionFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"extensionHorizon","type":"uint16"}],"name":"extensionHorizonSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"lendingFee","type":"uint64"}],"name":"lendingFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint128","name":"loanId","type":"uint128"},{"indexed":true,"internalType":"uint256","name":"transactionCode","type":"uint256"},{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"transactionValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanEndDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveDate","type":"uint256"}],"name":"lendingTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint128","name":"loanAmount","type":"uint128"}],"name":"loanAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"repoAddress","type":"address"}],"name":"repoAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"termInDays","type":"uint16"}],"name":"termInDaysSet","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint128","name":"_loanId","type":"uint128"}],"name":"extendLoan","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"extensionFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extensionHorizon","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extensionsAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLoans","outputs":[{"components":[{"internalType":"uint128","name":"loanId","type":"uint128"},{"internalType":"uint128","name":"currentBalance","type":"uint128"},{"internalType":"bool","name":"isCurrent","type":"bool"},{"internalType":"address payable","name":"borrower","type":"address"},{"internalType":"uint32","name":"startDate","type":"uint32"},{"internalType":"uint32","name":"endDate","type":"uint32"},{"internalType":"uint16","name":"tokenId","type":"uint16"}],"internalType":"struct Metalend.LoanItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getParameters","outputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint32","name":"_loanTerm","type":"uint32"},{"internalType":"uint128","name":"_loanAmount","type":"uint128"},{"internalType":"uint128","name":"_loanFee","type":"uint128"},{"internalType":"uint64","name":"_extensionHorizon","type":"uint64"},{"internalType":"uint128","name":"_extensionFee","type":"uint128"},{"internalType":"bool","name":"_isPaused","type":"bool"},{"internalType":"bool","name":"_isSunset","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_loanId","type":"uint128"}],"name":"isWithinExtensionHorizon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_loanId","type":"uint128"}],"name":"isWithinLoanTerm","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemsUnderLoan","outputs":[{"internalType":"uint128","name":"loanId","type":"uint128"},{"internalType":"uint128","name":"currentBalance","type":"uint128"},{"internalType":"bool","name":"isCurrent","type":"bool"},{"internalType":"address payable","name":"borrower","type":"address"},{"internalType":"uint32","name":"startDate","type":"uint32"},{"internalType":"uint32","name":"endDate","type":"uint32"},{"internalType":"uint16","name":"tokenId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lendingFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_loanId","type":"uint128"}],"name":"makeLoanPayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repoAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_loanId","type":"uint128"}],"name":"repossessItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128[]","name":"repoItems","type":"uint128[]"}],"name":"repossessItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_extensionFee","type":"uint64"}],"name":"setExtensionFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_extensionHorizon","type":"uint16"}],"name":"setExtensionHorizon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_lendingFee","type":"uint64"}],"name":"setLendingFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_loanAmount","type":"uint128"}],"name":"setLoanAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_repoAddress","type":"address"}],"name":"setRepoAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_termInDays","type":"uint16"}],"name":"setTermInDays","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sunrise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sunset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sunsetModeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"takeLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"termInDays","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawal","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005b1b38038062005b1b83398181016040528101906200003791906200058e565b620000576200004b620001ef60201b60201c565b620001f760201b60201c565b60008060146101000a81548160ff02191690831515021790555060008060156101000a81548160ff02191690831515021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084600160146101000a81548161ffff021916908361ffff16021790555083600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600260186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600160166101000a81548161ffff021916908361ffff160217905550620001e2620002bb60201b60201c565b5050505050505062000764565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002cb620001ef60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f16200035c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200034a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034190620006a2565b60405180910390fd5b6200035a6200038560201b60201c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003956200043d60201b60201c565b15620003d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cf9062000714565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000424620001ef60201b60201c565b60405162000433919062000747565b60405180910390a1565b60008060149054906101000a900460ff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004858262000458565b9050919050565b620004978162000478565b8114620004a357600080fd5b50565b600081519050620004b7816200048c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620004e481620004bd565b8114620004f057600080fd5b50565b6000815190506200050481620004d9565b92915050565b600061ffff82169050919050565b62000523816200050a565b81146200052f57600080fd5b50565b600081519050620005438162000518565b92915050565b600067ffffffffffffffff82169050919050565b620005688162000549565b81146200057457600080fd5b50565b60008151905062000588816200055d565b92915050565b600080600080600080600060e0888a031215620005b057620005af62000453565b5b6000620005c08a828b01620004a6565b9750506020620005d38a828b01620004f3565b9650506040620005e68a828b0162000532565b9550506060620005f98a828b01620004a6565b94505060806200060c8a828b0162000577565b93505060a06200061f8a828b0162000577565b92505060c0620006328a828b0162000532565b91505092959891949750929550565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200068a60208362000641565b9150620006978262000652565b602082019050919050565b60006020820190508181036000830152620006bd816200067b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620006fc60108362000641565b91506200070982620006c4565b602082019050919050565b600060208201905081810360008301526200072f81620006ed565b9050919050565b620007418162000478565b82525050565b60006020820190506200075e600083018462000736565b92915050565b6153a780620007746000396000f3fe6080604052600436106102085760003560e01c806371ad7ef211610118578063aa4a8711116100a0578063eb6db2611161006f578063eb6db2611461086c578063f242450614610897578063f2fde38b146108c2578063f34885ea146108eb578063fc06d2a614610916576102fe565b8063aa4a87111461079e578063b0ffbcd1146107c9578063bbf5c30a146107f2578063e91b15c01461082f576102fe565b80638ec7a312116100e75780638ec7a312146106ab5780639a0b0c2b146106e85780639d585f7f14610725578063a5ea11da14610750578063a999cf7014610782576102fe565b806371ad7ef2146106015780638456cb591461062c5780638827416e146106435780638da5cb5b14610680576102fe565b8063388c0ef11161019b57806355507f891161016a57806355507f891461053b57806355a373d6146105785780635bd35f46146105a35780635c975abb146105bf578063715018a6146105ea576102fe565b8063388c0ef1146104a75780633f4ba83a146104d057806348e6f296146104e7578063548f0c8814610512576102fe565b806315355420116101d757806315355420146103d757806329ea4f2a146104025780632e1a7d4d1461042d578063306e75051461046a576102fe565b8063026164ad146103035780630a9d1d921461031a5780630f3e3eca1461035d578063150b7a021461039a576102fe565b366102fe5761021561092d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610279906138ce565b60405180910390fd5b600034116102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bc9061393a565b60405180910390fd5b347ecf2bf91687470f7b31cac2ff64b09863cff070ec6fd9cdc72c6b706593ee85426040516102f49190613973565b60405180910390a2005b600080fd5b34801561030f57600080fd5b50610318610956565b005b34801561032657600080fd5b50610341600480360381019061033c91906139ce565b6109dc565b6040516103549796959493929190613abe565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613b59565b610ac1565b6040516103919190613b86565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d25565b610b4e565b6040516103ce9190613de3565b60405180910390f35b3480156103e357600080fd5b506103ec610b62565b6040516103f99190613b86565b60405180910390f35b34801561040e57600080fd5b50610417610b78565b6040516104249190613dfe565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f91906139ce565b610b8c565b6040516104619190613b86565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613e59565b610cf8565b60405161049e9190613b86565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613eb2565b610f82565b005b3480156104dc57600080fd5b506104e5611447565b005b3480156104f357600080fd5b506104fc6114cd565b6040516105099190613dfe565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613b59565b6114e1565b005b34801561054757600080fd5b50610562600480360381019061055d9190613edf565b6117cf565b60405161056f9190613b86565b60405180910390f35b34801561058457600080fd5b5061058d6118da565b60405161059a9190613f6b565b60405180910390f35b6105bd60048036038101906105b89190613b59565b611900565b005b3480156105cb57600080fd5b506105d4611ea0565b6040516105e19190613b86565b60405180910390f35b3480156105f657600080fd5b506105ff611eb6565b005b34801561060d57600080fd5b50610616611f3e565b6040516106239190613b86565b60405180910390f35b34801561063857600080fd5b50610641611f68565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613eb2565b611fee565b6040516106779190613b86565b60405180910390f35b34801561068c57600080fd5b5061069561092d565b6040516106a29190613f95565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613b59565b612211565b6040516106df9190613b86565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613b59565b612515565b60405161071c9190613b86565b60405180910390f35b34801561073157600080fd5b5061073a61256f565b6040516107479190613fb0565b60405180910390f35b34801561075c57600080fd5b50610765612591565b604051610779989796959493929190613fda565b60405180910390f35b61079c60048036038101906107979190613b59565b612681565b005b3480156107aa57600080fd5b506107b3612b48565b6040516107c091906141e0565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190614262565b612d18565b005b3480156107fe57600080fd5b5061081960048036038101906108149190613e59565b612d6e565b6040516108269190613b86565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190613eb2565b612ff8565b6040516108639190613b86565b60405180910390f35b34801561087857600080fd5b5061088161321b565b60405161088e9190613f95565b60405180910390f35b3480156108a357600080fd5b506108ac613241565b6040516108b991906142af565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e49190613edf565b61325b565b005b3480156108f757600080fd5b50610900613353565b60405161090d91906142af565b60405180910390f35b34801561092257600080fd5b5061092b61336d565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61095e6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661097c61092d565b73ffffffffffffffffffffffffffffffffffffffff16146109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990614316565b60405180910390fd5b6109da6133fb565b565b600481815481106109ec57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16908060010160009054906101000a900460ff16908060010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160159054906101000a900463ffffffff16908060010160199054906101000a900463ffffffff169080600101601d9054906101000a900461ffff16905087565b60006004826fffffffffffffffffffffffffffffffff1681548110610ae957610ae8614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff1662015180600160169054906101000a900461ffff1661ffff16610b349190614394565b63ffffffff1642610b4591906143d2565b10159050919050565b600063150b7a0260e01b9050949350505050565b60008060159054906101000a900460ff16905090565b600160169054906101000a900461ffff1681565b6000610b966133f3565b73ffffffffffffffffffffffffffffffffffffffff16610bb461092d565b73ffffffffffffffffffffffffffffffffffffffff1614610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190614316565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051610c3090614459565b60006040518083038185875af1925050503d8060008114610c6d576040519150601f19603f3d011682016040523d82523d6000602084013e610c72565b606091505b5050905080610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906144ba565b60405180910390fd5b827ff13465fdfa21868677163ea21fb9f4528bbd5a45aad384f73822cfe25e0c6a2842604051610ce69190613973565b60405180910390a26001915050919050565b6000610d026133f3565b73ffffffffffffffffffffffffffffffffffffffff16610d2061092d565b73ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614316565b60405180910390fd5b600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90614526565b60405180910390fd5b600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161115610e9957666a94d74f43000067ffffffffffffffff16600260109054906101000a900467ffffffffffffffff1683610e499190614546565b67ffffffffffffffff161115610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906145c6565b60405180910390fd5b610f19565b666a94d74f43000067ffffffffffffffff1682600260109054906101000a900467ffffffffffffffff16610ecd9190614546565b67ffffffffffffffff161115610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906145c6565b60405180910390fd5b5b81600260106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff167f6d829a1d298f0d8cdbc6f53d62c993dc2ecc52946eadc7109e878276e5c6d3ca60405160405180910390a260019050919050565b610f8a611ea0565b15610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc190614632565b60405180910390fd5b610fd2610b62565b15611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906146c4565b60405180910390fd5b60006004805490509050600062015180600160149054906101000a900461ffff1661ffff166110419190614394565b4261104c91906146e4565b905060046040518060e00160405280846fffffffffffffffffffffffffffffffff168152602001600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff166110bd919061471e565b6fffffffffffffffffffffffffffffffff1681526020016001151581526020013373ffffffffffffffffffffffffffffffffffffffff1681526020014263ffffffff1681526020018363ffffffff1681526020018561ffff16815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548160ff02191690831515021790555060608201518160010160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160010160156101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160196101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601d6101000a81548161ffff021916908361ffff1602179055505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330866040518463ffffffff1660e01b81526004016112f993929190614795565b600060405180830381600087803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f193505050501580156113a1573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166103e8836fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a186600260009054906101000a90046fffffffffffffffffffffffffffffffff16600260109054906101000a900467ffffffffffffffff16874260405161143a95949392919061485f565b60405180910390a4505050565b61144f6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661146d61092d565b73ffffffffffffffffffffffffffffffffffffffff16146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614316565b60405180910390fd5b6114cb61349e565b565b600160149054906101000a900461ffff1681565b80600115156004826fffffffffffffffffffffffffffffffff168154811061150c5761150b614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906148fe565b60405180910390fd5b426004836fffffffffffffffffffffffffffffffff168154811061159457611593614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff16106115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061496a565b60405180910390fd5b61162882600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661353f565b6004826fffffffffffffffffffffffffffffffff168154811061164e5761164d614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611388836fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004866fffffffffffffffffffffffffffffffff16815481106116f3576116f2614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff166004876fffffffffffffffffffffffffffffffff168154811061173957611738614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff1660006004896fffffffffffffffffffffffffffffffff168154811061178f5761178e614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff16426040516117c39594939291906149c5565b60405180910390a45050565b60006117d96133f3565b73ffffffffffffffffffffffffffffffffffffffff166117f761092d565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614316565b60405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f93a8b999c8310f7c6c44ac5737941785b1624c23935f110617bf7b4c6cf638cf60405160405180910390a260019050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600115156004826fffffffffffffffffffffffffffffffff168154811061192b5761192a614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461198c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906148fe565b60405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff166004826fffffffffffffffffffffffffffffffff16815481106119ca576119c9614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614a8a565b60405180910390fd5b8260011515611a6082612515565b151514611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614af6565b60405180910390fd5b611aaa611ea0565b15611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae190614632565b60405180910390fd5b6004846fffffffffffffffffffffffffffffffff1681548110611b1057611b0f614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16341115611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990614b62565b60405180910390fd5b346004856fffffffffffffffffffffffffffffffff1681548110611bb957611bb8614336565b5b906000526020600020906002020160000160108282829054906101000a90046fffffffffffffffffffffffffffffffff16611bf49190614b82565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060006004856fffffffffffffffffffffffffffffffff1681548110611c5257611c51614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161415611da057611ca2843361353f565b3373ffffffffffffffffffffffffffffffffffffffff16610bb8856fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004886fffffffffffffffffffffffffffffffff1681548110611d1657611d15614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff1634600060048b6fffffffffffffffffffffffffffffffff1681548110611d5f57611d5e614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051611d93959493929190614bb6565b60405180910390a4611e9a565b3373ffffffffffffffffffffffffffffffffffffffff166107d0856fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004886fffffffffffffffffffffffffffffffff1681548110611e1457611e13614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff1634600060048b6fffffffffffffffffffffffffffffffff1681548110611e5d57611e5c614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051611e91959493929190614bb6565b60405180910390a45b50505050565b60008060149054906101000a900460ff16905090565b611ebe6133f3565b73ffffffffffffffffffffffffffffffffffffffff16611edc61092d565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990614316565b60405180910390fd5b611f3c6000613669565b565b600080600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611905090565b611f706133f3565b73ffffffffffffffffffffffffffffffffffffffff16611f8e61092d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614316565b60405180910390fd5b611fec61372d565b565b6000611ff86133f3565b73ffffffffffffffffffffffffffffffffffffffff1661201661092d565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390614316565b60405180910390fd5b600160149054906101000a900461ffff1661ffff168261ffff1614156120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614c55565b60405180910390fd5b60b461ffff168261ffff161115612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90614cc1565b60405180910390fd5b600e61ffff168261ffff16101561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614d2d565b60405180910390fd5b600160169054906101000a900461ffff1661ffff168261ffff1610156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614dbf565b60405180910390fd5b81600160146101000a81548161ffff021916908361ffff1602179055508161ffff167f2296261fb5f4e74de3f1b214934540a054c5a6a1e38fd8e8ab2746f11ba400e960405160405180910390a260019050919050565b600061221b6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661223961092d565b73ffffffffffffffffffffffffffffffffffffffff161461228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690614316565b60405180910390fd5b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161415612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614e2b565b60405180910390fd5b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611156123fb57670429d069189e00006fffffffffffffffffffffffffffffffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff16836123a39190614b82565b6fffffffffffffffffffffffffffffffff1611156123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906145c6565b60405180910390fd5b612494565b670429d069189e00006fffffffffffffffffffffffffffffffff1682600260009054906101000a90046fffffffffffffffffffffffffffffffff166124409190614b82565b6fffffffffffffffffffffffffffffffff161115612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a906145c6565b60405180910390fd5b5b81600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550816fffffffffffffffffffffffffffffffff167fe36963f279d1bf3e7eff5333c8eff89f6e3ab8dc650e01e39a2fcddb59314f0b60405160405180910390a260019050919050565b60006004826fffffffffffffffffffffffffffffffff168154811061253d5761253c614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff164211159050919050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160149054906101000a900461ffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff16600260109054906101000a900467ffffffffffffffff16600160169054906101000a900461ffff16600260189054906101000a900467ffffffffffffffff16612637611ea0565b61263f610b62565b8661ffff1696508467ffffffffffffffff1694508361ffff1693508267ffffffffffffffff169250975097509750975097509750975097509091929394959697565b80600115156004826fffffffffffffffffffffffffffffffff16815481106126ac576126ab614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461270d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612704906148fe565b60405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff166004826fffffffffffffffffffffffffffffffff168154811061274b5761274a614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90614a8a565b60405180910390fd5b82600115156127e182612515565b151514612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a90614af6565b60405180910390fd5b8360011515612830611f3e565b151514612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614e97565b60405180910390fd5b6001151561287f82610ac1565b1515146128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890614f29565b60405180910390fd5b6128c9611ea0565b15612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290090614632565b60405180910390fd5b612911610b62565b15612951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612948906146c4565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff1634146129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614fbb565b60405180910390fd5b62015180600160149054906101000a900461ffff1661ffff166129d69190614394565b6004866fffffffffffffffffffffffffffffffff16815481106129fc576129fb614336565b5b906000526020600020906002020160010160198282829054906101000a900463ffffffff16612a2b91906146e4565b92506101000a81548163ffffffff021916908363ffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16610fa0866fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004896fffffffffffffffffffffffffffffffff1681548110612abd57612abc614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff16343460048c6fffffffffffffffffffffffffffffffff1681548110612b0557612b04614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051612b39959493929190614fdb565b60405180910390a45050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015612d0f57838290600052602060002090600202016040518060e00160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160159054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160199054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601d9054906101000a900461ffff1661ffff1661ffff168152505081526020019060010190612b6c565b50505050905090565b60005b82829050811015612d6957612d56838383818110612d3c57612d3b614336565b5b9050602002016020810190612d519190613b59565b6114e1565b8080612d619061502e565b915050612d1b565b505050565b6000612d786133f3565b73ffffffffffffffffffffffffffffffffffffffff16612d9661092d565b73ffffffffffffffffffffffffffffffffffffffff1614612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de390614316565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e50906150c3565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161115612f0f57666a94d74f43000067ffffffffffffffff16600260189054906101000a900467ffffffffffffffff1683612ebf9190614546565b67ffffffffffffffff161115612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f01906145c6565b60405180910390fd5b612f8f565b666a94d74f43000067ffffffffffffffff1682600260189054906101000a900467ffffffffffffffff16612f439190614546565b67ffffffffffffffff161115612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85906145c6565b60405180910390fd5b5b81600260186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff167f6c10d4bb7502566ba4cda42d1bb0d8cb9ac790af8f63ce45d18ef87a27a9493b60405160405180910390a260019050919050565b60006130026133f3565b73ffffffffffffffffffffffffffffffffffffffff1661302061092d565b73ffffffffffffffffffffffffffffffffffffffff1614613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90614316565b60405180910390fd5b600160169054906101000a900461ffff1661ffff168261ffff1614156130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c89061512f565b60405180910390fd5b60b461ffff168261ffff16111561311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614cc1565b60405180910390fd5b600e61ffff168261ffff161015613169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316090614d2d565b60405180910390fd5b600160149054906101000a900461ffff1661ffff168261ffff1611156131c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bb906151c1565b60405180910390fd5b81600160166101000a81548161ffff021916908361ffff1602179055508161ffff167f8074608a4fa60d4f8e4067a6b8f167a38f5e5d6f3708b5ac062a350806e26dec60405160405180910390a260019050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260189054906101000a900467ffffffffffffffff1681565b6132636133f3565b73ffffffffffffffffffffffffffffffffffffffff1661328161092d565b73ffffffffffffffffffffffffffffffffffffffff16146132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614316565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e90615253565b60405180910390fd5b61335081613669565b50565b600260109054906101000a900467ffffffffffffffff1681565b6133756133f3565b73ffffffffffffffffffffffffffffffffffffffff1661339361092d565b73ffffffffffffffffffffffffffffffffffffffff16146133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e090614316565b60405180910390fd5b6133f16137d0565b565b600033905090565b613403610b62565b15613443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343a906146c4565b60405180910390fd5b6001600060156101000a81548160ff0219169083151502179055507fa9c59d2a6292667f4d3a985c73ca4efe42927b9da8f1bb74c22abe5629bdad2a6134876133f3565b6040516134949190613f95565b60405180910390a1565b6134a6611ea0565b6134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc906152bf565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135286133f3565b6040516135359190613f95565b60405180910390a1565b60006004836fffffffffffffffffffffffffffffffff168154811061356757613566614336565b5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30836004866fffffffffffffffffffffffffffffffff16815481106135f5576135f4614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff166040518463ffffffff1660e01b815260040161363393929190614795565b600060405180830381600087803b15801561364d57600080fd5b505af1158015613661573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613735611ea0565b15613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614632565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137b96133f3565b6040516137c69190613f95565b60405180910390a1565b6137d8610b62565b613817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380e90615351565b60405180910390fd5b60008060156101000a81548160ff0219169083151502179055507f2be8658a5d86be8f67084b7c8d034e3b6866a9539f720ff3cbfe889a61b3b3be61385a6133f3565b6040516138679190613f95565b60405180910390a1565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2066756e6420636f6e74726163742e000000600082015250565b60006138b8601d83613871565b91506138c382613882565b602082019050919050565b600060208201905081810360008301526138e7816138ab565b9050919050565b7f4e6f206574686572207761732073656e742e0000000000000000000000000000600082015250565b6000613924601283613871565b915061392f826138ee565b602082019050919050565b6000602082019050818103600083015261395381613917565b9050919050565b6000819050919050565b61396d8161395a565b82525050565b60006020820190506139886000830184613964565b92915050565b6000604051905090565b600080fd5b600080fd5b6139ab8161395a565b81146139b657600080fd5b50565b6000813590506139c8816139a2565b92915050565b6000602082840312156139e4576139e3613998565b5b60006139f2848285016139b9565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b613a20816139fb565b82525050565b60008115159050919050565b613a3b81613a26565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a6c82613a41565b9050919050565b613a7c81613a61565b82525050565b600063ffffffff82169050919050565b613a9b81613a82565b82525050565b600061ffff82169050919050565b613ab881613aa1565b82525050565b600060e082019050613ad3600083018a613a17565b613ae06020830189613a17565b613aed6040830188613a32565b613afa6060830187613a73565b613b076080830186613a92565b613b1460a0830185613a92565b613b2160c0830184613aaf565b98975050505050505050565b613b36816139fb565b8114613b4157600080fd5b50565b600081359050613b5381613b2d565b92915050565b600060208284031215613b6f57613b6e613998565b5b6000613b7d84828501613b44565b91505092915050565b6000602082019050613b9b6000830184613a32565b92915050565b6000613bac82613a41565b9050919050565b613bbc81613ba1565b8114613bc757600080fd5b50565b600081359050613bd981613bb3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c3282613be9565b810181811067ffffffffffffffff82111715613c5157613c50613bfa565b5b80604052505050565b6000613c6461398e565b9050613c708282613c29565b919050565b600067ffffffffffffffff821115613c9057613c8f613bfa565b5b613c9982613be9565b9050602081019050919050565b82818337600083830152505050565b6000613cc8613cc384613c75565b613c5a565b905082815260208101848484011115613ce457613ce3613be4565b5b613cef848285613ca6565b509392505050565b600082601f830112613d0c57613d0b613bdf565b5b8135613d1c848260208601613cb5565b91505092915050565b60008060008060808587031215613d3f57613d3e613998565b5b6000613d4d87828801613bca565b9450506020613d5e87828801613bca565b9350506040613d6f878288016139b9565b925050606085013567ffffffffffffffff811115613d9057613d8f61399d565b5b613d9c87828801613cf7565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ddd81613da8565b82525050565b6000602082019050613df86000830184613dd4565b92915050565b6000602082019050613e136000830184613aaf565b92915050565b600067ffffffffffffffff82169050919050565b613e3681613e19565b8114613e4157600080fd5b50565b600081359050613e5381613e2d565b92915050565b600060208284031215613e6f57613e6e613998565b5b6000613e7d84828501613e44565b91505092915050565b613e8f81613aa1565b8114613e9a57600080fd5b50565b600081359050613eac81613e86565b92915050565b600060208284031215613ec857613ec7613998565b5b6000613ed684828501613e9d565b91505092915050565b600060208284031215613ef557613ef4613998565b5b6000613f0384828501613bca565b91505092915050565b6000819050919050565b6000613f31613f2c613f2784613a41565b613f0c565b613a41565b9050919050565b6000613f4382613f16565b9050919050565b6000613f5582613f38565b9050919050565b613f6581613f4a565b82525050565b6000602082019050613f806000830184613f5c565b92915050565b613f8f81613ba1565b82525050565b6000602082019050613faa6000830184613f86565b92915050565b6000602082019050613fc56000830184613a17565b92915050565b613fd481613e19565b82525050565b600061010082019050613ff0600083018b613f86565b613ffd602083018a613a92565b61400a6040830189613a17565b6140176060830188613a17565b6140246080830187613fcb565b61403160a0830186613a17565b61403e60c0830185613a32565b61404b60e0830184613a32565b9998505050505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61408d816139fb565b82525050565b61409c81613a26565b82525050565b6140ab81613a61565b82525050565b6140ba81613a82565b82525050565b6140c981613aa1565b82525050565b60e0820160008201516140e56000850182614084565b5060208201516140f86020850182614084565b50604082015161410b6040850182614093565b50606082015161411e60608501826140a2565b50608082015161413160808501826140b1565b5060a082015161414460a08501826140b1565b5060c082015161415760c08501826140c0565b50505050565b600061416983836140cf565b60e08301905092915050565b6000602082019050919050565b600061418d82614058565b6141978185614063565b93506141a283614074565b8060005b838110156141d35781516141ba888261415d565b97506141c583614175565b9250506001810190506141a6565b5085935050505092915050565b600060208201905081810360008301526141fa8184614182565b905092915050565b600080fd5b600080fd5b60008083601f84011261422257614221613bdf565b5b8235905067ffffffffffffffff81111561423f5761423e614202565b5b60208301915083602082028301111561425b5761425a614207565b5b9250929050565b6000806020838503121561427957614278613998565b5b600083013567ffffffffffffffff8111156142975761429661399d565b5b6142a38582860161420c565b92509250509250929050565b60006020820190506142c46000830184613fcb565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614300602083613871565b915061430b826142ca565b602082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439f82613a82565b91506143aa83613a82565b92508163ffffffff04831182151516156143c7576143c6614365565b5b828202905092915050565b60006143dd8261395a565b91506143e88361395a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561441d5761441c614365565b5b828201905092915050565b600081905092915050565b50565b6000614443600083614428565b915061444e82614433565b600082019050919050565b600061446482614436565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006144a4601083613871565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f4e6f206368616e676520746f206c656e64696e67206665650000000000000000600082015250565b6000614510601883613871565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b9050919050565b600061455182613e19565b915061455c83613e19565b92508282101561456f5761456e614365565b5b828203905092915050565b7f4368616e67652065786365656473206d617820696e6372656d656e7400000000600082015250565b60006145b0601c83613871565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061461c601083613871565b9150614627826145e6565b602082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b7f53756e7365743a2053756e2068617320736574206f6e207468697320636f6e7460008201527f7261637400000000000000000000000000000000000000000000000000000000602082015250565b60006146ae602483613871565b91506146b982614652565b604082019050919050565b600060208201905081810360008301526146dd816146a1565b9050919050565b60006146ef82613a82565b91506146fa83613a82565b92508263ffffffff0382111561471357614712614365565b5b828201905092915050565b6000614729826139fb565b9150614734836139fb565b9250826fffffffffffffffffffffffffffffffff0382111561475957614758614365565b5b828201905092915050565b600061477f61477a61477584613aa1565b613f0c565b61395a565b9050919050565b61478f81614764565b82525050565b60006060820190506147aa6000830186613f86565b6147b76020830185613f86565b6147c46040830184614786565b949350505050565b60006147e76147e26147dd846139fb565b613f0c565b61395a565b9050919050565b6147f7816147cc565b82525050565b600061481861481361480e84613e19565b613f0c565b61395a565b9050919050565b614828816147fd565b82525050565b600061484961484461483f84613a82565b613f0c565b61395a565b9050919050565b6148598161482e565b82525050565b600060a0820190506148746000830188613aaf565b61488160208301876147ee565b61488e604083018661481f565b61489b6060830185614850565b6148a86080830184613964565b9695505050505050565b7f4974656d206973206e6f742063757272656e746c7920756e646572206c6f616e600082015250565b60006148e8602083613871565b91506148f3826148b2565b602082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4c6f616e207465726d20686173206e6f742079657420656c6170736564000000600082015250565b6000614954601d83613871565b915061495f8261491e565b602082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b6000819050919050565b60006149af6149aa6149a58461498a565b613f0c565b61395a565b9050919050565b6149bf81614994565b82525050565b600060a0820190506149da6000830188613aaf565b6149e760208301876147ee565b6149f460408301866149b6565b614a016060830185614850565b614a0e6080830184613964565b9695505050505050565b7f5061796d656e74732063616e206f6e6c79206265206d6164652062792074686560008201527f20626f72726f7765720000000000000000000000000000000000000000000000602082015250565b6000614a74602983613871565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f4c6f616e207465726d2068617320657870697265640000000000000000000000600082015250565b6000614ae0601583613871565b9150614aeb82614aaa565b602082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f5061796d656e7420657863656564732063757272656e742062616c616e636500600082015250565b6000614b4c601f83613871565b9150614b5782614b16565b602082019050919050565b60006020820190508181036000830152614b7b81614b3f565b9050919050565b6000614b8d826139fb565b9150614b98836139fb565b925082821015614bab57614baa614365565b5b828203905092915050565b600060a082019050614bcb6000830188613aaf565b614bd86020830187613964565b614be560408301866149b6565b614bf26060830185614850565b614bff6080830184613964565b9695505050505050565b7f4e6f206368616e676520746f207465726d000000000000000000000000000000600082015250565b6000614c3f601183613871565b9150614c4a82614c09565b602082019050919050565b60006020820190508181036000830152614c6e81614c32565b9050919050565b7f4368616e6765206973206d6f7265207468616e206d6178207465726d00000000600082015250565b6000614cab601c83613871565b9150614cb682614c75565b602082019050919050565b60006020820190508181036000830152614cda81614c9e565b9050919050565b7f4368616e6765206973206c657373207468616e206d696e207465726d00000000600082015250565b6000614d17601c83613871565b9150614d2282614ce1565b602082019050919050565b60006020820190508181036000830152614d4681614d0a565b9050919050565b7f5465726d206d7573742062652067726561746572207468616e206f722065717560008201527f616c20746f20657874656e73696f6e20686f72697a6f6e000000000000000000602082015250565b6000614da9603783613871565b9150614db482614d4d565b604082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f4e6f206368616e676520746f206c6f616e20616d6f756e740000000000000000600082015250565b6000614e15601883613871565b9150614e2082614ddf565b602082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f457874656e73696f6e732063757272656e746c79206e6f7420616c6c6f776564600082015250565b6000614e81602083613871565b9150614e8c82614e4b565b602082019050919050565b60006020820190508181036000830152614eb081614e74565b9050919050565b7f4c6f616e206973206e6f742077697468696e20657874656e73696f6e20686f7260008201527f697a6f6e00000000000000000000000000000000000000000000000000000000602082015250565b6000614f13602483613871565b9150614f1e82614eb7565b604082019050919050565b60006020820190508181036000830152614f4281614f06565b9050919050565b7f5061796d656e74206d75737420657175616c2074686520657874656e73696f6e60008201527f2066656500000000000000000000000000000000000000000000000000000000602082015250565b6000614fa5602483613871565b9150614fb082614f49565b604082019050919050565b60006020820190508181036000830152614fd481614f98565b9050919050565b600060a082019050614ff06000830188613aaf565b614ffd6020830187613964565b61500a6040830186613964565b6150176060830185614850565b6150246080830184613964565b9695505050505050565b60006150398261395a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506c5761506b614365565b5b600182019050919050565b7f4e6f206368616e676520746f20657874656e73696f6e20666565000000000000600082015250565b60006150ad601a83613871565b91506150b882615077565b602082019050919050565b600060208201905081810360008301526150dc816150a0565b9050919050565b7f4e6f206368616e676520746f20686f72697a6f6e000000000000000000000000600082015250565b6000615119601483613871565b9150615124826150e3565b602082019050919050565b600060208201905081810360008301526151488161510c565b9050919050565b7f457874656e73696f6e20686f72697a6f6e206d757374206265206c657373207460008201527f68616e206f7220657175616c20746f207465726d000000000000000000000000602082015250565b60006151ab603483613871565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061523d602683613871565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006152a9601483613871565b91506152b482615273565b602082019050919050565b600060208201905081810360008301526152d88161529c565b9050919050565b7f53756e7365743a2053756e20686173206e6f7420736574206f6e20746869732060008201527f636f6e7472616374000000000000000000000000000000000000000000000000602082015250565b600061533b602883613871565b9150615346826152df565b604082019050919050565b6000602082019050818103600083015261536a8161532e565b905091905056fea2646970667358221220d6ef25123c1dbe6d29c0cf1010be35cd935cf28d06adeedd48905e359a4946ee64736f6c634300080900330000000000000000000000001d20a51f088492a0f1c57f047a9e30c9ab5c07ea000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000001f3621d2d57ee42d3e0cc0aa42156d0c3f7744a5000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000001e
Deployed Bytecode
0x6080604052600436106102085760003560e01c806371ad7ef211610118578063aa4a8711116100a0578063eb6db2611161006f578063eb6db2611461086c578063f242450614610897578063f2fde38b146108c2578063f34885ea146108eb578063fc06d2a614610916576102fe565b8063aa4a87111461079e578063b0ffbcd1146107c9578063bbf5c30a146107f2578063e91b15c01461082f576102fe565b80638ec7a312116100e75780638ec7a312146106ab5780639a0b0c2b146106e85780639d585f7f14610725578063a5ea11da14610750578063a999cf7014610782576102fe565b806371ad7ef2146106015780638456cb591461062c5780638827416e146106435780638da5cb5b14610680576102fe565b8063388c0ef11161019b57806355507f891161016a57806355507f891461053b57806355a373d6146105785780635bd35f46146105a35780635c975abb146105bf578063715018a6146105ea576102fe565b8063388c0ef1146104a75780633f4ba83a146104d057806348e6f296146104e7578063548f0c8814610512576102fe565b806315355420116101d757806315355420146103d757806329ea4f2a146104025780632e1a7d4d1461042d578063306e75051461046a576102fe565b8063026164ad146103035780630a9d1d921461031a5780630f3e3eca1461035d578063150b7a021461039a576102fe565b366102fe5761021561092d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610279906138ce565b60405180910390fd5b600034116102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bc9061393a565b60405180910390fd5b347ecf2bf91687470f7b31cac2ff64b09863cff070ec6fd9cdc72c6b706593ee85426040516102f49190613973565b60405180910390a2005b600080fd5b34801561030f57600080fd5b50610318610956565b005b34801561032657600080fd5b50610341600480360381019061033c91906139ce565b6109dc565b6040516103549796959493929190613abe565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613b59565b610ac1565b6040516103919190613b86565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d25565b610b4e565b6040516103ce9190613de3565b60405180910390f35b3480156103e357600080fd5b506103ec610b62565b6040516103f99190613b86565b60405180910390f35b34801561040e57600080fd5b50610417610b78565b6040516104249190613dfe565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f91906139ce565b610b8c565b6040516104619190613b86565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613e59565b610cf8565b60405161049e9190613b86565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613eb2565b610f82565b005b3480156104dc57600080fd5b506104e5611447565b005b3480156104f357600080fd5b506104fc6114cd565b6040516105099190613dfe565b60405180910390f35b34801561051e57600080fd5b5061053960048036038101906105349190613b59565b6114e1565b005b34801561054757600080fd5b50610562600480360381019061055d9190613edf565b6117cf565b60405161056f9190613b86565b60405180910390f35b34801561058457600080fd5b5061058d6118da565b60405161059a9190613f6b565b60405180910390f35b6105bd60048036038101906105b89190613b59565b611900565b005b3480156105cb57600080fd5b506105d4611ea0565b6040516105e19190613b86565b60405180910390f35b3480156105f657600080fd5b506105ff611eb6565b005b34801561060d57600080fd5b50610616611f3e565b6040516106239190613b86565b60405180910390f35b34801561063857600080fd5b50610641611f68565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613eb2565b611fee565b6040516106779190613b86565b60405180910390f35b34801561068c57600080fd5b5061069561092d565b6040516106a29190613f95565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613b59565b612211565b6040516106df9190613b86565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613b59565b612515565b60405161071c9190613b86565b60405180910390f35b34801561073157600080fd5b5061073a61256f565b6040516107479190613fb0565b60405180910390f35b34801561075c57600080fd5b50610765612591565b604051610779989796959493929190613fda565b60405180910390f35b61079c60048036038101906107979190613b59565b612681565b005b3480156107aa57600080fd5b506107b3612b48565b6040516107c091906141e0565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190614262565b612d18565b005b3480156107fe57600080fd5b5061081960048036038101906108149190613e59565b612d6e565b6040516108269190613b86565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190613eb2565b612ff8565b6040516108639190613b86565b60405180910390f35b34801561087857600080fd5b5061088161321b565b60405161088e9190613f95565b60405180910390f35b3480156108a357600080fd5b506108ac613241565b6040516108b991906142af565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e49190613edf565b61325b565b005b3480156108f757600080fd5b50610900613353565b60405161090d91906142af565b60405180910390f35b34801561092257600080fd5b5061092b61336d565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61095e6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661097c61092d565b73ffffffffffffffffffffffffffffffffffffffff16146109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990614316565b60405180910390fd5b6109da6133fb565b565b600481815481106109ec57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16908060010160009054906101000a900460ff16908060010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160159054906101000a900463ffffffff16908060010160199054906101000a900463ffffffff169080600101601d9054906101000a900461ffff16905087565b60006004826fffffffffffffffffffffffffffffffff1681548110610ae957610ae8614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff1662015180600160169054906101000a900461ffff1661ffff16610b349190614394565b63ffffffff1642610b4591906143d2565b10159050919050565b600063150b7a0260e01b9050949350505050565b60008060159054906101000a900460ff16905090565b600160169054906101000a900461ffff1681565b6000610b966133f3565b73ffffffffffffffffffffffffffffffffffffffff16610bb461092d565b73ffffffffffffffffffffffffffffffffffffffff1614610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190614316565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051610c3090614459565b60006040518083038185875af1925050503d8060008114610c6d576040519150601f19603f3d011682016040523d82523d6000602084013e610c72565b606091505b5050905080610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906144ba565b60405180910390fd5b827ff13465fdfa21868677163ea21fb9f4528bbd5a45aad384f73822cfe25e0c6a2842604051610ce69190613973565b60405180910390a26001915050919050565b6000610d026133f3565b73ffffffffffffffffffffffffffffffffffffffff16610d2061092d565b73ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614316565b60405180910390fd5b600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90614526565b60405180910390fd5b600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161115610e9957666a94d74f43000067ffffffffffffffff16600260109054906101000a900467ffffffffffffffff1683610e499190614546565b67ffffffffffffffff161115610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b906145c6565b60405180910390fd5b610f19565b666a94d74f43000067ffffffffffffffff1682600260109054906101000a900467ffffffffffffffff16610ecd9190614546565b67ffffffffffffffff161115610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906145c6565b60405180910390fd5b5b81600260106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff167f6d829a1d298f0d8cdbc6f53d62c993dc2ecc52946eadc7109e878276e5c6d3ca60405160405180910390a260019050919050565b610f8a611ea0565b15610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc190614632565b60405180910390fd5b610fd2610b62565b15611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906146c4565b60405180910390fd5b60006004805490509050600062015180600160149054906101000a900461ffff1661ffff166110419190614394565b4261104c91906146e4565b905060046040518060e00160405280846fffffffffffffffffffffffffffffffff168152602001600260109054906101000a900467ffffffffffffffff1667ffffffffffffffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff166110bd919061471e565b6fffffffffffffffffffffffffffffffff1681526020016001151581526020013373ffffffffffffffffffffffffffffffffffffffff1681526020014263ffffffff1681526020018363ffffffff1681526020018561ffff16815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548160ff02191690831515021790555060608201518160010160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160010160156101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160196101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601d6101000a81548161ffff021916908361ffff1602179055505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330866040518463ffffffff1660e01b81526004016112f993929190614795565b600060405180830381600087803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169081150290604051600060405180830381858888f193505050501580156113a1573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166103e8836fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a186600260009054906101000a90046fffffffffffffffffffffffffffffffff16600260109054906101000a900467ffffffffffffffff16874260405161143a95949392919061485f565b60405180910390a4505050565b61144f6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661146d61092d565b73ffffffffffffffffffffffffffffffffffffffff16146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614316565b60405180910390fd5b6114cb61349e565b565b600160149054906101000a900461ffff1681565b80600115156004826fffffffffffffffffffffffffffffffff168154811061150c5761150b614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906148fe565b60405180910390fd5b426004836fffffffffffffffffffffffffffffffff168154811061159457611593614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff16106115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061496a565b60405180910390fd5b61162882600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661353f565b6004826fffffffffffffffffffffffffffffffff168154811061164e5761164d614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611388836fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004866fffffffffffffffffffffffffffffffff16815481106116f3576116f2614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff166004876fffffffffffffffffffffffffffffffff168154811061173957611738614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff1660006004896fffffffffffffffffffffffffffffffff168154811061178f5761178e614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff16426040516117c39594939291906149c5565b60405180910390a45050565b60006117d96133f3565b73ffffffffffffffffffffffffffffffffffffffff166117f761092d565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614316565b60405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f93a8b999c8310f7c6c44ac5737941785b1624c23935f110617bf7b4c6cf638cf60405160405180910390a260019050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600115156004826fffffffffffffffffffffffffffffffff168154811061192b5761192a614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461198c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611983906148fe565b60405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff166004826fffffffffffffffffffffffffffffffff16815481106119ca576119c9614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4990614a8a565b60405180910390fd5b8260011515611a6082612515565b151514611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614af6565b60405180910390fd5b611aaa611ea0565b15611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae190614632565b60405180910390fd5b6004846fffffffffffffffffffffffffffffffff1681548110611b1057611b0f614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16341115611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990614b62565b60405180910390fd5b346004856fffffffffffffffffffffffffffffffff1681548110611bb957611bb8614336565b5b906000526020600020906002020160000160108282829054906101000a90046fffffffffffffffffffffffffffffffff16611bf49190614b82565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060006004856fffffffffffffffffffffffffffffffff1681548110611c5257611c51614336565b5b906000526020600020906002020160000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff161415611da057611ca2843361353f565b3373ffffffffffffffffffffffffffffffffffffffff16610bb8856fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004886fffffffffffffffffffffffffffffffff1681548110611d1657611d15614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff1634600060048b6fffffffffffffffffffffffffffffffff1681548110611d5f57611d5e614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051611d93959493929190614bb6565b60405180910390a4611e9a565b3373ffffffffffffffffffffffffffffffffffffffff166107d0856fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004886fffffffffffffffffffffffffffffffff1681548110611e1457611e13614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff1634600060048b6fffffffffffffffffffffffffffffffff1681548110611e5d57611e5c614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051611e91959493929190614bb6565b60405180910390a45b50505050565b60008060149054906101000a900460ff16905090565b611ebe6133f3565b73ffffffffffffffffffffffffffffffffffffffff16611edc61092d565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990614316565b60405180910390fd5b611f3c6000613669565b565b600080600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611905090565b611f706133f3565b73ffffffffffffffffffffffffffffffffffffffff16611f8e61092d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614316565b60405180910390fd5b611fec61372d565b565b6000611ff86133f3565b73ffffffffffffffffffffffffffffffffffffffff1661201661092d565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206390614316565b60405180910390fd5b600160149054906101000a900461ffff1661ffff168261ffff1614156120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614c55565b60405180910390fd5b60b461ffff168261ffff161115612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90614cc1565b60405180910390fd5b600e61ffff168261ffff16101561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614d2d565b60405180910390fd5b600160169054906101000a900461ffff1661ffff168261ffff1610156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614dbf565b60405180910390fd5b81600160146101000a81548161ffff021916908361ffff1602179055508161ffff167f2296261fb5f4e74de3f1b214934540a054c5a6a1e38fd8e8ab2746f11ba400e960405160405180910390a260019050919050565b600061221b6133f3565b73ffffffffffffffffffffffffffffffffffffffff1661223961092d565b73ffffffffffffffffffffffffffffffffffffffff161461228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690614316565b60405180910390fd5b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161415612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614e2b565b60405180910390fd5b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1611156123fb57670429d069189e00006fffffffffffffffffffffffffffffffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff16836123a39190614b82565b6fffffffffffffffffffffffffffffffff1611156123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906145c6565b60405180910390fd5b612494565b670429d069189e00006fffffffffffffffffffffffffffffffff1682600260009054906101000a90046fffffffffffffffffffffffffffffffff166124409190614b82565b6fffffffffffffffffffffffffffffffff161115612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a906145c6565b60405180910390fd5b5b81600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550816fffffffffffffffffffffffffffffffff167fe36963f279d1bf3e7eff5333c8eff89f6e3ab8dc650e01e39a2fcddb59314f0b60405160405180910390a260019050919050565b60006004826fffffffffffffffffffffffffffffffff168154811061253d5761253c614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1663ffffffff164211159050919050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160149054906101000a900461ffff16600260009054906101000a90046fffffffffffffffffffffffffffffffff16600260109054906101000a900467ffffffffffffffff16600160169054906101000a900461ffff16600260189054906101000a900467ffffffffffffffff16612637611ea0565b61263f610b62565b8661ffff1696508467ffffffffffffffff1694508361ffff1693508267ffffffffffffffff169250975097509750975097509750975097509091929394959697565b80600115156004826fffffffffffffffffffffffffffffffff16815481106126ac576126ab614336565b5b906000526020600020906002020160010160009054906101000a900460ff1615151461270d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612704906148fe565b60405180910390fd5b813373ffffffffffffffffffffffffffffffffffffffff166004826fffffffffffffffffffffffffffffffff168154811061274b5761274a614336565b5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90614a8a565b60405180910390fd5b82600115156127e182612515565b151514612823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281a90614af6565b60405180910390fd5b8360011515612830611f3e565b151514612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614e97565b60405180910390fd5b6001151561287f82610ac1565b1515146128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890614f29565b60405180910390fd5b6128c9611ea0565b15612909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290090614632565b60405180910390fd5b612911610b62565b15612951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612948906146c4565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff1634146129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614fbb565b60405180910390fd5b62015180600160149054906101000a900461ffff1661ffff166129d69190614394565b6004866fffffffffffffffffffffffffffffffff16815481106129fc576129fb614336565b5b906000526020600020906002020160010160198282829054906101000a900463ffffffff16612a2b91906146e4565b92506101000a81548163ffffffff021916908363ffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16610fa0866fffffffffffffffffffffffffffffffff167f642cdbc2fb8f5b049f671bcb4c413f01d0a8e60c2b498a7616bb3c2626b6d7a16004896fffffffffffffffffffffffffffffffff1681548110612abd57612abc614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff16343460048c6fffffffffffffffffffffffffffffffff1681548110612b0557612b04614336565b5b906000526020600020906002020160010160199054906101000a900463ffffffff1642604051612b39959493929190614fdb565b60405180910390a45050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015612d0f57838290600052602060002090600202016040518060e00160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160159054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160199054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601d9054906101000a900461ffff1661ffff1661ffff168152505081526020019060010190612b6c565b50505050905090565b60005b82829050811015612d6957612d56838383818110612d3c57612d3b614336565b5b9050602002016020810190612d519190613b59565b6114e1565b8080612d619061502e565b915050612d1b565b505050565b6000612d786133f3565b73ffffffffffffffffffffffffffffffffffffffff16612d9661092d565b73ffffffffffffffffffffffffffffffffffffffff1614612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de390614316565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e50906150c3565b60405180910390fd5b600260189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161115612f0f57666a94d74f43000067ffffffffffffffff16600260189054906101000a900467ffffffffffffffff1683612ebf9190614546565b67ffffffffffffffff161115612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f01906145c6565b60405180910390fd5b612f8f565b666a94d74f43000067ffffffffffffffff1682600260189054906101000a900467ffffffffffffffff16612f439190614546565b67ffffffffffffffff161115612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85906145c6565b60405180910390fd5b5b81600260186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508167ffffffffffffffff167f6c10d4bb7502566ba4cda42d1bb0d8cb9ac790af8f63ce45d18ef87a27a9493b60405160405180910390a260019050919050565b60006130026133f3565b73ffffffffffffffffffffffffffffffffffffffff1661302061092d565b73ffffffffffffffffffffffffffffffffffffffff1614613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90614316565b60405180910390fd5b600160169054906101000a900461ffff1661ffff168261ffff1614156130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c89061512f565b60405180910390fd5b60b461ffff168261ffff16111561311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614cc1565b60405180910390fd5b600e61ffff168261ffff161015613169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316090614d2d565b60405180910390fd5b600160149054906101000a900461ffff1661ffff168261ffff1611156131c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bb906151c1565b60405180910390fd5b81600160166101000a81548161ffff021916908361ffff1602179055508161ffff167f8074608a4fa60d4f8e4067a6b8f167a38f5e5d6f3708b5ac062a350806e26dec60405160405180910390a260019050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260189054906101000a900467ffffffffffffffff1681565b6132636133f3565b73ffffffffffffffffffffffffffffffffffffffff1661328161092d565b73ffffffffffffffffffffffffffffffffffffffff16146132d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ce90614316565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e90615253565b60405180910390fd5b61335081613669565b50565b600260109054906101000a900467ffffffffffffffff1681565b6133756133f3565b73ffffffffffffffffffffffffffffffffffffffff1661339361092d565b73ffffffffffffffffffffffffffffffffffffffff16146133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e090614316565b60405180910390fd5b6133f16137d0565b565b600033905090565b613403610b62565b15613443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343a906146c4565b60405180910390fd5b6001600060156101000a81548160ff0219169083151502179055507fa9c59d2a6292667f4d3a985c73ca4efe42927b9da8f1bb74c22abe5629bdad2a6134876133f3565b6040516134949190613f95565b60405180910390a1565b6134a6611ea0565b6134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc906152bf565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135286133f3565b6040516135359190613f95565b60405180910390a1565b60006004836fffffffffffffffffffffffffffffffff168154811061356757613566614336565b5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30836004866fffffffffffffffffffffffffffffffff16815481106135f5576135f4614336565b5b9060005260206000209060020201600101601d9054906101000a900461ffff166040518463ffffffff1660e01b815260040161363393929190614795565b600060405180830381600087803b15801561364d57600080fd5b505af1158015613661573d6000803e3d6000fd5b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613735611ea0565b15613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614632565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137b96133f3565b6040516137c69190613f95565b60405180910390a1565b6137d8610b62565b613817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380e90615351565b60405180910390fd5b60008060156101000a81548160ff0219169083151502179055507f2be8658a5d86be8f67084b7c8d034e3b6866a9539f720ff3cbfe889a61b3b3be61385a6133f3565b6040516138679190613f95565b60405180910390a1565b600082825260208201905092915050565b7f4f6e6c79206f776e65722063616e2066756e6420636f6e74726163742e000000600082015250565b60006138b8601d83613871565b91506138c382613882565b602082019050919050565b600060208201905081810360008301526138e7816138ab565b9050919050565b7f4e6f206574686572207761732073656e742e0000000000000000000000000000600082015250565b6000613924601283613871565b915061392f826138ee565b602082019050919050565b6000602082019050818103600083015261395381613917565b9050919050565b6000819050919050565b61396d8161395a565b82525050565b60006020820190506139886000830184613964565b92915050565b6000604051905090565b600080fd5b600080fd5b6139ab8161395a565b81146139b657600080fd5b50565b6000813590506139c8816139a2565b92915050565b6000602082840312156139e4576139e3613998565b5b60006139f2848285016139b9565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b613a20816139fb565b82525050565b60008115159050919050565b613a3b81613a26565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a6c82613a41565b9050919050565b613a7c81613a61565b82525050565b600063ffffffff82169050919050565b613a9b81613a82565b82525050565b600061ffff82169050919050565b613ab881613aa1565b82525050565b600060e082019050613ad3600083018a613a17565b613ae06020830189613a17565b613aed6040830188613a32565b613afa6060830187613a73565b613b076080830186613a92565b613b1460a0830185613a92565b613b2160c0830184613aaf565b98975050505050505050565b613b36816139fb565b8114613b4157600080fd5b50565b600081359050613b5381613b2d565b92915050565b600060208284031215613b6f57613b6e613998565b5b6000613b7d84828501613b44565b91505092915050565b6000602082019050613b9b6000830184613a32565b92915050565b6000613bac82613a41565b9050919050565b613bbc81613ba1565b8114613bc757600080fd5b50565b600081359050613bd981613bb3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c3282613be9565b810181811067ffffffffffffffff82111715613c5157613c50613bfa565b5b80604052505050565b6000613c6461398e565b9050613c708282613c29565b919050565b600067ffffffffffffffff821115613c9057613c8f613bfa565b5b613c9982613be9565b9050602081019050919050565b82818337600083830152505050565b6000613cc8613cc384613c75565b613c5a565b905082815260208101848484011115613ce457613ce3613be4565b5b613cef848285613ca6565b509392505050565b600082601f830112613d0c57613d0b613bdf565b5b8135613d1c848260208601613cb5565b91505092915050565b60008060008060808587031215613d3f57613d3e613998565b5b6000613d4d87828801613bca565b9450506020613d5e87828801613bca565b9350506040613d6f878288016139b9565b925050606085013567ffffffffffffffff811115613d9057613d8f61399d565b5b613d9c87828801613cf7565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ddd81613da8565b82525050565b6000602082019050613df86000830184613dd4565b92915050565b6000602082019050613e136000830184613aaf565b92915050565b600067ffffffffffffffff82169050919050565b613e3681613e19565b8114613e4157600080fd5b50565b600081359050613e5381613e2d565b92915050565b600060208284031215613e6f57613e6e613998565b5b6000613e7d84828501613e44565b91505092915050565b613e8f81613aa1565b8114613e9a57600080fd5b50565b600081359050613eac81613e86565b92915050565b600060208284031215613ec857613ec7613998565b5b6000613ed684828501613e9d565b91505092915050565b600060208284031215613ef557613ef4613998565b5b6000613f0384828501613bca565b91505092915050565b6000819050919050565b6000613f31613f2c613f2784613a41565b613f0c565b613a41565b9050919050565b6000613f4382613f16565b9050919050565b6000613f5582613f38565b9050919050565b613f6581613f4a565b82525050565b6000602082019050613f806000830184613f5c565b92915050565b613f8f81613ba1565b82525050565b6000602082019050613faa6000830184613f86565b92915050565b6000602082019050613fc56000830184613a17565b92915050565b613fd481613e19565b82525050565b600061010082019050613ff0600083018b613f86565b613ffd602083018a613a92565b61400a6040830189613a17565b6140176060830188613a17565b6140246080830187613fcb565b61403160a0830186613a17565b61403e60c0830185613a32565b61404b60e0830184613a32565b9998505050505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61408d816139fb565b82525050565b61409c81613a26565b82525050565b6140ab81613a61565b82525050565b6140ba81613a82565b82525050565b6140c981613aa1565b82525050565b60e0820160008201516140e56000850182614084565b5060208201516140f86020850182614084565b50604082015161410b6040850182614093565b50606082015161411e60608501826140a2565b50608082015161413160808501826140b1565b5060a082015161414460a08501826140b1565b5060c082015161415760c08501826140c0565b50505050565b600061416983836140cf565b60e08301905092915050565b6000602082019050919050565b600061418d82614058565b6141978185614063565b93506141a283614074565b8060005b838110156141d35781516141ba888261415d565b97506141c583614175565b9250506001810190506141a6565b5085935050505092915050565b600060208201905081810360008301526141fa8184614182565b905092915050565b600080fd5b600080fd5b60008083601f84011261422257614221613bdf565b5b8235905067ffffffffffffffff81111561423f5761423e614202565b5b60208301915083602082028301111561425b5761425a614207565b5b9250929050565b6000806020838503121561427957614278613998565b5b600083013567ffffffffffffffff8111156142975761429661399d565b5b6142a38582860161420c565b92509250509250929050565b60006020820190506142c46000830184613fcb565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614300602083613871565b915061430b826142ca565b602082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439f82613a82565b91506143aa83613a82565b92508163ffffffff04831182151516156143c7576143c6614365565b5b828202905092915050565b60006143dd8261395a565b91506143e88361395a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561441d5761441c614365565b5b828201905092915050565b600081905092915050565b50565b6000614443600083614428565b915061444e82614433565b600082019050919050565b600061446482614436565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006144a4601083613871565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f4e6f206368616e676520746f206c656e64696e67206665650000000000000000600082015250565b6000614510601883613871565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b9050919050565b600061455182613e19565b915061455c83613e19565b92508282101561456f5761456e614365565b5b828203905092915050565b7f4368616e67652065786365656473206d617820696e6372656d656e7400000000600082015250565b60006145b0601c83613871565b91506145bb8261457a565b602082019050919050565b600060208201905081810360008301526145df816145a3565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061461c601083613871565b9150614627826145e6565b602082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b7f53756e7365743a2053756e2068617320736574206f6e207468697320636f6e7460008201527f7261637400000000000000000000000000000000000000000000000000000000602082015250565b60006146ae602483613871565b91506146b982614652565b604082019050919050565b600060208201905081810360008301526146dd816146a1565b9050919050565b60006146ef82613a82565b91506146fa83613a82565b92508263ffffffff0382111561471357614712614365565b5b828201905092915050565b6000614729826139fb565b9150614734836139fb565b9250826fffffffffffffffffffffffffffffffff0382111561475957614758614365565b5b828201905092915050565b600061477f61477a61477584613aa1565b613f0c565b61395a565b9050919050565b61478f81614764565b82525050565b60006060820190506147aa6000830186613f86565b6147b76020830185613f86565b6147c46040830184614786565b949350505050565b60006147e76147e26147dd846139fb565b613f0c565b61395a565b9050919050565b6147f7816147cc565b82525050565b600061481861481361480e84613e19565b613f0c565b61395a565b9050919050565b614828816147fd565b82525050565b600061484961484461483f84613a82565b613f0c565b61395a565b9050919050565b6148598161482e565b82525050565b600060a0820190506148746000830188613aaf565b61488160208301876147ee565b61488e604083018661481f565b61489b6060830185614850565b6148a86080830184613964565b9695505050505050565b7f4974656d206973206e6f742063757272656e746c7920756e646572206c6f616e600082015250565b60006148e8602083613871565b91506148f3826148b2565b602082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4c6f616e207465726d20686173206e6f742079657420656c6170736564000000600082015250565b6000614954601d83613871565b915061495f8261491e565b602082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b6000819050919050565b60006149af6149aa6149a58461498a565b613f0c565b61395a565b9050919050565b6149bf81614994565b82525050565b600060a0820190506149da6000830188613aaf565b6149e760208301876147ee565b6149f460408301866149b6565b614a016060830185614850565b614a0e6080830184613964565b9695505050505050565b7f5061796d656e74732063616e206f6e6c79206265206d6164652062792074686560008201527f20626f72726f7765720000000000000000000000000000000000000000000000602082015250565b6000614a74602983613871565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f4c6f616e207465726d2068617320657870697265640000000000000000000000600082015250565b6000614ae0601583613871565b9150614aeb82614aaa565b602082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f5061796d656e7420657863656564732063757272656e742062616c616e636500600082015250565b6000614b4c601f83613871565b9150614b5782614b16565b602082019050919050565b60006020820190508181036000830152614b7b81614b3f565b9050919050565b6000614b8d826139fb565b9150614b98836139fb565b925082821015614bab57614baa614365565b5b828203905092915050565b600060a082019050614bcb6000830188613aaf565b614bd86020830187613964565b614be560408301866149b6565b614bf26060830185614850565b614bff6080830184613964565b9695505050505050565b7f4e6f206368616e676520746f207465726d000000000000000000000000000000600082015250565b6000614c3f601183613871565b9150614c4a82614c09565b602082019050919050565b60006020820190508181036000830152614c6e81614c32565b9050919050565b7f4368616e6765206973206d6f7265207468616e206d6178207465726d00000000600082015250565b6000614cab601c83613871565b9150614cb682614c75565b602082019050919050565b60006020820190508181036000830152614cda81614c9e565b9050919050565b7f4368616e6765206973206c657373207468616e206d696e207465726d00000000600082015250565b6000614d17601c83613871565b9150614d2282614ce1565b602082019050919050565b60006020820190508181036000830152614d4681614d0a565b9050919050565b7f5465726d206d7573742062652067726561746572207468616e206f722065717560008201527f616c20746f20657874656e73696f6e20686f72697a6f6e000000000000000000602082015250565b6000614da9603783613871565b9150614db482614d4d565b604082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b7f4e6f206368616e676520746f206c6f616e20616d6f756e740000000000000000600082015250565b6000614e15601883613871565b9150614e2082614ddf565b602082019050919050565b60006020820190508181036000830152614e4481614e08565b9050919050565b7f457874656e73696f6e732063757272656e746c79206e6f7420616c6c6f776564600082015250565b6000614e81602083613871565b9150614e8c82614e4b565b602082019050919050565b60006020820190508181036000830152614eb081614e74565b9050919050565b7f4c6f616e206973206e6f742077697468696e20657874656e73696f6e20686f7260008201527f697a6f6e00000000000000000000000000000000000000000000000000000000602082015250565b6000614f13602483613871565b9150614f1e82614eb7565b604082019050919050565b60006020820190508181036000830152614f4281614f06565b9050919050565b7f5061796d656e74206d75737420657175616c2074686520657874656e73696f6e60008201527f2066656500000000000000000000000000000000000000000000000000000000602082015250565b6000614fa5602483613871565b9150614fb082614f49565b604082019050919050565b60006020820190508181036000830152614fd481614f98565b9050919050565b600060a082019050614ff06000830188613aaf565b614ffd6020830187613964565b61500a6040830186613964565b6150176060830185614850565b6150246080830184613964565b9695505050505050565b60006150398261395a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561506c5761506b614365565b5b600182019050919050565b7f4e6f206368616e676520746f20657874656e73696f6e20666565000000000000600082015250565b60006150ad601a83613871565b91506150b882615077565b602082019050919050565b600060208201905081810360008301526150dc816150a0565b9050919050565b7f4e6f206368616e676520746f20686f72697a6f6e000000000000000000000000600082015250565b6000615119601483613871565b9150615124826150e3565b602082019050919050565b600060208201905081810360008301526151488161510c565b9050919050565b7f457874656e73696f6e20686f72697a6f6e206d757374206265206c657373207460008201527f68616e206f7220657175616c20746f207465726d000000000000000000000000602082015250565b60006151ab603483613871565b91506151b68261514f565b604082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061523d602683613871565b9150615248826151e1565b604082019050919050565b6000602082019050818103600083015261526c81615230565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006152a9601483613871565b91506152b482615273565b602082019050919050565b600060208201905081810360008301526152d88161529c565b9050919050565b7f53756e7365743a2053756e20686173206e6f7420736574206f6e20746869732060008201527f636f6e7472616374000000000000000000000000000000000000000000000000602082015250565b600061533b602883613871565b9150615346826152df565b604082019050919050565b6000602082019050818103600083015261536a8161532e565b905091905056fea2646970667358221220d6ef25123c1dbe6d29c0cf1010be35cd935cf28d06adeedd48905e359a4946ee64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d20a51f088492a0f1c57f047a9e30c9ab5c07ea000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000001f3621d2d57ee42d3e0cc0aa42156d0c3f7744a5000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000001e
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x1D20A51F088492A0f1C57f047A9e30c9aB5C07Ea
Arg [1] : _loanAmount (uint128): 400000000000000000
Arg [2] : _termInDays (uint16): 90
Arg [3] : _repoAddress (address): 0x1F3621d2d57EE42d3E0cC0aA42156d0C3f7744A5
Arg [4] : _lendingFee (uint64): 30000000000000000
Arg [5] : _extensionFee (uint64): 30000000000000000
Arg [6] : _extensionHorizon (uint16): 30
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d20a51f088492a0f1c57f047a9e30c9ab5c07ea
Arg [1] : 000000000000000000000000000000000000000000000000058d15e176280000
Arg [2] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [3] : 0000000000000000000000001f3621d2d57ee42d3e0cc0aa42156d0c3f7744a5
Arg [4] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [5] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.