More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,307 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity721... | 21324953 | 3 days ago | IN | 0.46573868 ETH | 0.0383794 | ||||
Provide Inventor... | 21256003 | 12 days ago | IN | 0 ETH | 0.00324479 | ||||
Provide Inventor... | 21255997 | 12 days ago | IN | 0 ETH | 0.00275919 | ||||
Provide Inventor... | 21233334 | 15 days ago | IN | 0 ETH | 0.00406375 | ||||
Provide Inventor... | 21197655 | 20 days ago | IN | 0 ETH | 0.00655674 | ||||
Provide Inventor... | 21196521 | 21 days ago | IN | 0 ETH | 0.00698532 | ||||
Provide Inventor... | 21192534 | 21 days ago | IN | 0 ETH | 0.00471535 | ||||
Provide Inventor... | 21152523 | 27 days ago | IN | 0 ETH | 0.00403795 | ||||
Provide Inventor... | 21152519 | 27 days ago | IN | 0 ETH | 0.00283832 | ||||
Provide Inventor... | 21152515 | 27 days ago | IN | 0 ETH | 0.00408156 | ||||
Add Liquidity721... | 21150641 | 27 days ago | IN | 0.18838939 ETH | 0.0126907 | ||||
Add Liquidity721... | 21150433 | 27 days ago | IN | 0.11303363 ETH | 0.00844389 | ||||
Provide Inventor... | 21149330 | 27 days ago | IN | 0 ETH | 0.01714016 | ||||
Add Liquidity721... | 21149264 | 27 days ago | IN | 0.09872536 ETH | 0.04085744 | ||||
Provide Inventor... | 21149097 | 27 days ago | IN | 0 ETH | 0.04109214 | ||||
Provide Inventor... | 21147491 | 27 days ago | IN | 0 ETH | 0.00227247 | ||||
Provide Inventor... | 21147468 | 27 days ago | IN | 0 ETH | 0.00246307 | ||||
Provide Inventor... | 21147461 | 27 days ago | IN | 0 ETH | 0.00401313 | ||||
Provide Inventor... | 21146693 | 28 days ago | IN | 0 ETH | 0.00335199 | ||||
Provide Inventor... | 21134186 | 29 days ago | IN | 0 ETH | 0.00394358 | ||||
Provide Inventor... | 21103078 | 34 days ago | IN | 0 ETH | 0.00112979 | ||||
Provide Inventor... | 21087494 | 36 days ago | IN | 0 ETH | 0.02147615 | ||||
Provide Inventor... | 21087488 | 36 days ago | IN | 0 ETH | 0.0075859 | ||||
Add Liquidity721... | 21014953 | 46 days ago | IN | 0.18067524 ETH | 0.02607071 | ||||
Provide Inventor... | 21003261 | 48 days ago | IN | 0 ETH | 0.00239744 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21324953 | 3 days ago | 0.46573868 ETH | ||||
21150641 | 27 days ago | 0.18838939 ETH | ||||
21150433 | 27 days ago | 0.11303363 ETH | ||||
21149264 | 27 days ago | 0.09872536 ETH | ||||
21014953 | 46 days ago | 0.18067524 ETH | ||||
20996962 | 48 days ago | 0.04435415 ETH | ||||
20996866 | 48 days ago | 0.27891321 ETH | ||||
20917837 | 59 days ago | 0.13126969 ETH | ||||
20802264 | 76 days ago | 0.01003751 ETH | ||||
20672914 | 94 days ago | 0.26877596 ETH | ||||
20458229 | 124 days ago | 1.01182461 ETH | ||||
20444300 | 126 days ago | 1.82552505 ETH | ||||
20147144 | 167 days ago | 0.17561582 ETH | ||||
20112582 | 172 days ago | 0.07026259 ETH | ||||
19952255 | 194 days ago | 0.00161531 ETH | ||||
19916288 | 199 days ago | 0.04437309 ETH | ||||
19900128 | 202 days ago | 0.10914355 ETH | ||||
19900049 | 202 days ago | 0.21508997 ETH | ||||
19864617 | 207 days ago | 0.44697117 ETH | ||||
19864034 | 207 days ago | 0.05524283 ETH | ||||
19836994 | 210 days ago | 1.93556398 ETH | ||||
19818028 | 213 days ago | 0.34407926 ETH | ||||
19677819 | 233 days ago | 0.00000012 ETH | ||||
19665678 | 234 days ago | 0.378885 ETH | ||||
19656733 | 236 days ago | 1.41097129 ETH |
Loading...
Loading
Contract Name:
NFTXStakingZap
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-02 */ // Sources flattened with hardhat v2.8.2 https://hardhat.org // File contracts/solidity/interface/INFTXEligibility.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXEligibility { // Read functions. function name() external pure returns (string memory); function finalized() external view returns (bool); function targetAsset() external pure returns (address); function checkAllEligible(uint256[] calldata tokenIds) external view returns (bool); function checkEligible(uint256[] calldata tokenIds) external view returns (bool[] memory); function checkAllIneligible(uint256[] calldata tokenIds) external view returns (bool); function checkIsEligible(uint256 tokenId) external view returns (bool); // Write functions. function __NFTXEligibility_init_bytes(bytes calldata configData) external; function beforeMintHook(uint256[] calldata tokenIds) external; function afterMintHook(uint256[] calldata tokenIds) external; function beforeRedeemHook(uint256[] calldata tokenIds) external; function afterRedeemHook(uint256[] calldata tokenIds) external; } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function allVaults() external view returns (address[] memory); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); function factoryMintFee() external view returns (uint64); function factoryRandomRedeemFee() external view returns (uint64); function factoryTargetRedeemFee() external view returns (uint64); function factoryRandomSwapFee() external view returns (uint64); function factoryTargetSwapFee() external view returns (uint64); function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress); event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); event DisableVaultFees(uint256 vaultId); event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); // Write functions. function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; function setFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function setVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function disableVaultFees(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault is IERC20Upgradeable { function manager() external view returns (address); function assetAddress() external view returns (address); function vaultFactory() external view returns (INFTXVaultFactory); function eligibilityStorage() external view returns (INFTXEligibility); function is1155() external view returns (bool); function allowAllItems() external view returns (bool); function enableMint() external view returns (bool); function enableRandomRedeem() external view returns (bool); function enableTargetRedeem() external view returns (bool); function enableRandomSwap() external view returns (bool); function enableTargetSwap() external view returns (bool); function vaultId() external view returns (uint256); function nftIdAt(uint256 holdingsIndex) external view returns (uint256); function allHoldings() external view returns (uint256[] memory); function totalHoldings() external view returns (uint256); function mintFee() external view returns (uint256); function randomRedeemFee() external view returns (uint256); function targetRedeemFee() external view returns (uint256); function randomSwapFee() external view returns (uint256); function targetSwapFee() external view returns (uint256); function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256); event VaultInit( uint256 indexed vaultId, address assetAddress, bool is1155, bool allowAllItems ); event ManagerSet(address manager); event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr); // event CustomEligibilityDeployed(address eligibilityAddr); event EnableMintUpdated(bool enabled); event EnableRandomRedeemUpdated(bool enabled); event EnableTargetRedeemUpdated(bool enabled); event EnableRandomSwapUpdated(bool enabled); event EnableTargetSwapUpdated(bool enabled); event Minted(uint256[] nftIds, uint256[] amounts, address to); event Redeemed(uint256[] nftIds, uint256[] specificIds, address to); event Swapped( uint256[] nftIds, uint256[] amounts, uint256[] specificIds, uint256[] redeemedIds, address to ); function __NFTXVault_init( string calldata _name, string calldata _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) external; function finalizeVault() external; function setVaultMetadata( string memory name_, string memory symbol_ ) external; function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) external; function disableVaultFees() external; // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external returns (address); // The manager has control over options like fees and features function setManager(address _manager) external; function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function mintTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ address to ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] calldata); function redeemTo( uint256 amount, uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external returns (uint256[] calldata); function swapTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function allValidNFTs(uint256[] calldata tokenIds) external view returns (bool); } // File contracts/solidity/interface/INFTXSimpleFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXSimpleFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external view returns (address); function lpStaking() external view returns (address); function inventoryStaking() external view returns (address); function treasury() external view returns (address); function allocTotal() external view returns (uint256); // Write functions. function __SimpleFeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeReceiverAlloc(uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setLPStakingAddress(address _lpStaking) external; function setInventoryStakingAddress(address _inventoryStaking) external; function setNFTXVaultFactory(address _factory) external; } // File contracts/solidity/interface/INFTXLPStaking.sol pragma solidity ^0.8.0; interface INFTXLPStaking { function nftxVaultFactory() external view returns (address); function rewardDistTokenImpl() external view returns (address); function stakingTokenProvider() external view returns (address); function vaultToken(address _stakingToken) external view returns (address); function stakingToken(address _vaultToken) external view returns (address); function rewardDistributionToken(uint256 vaultId) external view returns (address); function newRewardDistributionToken(uint256 vaultId) external view returns (address); function oldRewardDistributionToken(uint256 vaultId) external view returns (address); function unusedRewardDistributionToken(uint256 vaultId) external view returns (address); function rewardDistributionTokenAddr(address stakedToken, address rewardToken) external view returns (address); // Write functions. function __NFTXLPStaking__init(address _stakingTokenProvider) external; function setNFTXVaultFactory(address newFactory) external; function setStakingTokenProvider(address newProvider) external; function addPoolForVault(uint256 vaultId) external; function updatePoolForVault(uint256 vaultId) external; function updatePoolForVaults(uint256[] calldata vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function deposit(uint256 vaultId, uint256 amount) external; function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external; function exit(uint256 vaultId, uint256 amount) external; function rescue(uint256 vaultId) external; function withdraw(uint256 vaultId, uint256 amount) external; function claimRewards(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXInventoryStaking.sol pragma solidity ^0.8.0; interface INFTXInventoryStaking { function nftxVaultFactory() external view returns (INFTXVaultFactory); function vaultXToken(uint256 vaultId) external view returns (address); function xTokenAddr(address baseToken) external view returns (address); function xTokenShareValue(uint256 vaultId) external view returns (uint256); function __NFTXInventoryStaking_init(address nftxFactory) external; function deployXTokenForVault(uint256 vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function timelockMintFor(uint256 vaultId, uint256 amount, address to, uint256 timelockLength) external returns (uint256); function deposit(uint256 vaultId, uint256 _amount) external; function withdraw(uint256 vaultId, uint256 _share) external; } // File contracts/solidity/interface/IUniswapV2Router01.sol pragma solidity ^0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File contracts/solidity/testing/IERC165.sol 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); } // File contracts/solidity/testing/IERC721.sol pragma solidity ^0.8.0; /** * @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; } // File contracts/solidity/interface/IERC165Upgradeable.sol 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 IERC165Upgradeable { /** * @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); } // File contracts/solidity/token/IERC1155Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File contracts/solidity/token/IERC721ReceiverUpgradeable.sol 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 IERC721ReceiverUpgradeable { /** * @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); } // File contracts/solidity/token/ERC721HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721HolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File contracts/solidity/util/ERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is IERC165Upgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } } // File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/solidity/token/ERC1155HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155HolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.sol 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/util/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/solidity/util/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/solidity/util/SafeERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using Address for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/solidity/interface/ITimelockExcludeList.sol pragma solidity ^0.8.0; interface ITimelockExcludeList { function isExcluded(address addr, uint256 vaultId) external view returns (bool); } // File contracts/solidity/NFTXStakingZap.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_. interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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 { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @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() == msg.sender, "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); } } contract NFTXStakingZap is Ownable, ReentrancyGuard, ERC721HolderUpgradeable, ERC1155HolderUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; IWETH public immutable WETH; INFTXLPStaking public lpStaking; INFTXInventoryStaking public inventoryStaking; INFTXVaultFactory public immutable nftxFactory; IUniswapV2Router01 public immutable sushiRouter; ITimelockExcludeList public timelockExcludeList; uint256 public lpLockTime = 48 hours; uint256 public inventoryLockTime = 7 days; uint256 constant BASE = 1e18; event UserStaked(uint256 vaultId, uint256 count, uint256 lpBalance, uint256 timelockUntil, address sender); constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() { nftxFactory = INFTXVaultFactory(_nftxFactory); sushiRouter = IUniswapV2Router01(_sushiRouter); WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH()); IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).safeApprove(_sushiRouter, type(uint256).max); } function assignStakingContracts() public { require(address(lpStaking) == address(0) || address(inventoryStaking) == address(0), "not zero"); lpStaking = INFTXLPStaking(INFTXSimpleFeeDistributor(INFTXVaultFactory(nftxFactory).feeDistributor()).lpStaking()); inventoryStaking = INFTXInventoryStaking(INFTXSimpleFeeDistributor(INFTXVaultFactory(nftxFactory).feeDistributor()).inventoryStaking()); } function setTimelockExcludeList(address addr) external onlyOwner { timelockExcludeList = ITimelockExcludeList(addr); } function setLPLockTime(uint256 newLPLockTime) external onlyOwner { require(newLPLockTime <= 7 days, "Lock too long"); lpLockTime = newLPLockTime; } function setInventoryLockTime(uint256 newInventoryLockTime) external onlyOwner { require(newInventoryLockTime <= 14 days, "Lock too long"); inventoryLockTime = newInventoryLockTime; } function isAddressTimelockExcluded(address addr, uint256 vaultId) public view returns (bool) { if (address(timelockExcludeList) == address(0)) { return false; } else { return timelockExcludeList.isExcluded(addr, vaultId); } } function provideInventory721(uint256 vaultId, uint256[] calldata tokenIds) external { uint256 count = tokenIds.length; INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 timelockTime = isAddressTimelockExcluded(msg.sender, vaultId) ? 0 : inventoryLockTime; inventoryStaking.timelockMintFor(vaultId, count*BASE, msg.sender, timelockTime); address xToken = inventoryStaking.vaultXToken(vaultId); uint256 oldBal = IERC20Upgradeable(vault).balanceOf(xToken); uint256[] memory amounts = new uint256[](0); address assetAddress = vault.assetAddress(); uint256 length = tokenIds.length; for (uint256 i; i < length; ++i) { transferFromERC721(assetAddress, tokenIds[i], address(vault)); approveERC721(assetAddress, address(vault), tokenIds[i]); } vault.mintTo(tokenIds, amounts, address(xToken)); uint256 newBal = IERC20Upgradeable(vault).balanceOf(xToken); require(newBal == oldBal + count*BASE, "Incorrect vtokens minted"); uint256 lockEndTime = block.timestamp + timelockTime; emit UserStaked(vaultId, tokenIds.length, 0, lockEndTime, msg.sender); } function provideInventory1155(uint256 vaultId, uint256[] calldata tokenIds, uint256[] calldata amounts) external { uint256 length = tokenIds.length; require(length == amounts.length, "Not equal length"); uint256 count; for (uint256 i; i < length; ++i) { count += amounts[i]; } INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); uint256 timelockTime = isAddressTimelockExcluded(msg.sender, vaultId) ? 0 : inventoryLockTime; inventoryStaking.timelockMintFor(vaultId, count*BASE, msg.sender, timelockTime); address xToken = inventoryStaking.vaultXToken(vaultId); uint256 oldBal = IERC20Upgradeable(vault).balanceOf(address(xToken)); IERC1155Upgradeable nft = IERC1155Upgradeable(vault.assetAddress()); nft.safeBatchTransferFrom(msg.sender, address(this), tokenIds, amounts, ""); nft.setApprovalForAll(address(vault), true); vault.mintTo(tokenIds, amounts, address(xToken)); uint256 newBal = IERC20Upgradeable(vault).balanceOf(address(xToken)); require(newBal == oldBal + count*BASE, "Incorrect vtokens minted"); uint256 lockEndTime = block.timestamp + timelockTime; emit UserStaked(vaultId, tokenIds.length, 0, lockEndTime, msg.sender); } function addLiquidity721ETH( uint256 vaultId, uint256[] calldata ids, uint256 minWethIn ) external payable returns (uint256) { return addLiquidity721ETHTo(vaultId, ids, minWethIn, msg.sender); } function addLiquidity721ETHTo( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, address to ) public payable nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); WETH.deposit{value: msg.value}(); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, msg.value, to); // Return extras. uint256 remaining = msg.value-amountEth; if (remaining != 0) { WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } return liquidity; } function addLiquidity1155ETH( uint256 vaultId, uint256[] calldata ids, uint256[] calldata amounts, uint256 minEthIn ) external payable returns (uint256) { return addLiquidity1155ETHTo(vaultId, ids, amounts, minEthIn, msg.sender); } function addLiquidity1155ETHTo( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minEthIn, address to ) public payable nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); WETH.deposit{value: msg.value}(); // Finish this. (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minEthIn, msg.value, to); // Return extras. uint256 remaining = msg.value-amountEth; if (remaining != 0) { WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } return liquidity; } function addLiquidity721( uint256 vaultId, uint256[] calldata ids, uint256 minWethIn, uint256 wethIn ) external returns (uint256) { return addLiquidity721To(vaultId, ids, minWethIn, wethIn, msg.sender); } function addLiquidity721To( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn, address to ) public nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, wethIn, to); // Return extras. uint256 remaining = wethIn-amountEth; if (remaining != 0) { WETH.transfer(to, remaining); } return liquidity; } function addLiquidity1155( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn ) public returns (uint256) { return addLiquidity1155To(vaultId, ids, amounts, minWethIn, wethIn, msg.sender); } function addLiquidity1155To( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn, address to ) public nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minWethIn, wethIn, to); // Return extras. uint256 remaining = wethIn-amountEth; if (remaining != 0) { WETH.transfer(to, remaining); } return liquidity; } function _addLiquidity721WETH( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { require(nftxFactory.excludedFromFees(address(this))); address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); uint256 length = ids.length; for (uint256 i; i < length; i++) { transferFromERC721(assetAddress, ids[i], vault); approveERC721(assetAddress, vault, ids[i]); } uint256[] memory emptyIds; INFTXVault(vault).mint(ids, emptyIds); uint256 balance = length * BASE; // We should not be experiencing fees. return _addLiquidityAndLock(vaultId, vault, balance, minWethIn, wethIn, to); } function _addLiquidity1155WETH( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { require(nftxFactory.excludedFromFees(address(this))); address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), ids, amounts, ""); IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true); uint256 count = INFTXVault(vault).mint(ids, amounts); uint256 balance = (count * BASE); // We should not be experiencing fees. return _addLiquidityAndLock(vaultId, vault, balance, minWethIn, wethIn, to); } function _addLiquidityAndLock( uint256 vaultId, address vault, uint256 minTokenIn, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { // Provide liquidity. IERC20Upgradeable(vault).safeApprove(address(sushiRouter), minTokenIn); (uint256 amountToken, uint256 amountEth, uint256 liquidity) = sushiRouter.addLiquidity( address(vault), address(WETH), minTokenIn, wethIn, minTokenIn, minWethIn, address(this), block.timestamp ); // Stake in LP rewards contract IERC20Upgradeable(pairFor(vault, address(WETH))).safeApprove(address(lpStaking), liquidity); uint256 timelockTime = isAddressTimelockExcluded(msg.sender, vaultId) ? 0 : lpLockTime; lpStaking.timelockDepositFor(vaultId, to, liquidity, timelockTime); uint256 remaining = minTokenIn-amountToken; if (remaining != 0) { IERC20Upgradeable(vault).safeTransfer(to, remaining); } uint256 lockEndTime = block.timestamp + timelockTime; emit UserStaked(vaultId, minTokenIn, liquidity, lockEndTime, to); return (amountToken, amountEth, liquidity); } function transferFromERC721(address assetAddr, uint256 tokenId, address to) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. // Fix here for frontrun attack. Added in v1.0.2. bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId); (bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress); (address nftOwner) = abi.decode(result, (address)); require(checkSuccess && nftOwner == msg.sender, "Not the NFT owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. // We push to the vault to avoid an unneeded transfer. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, to, tokenId); } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function approveERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. // data = abi.encodeWithSignature("approve(address,uint256)", to, tokenId); // No longer needed to approve with pushing. return; } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to); } else { // No longer needed to approve with pushing. return; } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', sushiRouter.factory(), keccak256(abi.encodePacked(token0, token1)), hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash ))))); } // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS'); } receive() external payable { require(msg.sender == address(WETH), "Only WETH"); } function rescue(address token) external onlyOwner { if (token == address(0)) { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success, "Address: unable to send value, recipient may have reverted"); } else { IERC20Upgradeable(token).safeTransfer(msg.sender, IERC20Upgradeable(token).balanceOf(address(this))); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nftxFactory","type":"address"},{"internalType":"address","name":"_sushiRouter","type":"address"}],"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":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timelockUntil","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"UserStaked","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"}],"name":"addLiquidity1155","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minEthIn","type":"uint256"}],"name":"addLiquidity1155ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minEthIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity1155ETHTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity1155To","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"}],"name":"addLiquidity721","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"}],"name":"addLiquidity721ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity721ETHTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity721To","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assignStakingContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inventoryLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inventoryStaking","outputs":[{"internalType":"contract INFTXInventoryStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"isAddressTimelockExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpStaking","outputs":[{"internalType":"contract INFTXLPStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftxFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"provideInventory1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"provideInventory721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newInventoryLockTime","type":"uint256"}],"name":"setInventoryLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLPLockTime","type":"uint256"}],"name":"setLPLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTimelockExcludeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"contract IUniswapV2Router01","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockExcludeList","outputs":[{"internalType":"contract ITimelockExcludeList","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526202a30060055562093a806006553480156200001f57600080fd5b5060405162004c8b38038062004c8b8339810160408190526200004291620005fd565b6200004d33620001a6565b600180556001600160601b0319606083811b821660a05282901b1660c052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e79190620005e0565b6001600160a01b03166080816001600160a01b031660601b815250506200019e81600019836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200014557600080fd5b505afa1580156200015a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001809190620005e0565b6001600160a01b0316620001f660201b620024ab179092919060201c565b5050620006f5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580620002845750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200024757600080fd5b505afa1580156200025c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000282919062000656565b155b620002fc5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003549185916200035916565b505050565b6000620003b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200043760201b62002640179092919060201c565b805190915015620003545780806020019051810190620003d6919062000634565b620003545760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002f3565b606062000448848460008562000452565b90505b9392505050565b606082471015620004b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002f3565b843b620005055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002f3565b600080866001600160a01b031685876040516200052391906200066f565b60006040518083038185875af1925050503d806000811462000562576040519150601f19603f3d011682016040523d82523d6000602084013e62000567565b606091505b5090925090506200057a82828662000585565b979650505050505050565b60608315620005965750816200044b565b825115620005a75782518084602001fd5b8160405162461bcd60e51b8152600401620002f391906200068d565b80516001600160a01b0381168114620005db57600080fd5b919050565b600060208284031215620005f2578081fd5b6200044b82620005c3565b6000806040838503121562000610578081fd5b6200061b83620005c3565b91506200062b60208401620005c3565b90509250929050565b60006020828403121562000646578081fd5b815180151581146200044b578182fd5b60006020828403121562000668578081fd5b5051919050565b6000825162000683818460208701620006c2565b9190910192915050565b6020815260008251806020840152620006ae816040850160208701620006c2565b601f01601f19169190910160400192915050565b60005b83811015620006df578181015183820152602001620006c5565b83811115620006ef576000848401525b50505050565b60805160601c60a05160601c60c05160601c6144c3620007c860003960008181610429015281816133a60152818161345a01526136e30152600081816103f5015281816110780152818161119f0152818161141f01528181611e96015281816126b90152818161275501528181612a110152612aad0152600081816101ec015281816105ce015281816107dd0152818161085701528181610a2101528181610a9a01528181611a2301528181611ad701528181611c8a01528181611d3d0152818161340301526134f801526144c36000f3fe6080604052600436106101dc5760003560e01c806384d5a23211610102578063ad402dfc11610095578063c46c4e8a11610064578063c46c4e8a14610648578063cd9d37b71461065e578063f23a6e611461067e578063f2fde38b146106c357600080fd5b8063ad402dfc146105a9578063ad5c4648146105bc578063bc197c81146105f0578063bdd8172b1461063557600080fd5b806392054f8b116100d157806392054f8b146105335780639bf1401c146105535780639d2cbed014610573578063a7b128461461059357600080fd5b806384d5a232146104c0578063881b2f2d146104e05780638da5cb5b146105005780639199fc9c1461051e57600080fd5b80634a5ff0611161017a578063715018a611610149578063715018a61461044b578063739697751461046057806374a1b0b014610480578063839006f2146104a057600080fd5b80634a5ff061146103b057806353b573bf146103d05780635ee50f88146103e35780636d13582c1461041757600080fd5b806311ad9d38116101b657806311ad9d38146102e8578063150b7a02146103205780631809d2c21461037d5780631a6907cd1461039d57600080fd5b806301ffc9a714610265578063021001551461029a57806310cde786146102c857600080fd5b3661026057336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461025e5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561027157600080fd5b50610285610280366004613c8b565b6106e3565b60405190151581526020015b60405180910390f35b3480156102a657600080fd5b506102ba6102b5366004613fd5565b61074c565b604051908152602001610291565b3480156102d457600080fd5b506102ba6102e3366004613f59565b6108e6565b3480156102f457600080fd5b50600454610308906001600160a01b031681565b6040516001600160a01b039091168152602001610291565b34801561032c57600080fd5b5061036461033b366004613b6f565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b03199091168152602001610291565b34801561038957600080fd5b506102ba610398366004613e74565b610900565b6102ba6103ab366004613e23565b610944565b3480156103bc57600080fd5b506102ba6103cb3660046140c7565b610990565b6102ba6103de366004613da4565b610b28565b3480156103ef57600080fd5b506103087f000000000000000000000000000000000000000000000000000000000000000081565b34801561042357600080fd5b506103087f000000000000000000000000000000000000000000000000000000000000000081565b34801561045757600080fd5b5061025e610ba7565b34801561046c57600080fd5b5061025e61047b366004613cb3565b610c1c565b34801561048c57600080fd5b50600354610308906001600160a01b031681565b3480156104ac57600080fd5b5061025e6104bb366004613a8d565b610ccd565b3480156104cc57600080fd5b5061025e6104db366004613cb3565b610e97565b3480156104ec57600080fd5b506102856104fb366004613c40565b610f48565b34801561050c57600080fd5b506000546001600160a01b0316610308565b34801561052a57600080fd5b5061025e611009565b34801561053f57600080fd5b5061025e61054e366004613a8d565b6112cd565b34801561055f57600080fd5b50600254610308906001600160a01b031681565b34801561057f57600080fd5b5061025e61058e366004613d2d565b611365565b34801561059f57600080fd5b506102ba60055481565b6102ba6105b7366004613ed0565b61199d565b3480156105c857600080fd5b506103087f000000000000000000000000000000000000000000000000000000000000000081565b3480156105fc57600080fd5b5061036461060b366004613ac5565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6102ba610643366004614066565b611c04565b34801561065457600080fd5b506102ba60065481565b34801561066a57600080fd5b5061025e610679366004613ce3565b611e7b565b34801561068a57600080fd5b50610364610699366004613bd9565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106cf57600080fd5b5061025e6106de366004613a8d565b6123bd565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061074657507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156107a15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b038216158015906107c757506001600160a01b0382163014155b6107d057600080fd5b6108056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086612657565b600080610816898989898989612695565b92509250506000828661082991906143ee565b905080156108d55760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561089b57600080fd5b505af11580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190613c6b565b505b506001805598975050505050505050565b60006108f686868686863361074c565b9695505050505050565b60006108f686868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150339050610990565b600061098785858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250339150611c049050565b95945050505050565b6000600260015414156109e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590610a0b57506001600160a01b0382163014155b610a1457600080fd5b610a496001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086612657565b600080610a5988888888886129ed565b925092505060008286610a6c91906143ee565b90508015610b185760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b169190613c6b565b505b5060018055979650505050505050565b6000610b9c8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525088925033915061199d9050565b979650505050505050565b33610bba6000546001600160a01b031690565b6001600160a01b031614610c105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b610c1a6000612ce9565b565b33610c2f6000546001600160a01b031690565b6001600160a01b031614610c855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b62127500811115610cc85760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610255565b600655565b33610ce06000546001600160a01b031690565b6001600160a01b031614610d365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6001600160a01b038116610e0657604051600090339047908381818185875af1925050503d8060008114610d86576040519150601f19603f3d011682016040523d82523d6000602084013e610d8b565b606091505b5050905080610e025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b5050565b6040516370a0823160e01b8152306004820152610e949033906001600160a01b038416906370a082319060240160206040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190613ccb565b6001600160a01b0384169190612d46565b50565b33610eaa6000546001600160a01b031690565b6001600160a01b031614610f005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b62093a80811115610f435760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610255565b600555565b6004546000906001600160a01b0316610f6357506000610746565b600480546040517f81e97b660000000000000000000000000000000000000000000000000000000081526001600160a01b0386811693820193909352602481018590529116906381e97b669060440160206040518083038186803b158015610fca57600080fd5b505afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110029190613c6b565b9392505050565b6002546001600160a01b0316158061102a57506003546001600160a01b0316155b6110765760405162461bcd60e51b815260206004820152600860248201527f6e6f74207a65726f0000000000000000000000000000000000000000000000006044820152606401610255565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110cf57600080fd5b505afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190613aa9565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111779190613aa9565b600260006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f657600080fd5b505afa15801561120a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122e9190613aa9565b6001600160a01b03166374a1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190613aa9565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336112e06000546001600160a01b031690565b6001600160a01b0316146113365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b828181146113b55760405162461bcd60e51b815260206004820152601060248201527f4e6f7420657175616c206c656e677468000000000000000000000000000000006044820152606401610255565b6000805b82811015611405578484828181106113e157634e487b7160e01b600052603260045260246000fd5b90506020020135826113f391906143b7565b91506113fe81614431565b90506113b9565b506040516340d1b7db60e11b8152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a19190613aa9565b905060006114af338a610f48565b6114bb576006546114be565b60005b6003549091506001600160a01b0316632699f55a8a6114e5670de0b6b3a7640000876143cf565b6040516001600160e01b031960e085901b1681526004810192909252602482015233604482015260648101849052608401602060405180830381600087803b15801561153057600080fd5b505af1158015611544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115689190613ccb565b5060035460405162d3f20f60e21b8152600481018b90526000916001600160a01b03169063034fc83c9060240160206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e59190613aa9565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a082319060240160206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116649190613ccb565b90506000846001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d99190613aa9565b9050806001600160a01b0316632eb2c2d633308e8e8e8e6040518763ffffffff1660e01b8152600401611711969594939291906141f6565b600060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038881166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561178d57600080fd5b505af11580156117a1573d6000803e3d6000fd5b5050604051635882017560e11b81526001600160a01b038816925063b10402ea91506117d9908e908e908e908e908a906004016142aa565b602060405180830381600087803b1580156117f357600080fd5b505af1158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190613ccb565b506040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a082319060240160206040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190613ccb565b90506118bd670de0b6b3a7640000886143cf565b6118c790846143b7565b81146119155760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610255565b600061192186426143b7565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08e8e8e9050600084336040516119859594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a15050505050505050505050505050565b6000600260015414156119f25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590611a1857506001600160a01b0382163014155b611a2157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a7c57600080fd5b505af1158015611a90573d6000803e3d6000fd5b5050505050600080611aa6888888883489612695565b925092505060008234611ab991906143ee565b90508015610b1857604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b88576040519150601f19603f3d011682016040523d82523d6000602084013e611b8d565b606091505b5050905080610b165760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b600060026001541415611c595760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590611c7f57506001600160a01b0382163014155b611c8857600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b5050505050600080611d0c87878734886129ed565b925092505060008234611d1f91906143ee565b90508015611e6c57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611d8957600080fd5b505af1158015611d9d573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dee576040519150601f19603f3d011682016040523d82523d6000602084013e611df3565b606091505b5050905080611e6a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b505b50600180559695505050505050565b6040516340d1b7db60e11b81526004810184905281906000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b158015611ee057600080fd5b505afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190613aa9565b90506000611f263387610f48565b611f3257600654611f35565b60005b6003549091506001600160a01b0316632699f55a87611f5c670de0b6b3a7640000876143cf565b6040516001600160e01b031960e085901b1681526004810192909252602482015233604482015260648101849052608401602060405180830381600087803b158015611fa757600080fd5b505af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613ccb565b5060035460405162d3f20f60e21b8152600481018890526000916001600160a01b03169063034fc83c9060240160206040518083038186803b15801561202457600080fd5b505afa158015612038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205c9190613aa9565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a082319060240160206040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190613ccb565b60408051600080825260208201909252919250506000856001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121629190613aa9565b90508760005b818110156121e2576121a1838c8c8481811061219457634e487b7160e01b600052603260045260246000fd5b905060200201358a612d76565b6121d283898d8d858181106121c657634e487b7160e01b600052603260045260246000fd5b905060200201356130a6565b6121db81614431565b9050612168565b50604051635882017560e11b81526001600160a01b0388169063b10402ea90612215908d908d9088908b906004016142ed565b602060405180830381600087803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613ccb565b506040516370a0823160e01b81526001600160a01b038681166004830152600091908916906370a082319060240160206040518083038186803b1580156122ad57600080fd5b505afa1580156122c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e59190613ccb565b90506122f9670de0b6b3a76400008a6143cf565b61230390866143b7565b81146123515760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610255565b600061235d88426143b7565b604080518f8152602081018e90526000818301526060810183905233608082015290519192507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c0919081900360a00190a150505050505050505050505050565b336123d06000546001600160a01b031690565b6001600160a01b0316146124265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6001600160a01b0381166124a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610255565b610e9481612ce9565b80158061254d57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254b9190613ccb565b155b6125bf5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610255565b6040516001600160a01b03831660248201526044810182905261263b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261317a565b505050565b606061264f848460008561325f565b949350505050565b6040516001600160a01b038085166024830152831660448201526064810182905261268f9085906323b872dd60e01b90608401612604565b50505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dbe66ca09060240160206040518083038186803b1580156126fb57600080fd5b505afa15801561270f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127339190613c6b565b61273c57600080fd5b6040516340d1b7db60e11b8152600481018a90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b15801561279f57600080fd5b505afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190613aa9565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613aa9565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690632eb2c2d69061289a90339030908f908f90600401614252565b600060405180830381600087803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561291657600080fd5b505af115801561292a573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c9061295f908e908e9060040161432e565b602060405180830381600087803b15801561297957600080fd5b505af115801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613ccb565b905060006129c7670de0b6b3a7640000836143cf565b90506129d78d85838d8d8d613393565b9650965096505050505096509650969350505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dbe66ca09060240160206040518083038186803b158015612a5357600080fd5b505afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190613c6b565b612a9457600080fd5b6040516340d1b7db60e11b8152600481018990526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613aa9565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6c57600080fd5b505afa158015612b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba49190613aa9565b895190915060005b81811015612c2a57612be6838c8381518110612bd857634e487b7160e01b600052603260045260246000fd5b602002602001015186612d76565b612c1883858d8481518110612c0b57634e487b7160e01b600052603260045260246000fd5b60200260200101516130a6565b80612c2281614431565b915050612bac565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90612c5c908e90859060040161432e565b602060405180830381600087803b158015612c7657600080fd5b505af1158015612c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cae9190613ccb565b506000612cc3670de0b6b3a7640000846143cf565b9050612cd38d86838e8e8e613393565b9750975097505050505050955095509592505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261263b90849063a9059cbb60e01b90606401612604565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612e06576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050613019565b816001600160a01b0316866001600160a01b03161415612fb157600085604051602401612e3591815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a1690612e979085906141da565b600060405180830381855afa9150503d8060008114612ed2576040519150601f19603f3d011682016040523d82523d6000602084013e612ed7565b606091505b5091509150600081806020019051810190612ef29190613aa9565b9050828015612f0957506001600160a01b03811633145b612f555760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610255565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506130199350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161303491906141da565b6000604051808303816000865af19150503d8060008114613071576040519150601f19603f3d011682016040523d82523d6000602084013e613076565b606091505b509150915081819061309b5760405162461bcd60e51b81526004016102559190614353565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156130eb57505050505050565b816001600160a01b0316866001600160a01b031614156131725760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050613019565b505050505050565b60006131cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126409092919063ffffffff16565b80519091501561263b57808060200190518101906131ed9190613c6b565b61263b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610255565b6060824710156132d75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610255565b843b6133255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610255565b600080866001600160a01b0316858760405161334191906141da565b60006040518083038185875af1925050503d806000811461337e576040519150601f19603f3d011682016040523d82523d6000602084013e613383565b606091505b5091509150610b9c828286613695565b600080806133cb6001600160a01b0389167f0000000000000000000000000000000000000000000000000000000000000000896124ab565b6040517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201899052606482018790526084820189905260a482018890523060c48301524260e4830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e8e337009061010401606060405180830381600087803b1580156134a157600080fd5b505af11580156134b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d99190614126565b600254929550909350915061352c906001600160a01b03168261351c8e7f00000000000000000000000000000000000000000000000000000000000000006136ce565b6001600160a01b031691906124ab565b6000613538338e610f48565b61354457600554613547565b60005b9050600260009054906101000a90046001600160a01b03166001600160a01b0316636c9b95888e8a85856040518563ffffffff1660e01b81526004016135af94939291909384526001600160a01b039290921660208401526040830152606082015260800190565b600060405180830381600087803b1580156135c957600080fd5b505af11580156135dd573d6000803e3d6000fd5b505050506000848c6135ef91906143ee565b9050801561360b5761360b6001600160a01b038e168a83612d46565b600061361783426143b7565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08f8e86848e6040516136779594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150939d929c50909a509098505050505050505050565b606083156136a4575081611002565b8251156136b45782518084602001fd5b8160405162461bcd60e51b81526004016102559190614353565b60008060006136dd858561384c565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137729190613aa9565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b1660348201526048016040516020818303038152906040528051906020012060405160200161382b9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156138d75760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f45535345530000000000000000000000000000000000000000000000000000006064820152608401610255565b826001600160a01b0316846001600160a01b0316106138f75782846138fa565b83835b90925090506001600160a01b0382166139555760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f4144445245535300006044820152606401610255565b9250929050565b60008083601f84011261396d578182fd5b50813567ffffffffffffffff811115613984578182fd5b6020830191508360208260051b850101111561395557600080fd5b600082601f8301126139af578081fd5b8135602067ffffffffffffffff8211156139cb576139cb614462565b8160051b6139da828201614386565b8381528281019086840183880185018910156139f4578687fd5b8693505b85841015613a165780358352600193909301929184019184016139f8565b50979650505050505050565b600082601f830112613a32578081fd5b813567ffffffffffffffff811115613a4c57613a4c614462565b613a5f601f8201601f1916602001614386565b818152846020838601011115613a73578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613a9e578081fd5b813561100281614478565b600060208284031215613aba578081fd5b815161100281614478565b600080600080600060a08688031215613adc578081fd5b8535613ae781614478565b94506020860135613af781614478565b9350604086013567ffffffffffffffff80821115613b13578283fd5b613b1f89838a0161399f565b94506060880135915080821115613b34578283fd5b613b4089838a0161399f565b93506080880135915080821115613b55578283fd5b50613b6288828901613a22565b9150509295509295909350565b60008060008060808587031215613b84578384fd5b8435613b8f81614478565b93506020850135613b9f81614478565b925060408501359150606085013567ffffffffffffffff811115613bc1578182fd5b613bcd87828801613a22565b91505092959194509250565b600080600080600060a08688031215613bf0578081fd5b8535613bfb81614478565b94506020860135613c0b81614478565b93506040860135925060608601359150608086013567ffffffffffffffff811115613c34578182fd5b613b6288828901613a22565b60008060408385031215613c52578182fd5b8235613c5d81614478565b946020939093013593505050565b600060208284031215613c7c578081fd5b81518015158114611002578182fd5b600060208284031215613c9c578081fd5b81356001600160e01b031981168114611002578182fd5b600060208284031215613cc4578081fd5b5035919050565b600060208284031215613cdc578081fd5b5051919050565b600080600060408486031215613cf7578081fd5b83359250602084013567ffffffffffffffff811115613d14578182fd5b613d208682870161395c565b9497909650939450505050565b600080600080600060608688031215613d44578283fd5b85359450602086013567ffffffffffffffff80821115613d62578485fd5b613d6e89838a0161395c565b90965094506040880135915080821115613d86578283fd5b50613d938882890161395c565b969995985093965092949392505050565b60008060008060008060808789031215613dbc578384fd5b86359550602087013567ffffffffffffffff80821115613dda578586fd5b613de68a838b0161395c565b90975095506040890135915080821115613dfe578283fd5b50613e0b89828a0161395c565b979a9699509497949695606090950135949350505050565b60008060008060608587031215613e38578182fd5b84359350602085013567ffffffffffffffff811115613e55578283fd5b613e618782880161395c565b9598909750949560400135949350505050565b600080600080600060808688031215613e8b578283fd5b85359450602086013567ffffffffffffffff811115613ea8578384fd5b613eb48882890161395c565b9699909850959660408101359660609091013595509350505050565b600080600080600060a08688031215613ee7578283fd5b85359450602086013567ffffffffffffffff80821115613f05578485fd5b613f1189838a0161399f565b95506040880135915080821115613f26578485fd5b50613f338882890161399f565b935050606086013591506080860135613f4b81614478565b809150509295509295909350565b600080600080600060a08688031215613f70578283fd5b85359450602086013567ffffffffffffffff80821115613f8e578485fd5b613f9a89838a0161399f565b95506040880135915080821115613faf578485fd5b50613fbc8882890161399f565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215613fed578384fd5b86359550602087013567ffffffffffffffff8082111561400b578586fd5b6140178a838b0161399f565b9650604089013591508082111561402c578586fd5b5061403989828a0161399f565b945050606087013592506080870135915060a087013561405881614478565b809150509295509295509295565b6000806000806080858703121561407b578182fd5b84359350602085013567ffffffffffffffff811115614098578283fd5b6140a48782880161399f565b9350506040850135915060608501356140bc81614478565b939692955090935050565b600080600080600060a086880312156140de578283fd5b85359450602086013567ffffffffffffffff8111156140fb578384fd5b6141078882890161399f565b94505060408601359250606086013591506080860135613f4b81614478565b60008060006060848603121561413a578081fd5b8351925060208401519150604084015190509250925092565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614184578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156141cf578151875295820195908201906001016141b3565b509495945050505050565b600082516141ec818460208701614405565b9190910192915050565b60006001600160a01b03808916835280881660208401525060a0604083015261422360a083018688614153565b8281036060840152614236818587614153565b8381036080909401939093525081526020019695505050505050565b60006001600160a01b03808716835280861660208401525060a0604083015261427e60a08301856141a0565b828103606084015261429081856141a0565b838103608090940193909352508152602001949350505050565b6060815260006142be606083018789614153565b82810360208401526142d1818688614153565b9150506001600160a01b03831660408301529695505050505050565b606081526000614301606083018688614153565b828103602084015261431381866141a0565b9150506001600160a01b038316604083015295945050505050565b60408152600061434160408301856141a0565b828103602084015261098781856141a0565b6020815260008251806020840152614372816040850160208701614405565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156143af576143af614462565b604052919050565b600082198211156143ca576143ca61444c565b500190565b60008160001904831182151516156143e9576143e961444c565b500290565b6000828210156144005761440061444c565b500390565b60005b83811015614420578181015183820152602001614408565b8381111561268f5750506000910152565b60006000198214156144455761444561444c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e9457600080fdfea2646970667358221220c98eedd6f8b76ad239439fff47c722651221d8cc2d5fecc66bff66cc6e4765bf64736f6c63430008040033000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c806384d5a23211610102578063ad402dfc11610095578063c46c4e8a11610064578063c46c4e8a14610648578063cd9d37b71461065e578063f23a6e611461067e578063f2fde38b146106c357600080fd5b8063ad402dfc146105a9578063ad5c4648146105bc578063bc197c81146105f0578063bdd8172b1461063557600080fd5b806392054f8b116100d157806392054f8b146105335780639bf1401c146105535780639d2cbed014610573578063a7b128461461059357600080fd5b806384d5a232146104c0578063881b2f2d146104e05780638da5cb5b146105005780639199fc9c1461051e57600080fd5b80634a5ff0611161017a578063715018a611610149578063715018a61461044b578063739697751461046057806374a1b0b014610480578063839006f2146104a057600080fd5b80634a5ff061146103b057806353b573bf146103d05780635ee50f88146103e35780636d13582c1461041757600080fd5b806311ad9d38116101b657806311ad9d38146102e8578063150b7a02146103205780631809d2c21461037d5780631a6907cd1461039d57600080fd5b806301ffc9a714610265578063021001551461029a57806310cde786146102c857600080fd5b3661026057336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461025e5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561027157600080fd5b50610285610280366004613c8b565b6106e3565b60405190151581526020015b60405180910390f35b3480156102a657600080fd5b506102ba6102b5366004613fd5565b61074c565b604051908152602001610291565b3480156102d457600080fd5b506102ba6102e3366004613f59565b6108e6565b3480156102f457600080fd5b50600454610308906001600160a01b031681565b6040516001600160a01b039091168152602001610291565b34801561032c57600080fd5b5061036461033b366004613b6f565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b03199091168152602001610291565b34801561038957600080fd5b506102ba610398366004613e74565b610900565b6102ba6103ab366004613e23565b610944565b3480156103bc57600080fd5b506102ba6103cb3660046140c7565b610990565b6102ba6103de366004613da4565b610b28565b3480156103ef57600080fd5b506103087f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821681565b34801561042357600080fd5b506103087f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b34801561045757600080fd5b5061025e610ba7565b34801561046c57600080fd5b5061025e61047b366004613cb3565b610c1c565b34801561048c57600080fd5b50600354610308906001600160a01b031681565b3480156104ac57600080fd5b5061025e6104bb366004613a8d565b610ccd565b3480156104cc57600080fd5b5061025e6104db366004613cb3565b610e97565b3480156104ec57600080fd5b506102856104fb366004613c40565b610f48565b34801561050c57600080fd5b506000546001600160a01b0316610308565b34801561052a57600080fd5b5061025e611009565b34801561053f57600080fd5b5061025e61054e366004613a8d565b6112cd565b34801561055f57600080fd5b50600254610308906001600160a01b031681565b34801561057f57600080fd5b5061025e61058e366004613d2d565b611365565b34801561059f57600080fd5b506102ba60055481565b6102ba6105b7366004613ed0565b61199d565b3480156105c857600080fd5b506103087f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156105fc57600080fd5b5061036461060b366004613ac5565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6102ba610643366004614066565b611c04565b34801561065457600080fd5b506102ba60065481565b34801561066a57600080fd5b5061025e610679366004613ce3565b611e7b565b34801561068a57600080fd5b50610364610699366004613bd9565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106cf57600080fd5b5061025e6106de366004613a8d565b6123bd565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061074657507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156107a15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b038216158015906107c757506001600160a01b0382163014155b6107d057600080fd5b6108056001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333086612657565b600080610816898989898989612695565b92509250506000828661082991906143ee565b905080156108d55760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561089b57600080fd5b505af11580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190613c6b565b505b506001805598975050505050505050565b60006108f686868686863361074c565b9695505050505050565b60006108f686868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150339050610990565b600061098785858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250339150611c049050565b95945050505050565b6000600260015414156109e55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590610a0b57506001600160a01b0382163014155b610a1457600080fd5b610a496001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333086612657565b600080610a5988888888886129ed565b925092505060008286610a6c91906143ee565b90508015610b185760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b169190613c6b565b505b5060018055979650505050505050565b6000610b9c8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525088925033915061199d9050565b979650505050505050565b33610bba6000546001600160a01b031690565b6001600160a01b031614610c105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b610c1a6000612ce9565b565b33610c2f6000546001600160a01b031690565b6001600160a01b031614610c855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b62127500811115610cc85760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610255565b600655565b33610ce06000546001600160a01b031690565b6001600160a01b031614610d365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6001600160a01b038116610e0657604051600090339047908381818185875af1925050503d8060008114610d86576040519150601f19603f3d011682016040523d82523d6000602084013e610d8b565b606091505b5050905080610e025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b5050565b6040516370a0823160e01b8152306004820152610e949033906001600160a01b038416906370a082319060240160206040518083038186803b158015610e4b57600080fd5b505afa158015610e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e839190613ccb565b6001600160a01b0384169190612d46565b50565b33610eaa6000546001600160a01b031690565b6001600160a01b031614610f005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b62093a80811115610f435760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610255565b600555565b6004546000906001600160a01b0316610f6357506000610746565b600480546040517f81e97b660000000000000000000000000000000000000000000000000000000081526001600160a01b0386811693820193909352602481018590529116906381e97b669060440160206040518083038186803b158015610fca57600080fd5b505afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110029190613c6b565b9392505050565b6002546001600160a01b0316158061102a57506003546001600160a01b0316155b6110765760405162461bcd60e51b815260206004820152600860248201527f6e6f74207a65726f0000000000000000000000000000000000000000000000006044820152606401610255565b7f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110cf57600080fd5b505afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190613aa9565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111779190613aa9565b600260006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f657600080fd5b505afa15801561120a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122e9190613aa9565b6001600160a01b03166374a1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190613aa9565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336112e06000546001600160a01b031690565b6001600160a01b0316146113365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b828181146113b55760405162461bcd60e51b815260206004820152601060248201527f4e6f7420657175616c206c656e677468000000000000000000000000000000006044820152606401610255565b6000805b82811015611405578484828181106113e157634e487b7160e01b600052603260045260246000fd5b90506020020135826113f391906143b7565b91506113fe81614431565b90506113b9565b506040516340d1b7db60e11b8152600481018890526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a19190613aa9565b905060006114af338a610f48565b6114bb576006546114be565b60005b6003549091506001600160a01b0316632699f55a8a6114e5670de0b6b3a7640000876143cf565b6040516001600160e01b031960e085901b1681526004810192909252602482015233604482015260648101849052608401602060405180830381600087803b15801561153057600080fd5b505af1158015611544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115689190613ccb565b5060035460405162d3f20f60e21b8152600481018b90526000916001600160a01b03169063034fc83c9060240160206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e59190613aa9565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a082319060240160206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116649190613ccb565b90506000846001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d99190613aa9565b9050806001600160a01b0316632eb2c2d633308e8e8e8e6040518763ffffffff1660e01b8152600401611711969594939291906141f6565b600060405180830381600087803b15801561172b57600080fd5b505af115801561173f573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038881166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561178d57600080fd5b505af11580156117a1573d6000803e3d6000fd5b5050604051635882017560e11b81526001600160a01b038816925063b10402ea91506117d9908e908e908e908e908a906004016142aa565b602060405180830381600087803b1580156117f357600080fd5b505af1158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190613ccb565b506040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a082319060240160206040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a99190613ccb565b90506118bd670de0b6b3a7640000886143cf565b6118c790846143b7565b81146119155760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610255565b600061192186426143b7565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08e8e8e9050600084336040516119859594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a15050505050505050505050505050565b6000600260015414156119f25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590611a1857506001600160a01b0382163014155b611a2157600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a7c57600080fd5b505af1158015611a90573d6000803e3d6000fd5b5050505050600080611aa6888888883489612695565b925092505060008234611ab991906143ee565b90508015610b1857604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b88576040519150601f19603f3d011682016040523d82523d6000602084013e611b8d565b606091505b5050905080610b165760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b600060026001541415611c595760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610255565b60026001556001600160a01b03821615801590611c7f57506001600160a01b0382163014155b611c8857600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b5050505050600080611d0c87878734886129ed565b925092505060008234611d1f91906143ee565b90508015611e6c57604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611d8957600080fd5b505af1158015611d9d573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dee576040519150601f19603f3d011682016040523d82523d6000602084013e611df3565b606091505b5050905080611e6a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610255565b505b50600180559695505050505050565b6040516340d1b7db60e11b81526004810184905281906000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b158015611ee057600080fd5b505afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190613aa9565b90506000611f263387610f48565b611f3257600654611f35565b60005b6003549091506001600160a01b0316632699f55a87611f5c670de0b6b3a7640000876143cf565b6040516001600160e01b031960e085901b1681526004810192909252602482015233604482015260648101849052608401602060405180830381600087803b158015611fa757600080fd5b505af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613ccb565b5060035460405162d3f20f60e21b8152600481018890526000916001600160a01b03169063034fc83c9060240160206040518083038186803b15801561202457600080fd5b505afa158015612038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205c9190613aa9565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a082319060240160206040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190613ccb565b60408051600080825260208201909252919250506000856001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121629190613aa9565b90508760005b818110156121e2576121a1838c8c8481811061219457634e487b7160e01b600052603260045260246000fd5b905060200201358a612d76565b6121d283898d8d858181106121c657634e487b7160e01b600052603260045260246000fd5b905060200201356130a6565b6121db81614431565b9050612168565b50604051635882017560e11b81526001600160a01b0388169063b10402ea90612215908d908d9088908b906004016142ed565b602060405180830381600087803b15801561222f57600080fd5b505af1158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613ccb565b506040516370a0823160e01b81526001600160a01b038681166004830152600091908916906370a082319060240160206040518083038186803b1580156122ad57600080fd5b505afa1580156122c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e59190613ccb565b90506122f9670de0b6b3a76400008a6143cf565b61230390866143b7565b81146123515760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610255565b600061235d88426143b7565b604080518f8152602081018e90526000818301526060810183905233608082015290519192507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c0919081900360a00190a150505050505050505050505050565b336123d06000546001600160a01b031690565b6001600160a01b0316146124265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610255565b6001600160a01b0381166124a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610255565b610e9481612ce9565b80158061254d57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254b9190613ccb565b155b6125bf5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610255565b6040516001600160a01b03831660248201526044810182905261263b9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261317a565b505050565b606061264f848460008561325f565b949350505050565b6040516001600160a01b038085166024830152831660448201526064810182905261268f9085906323b872dd60e01b90608401612604565b50505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216169063dbe66ca09060240160206040518083038186803b1580156126fb57600080fd5b505afa15801561270f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127339190613c6b565b61273c57600080fd5b6040516340d1b7db60e11b8152600481018a90526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b15801561279f57600080fd5b505afa1580156127b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d79190613aa9565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613aa9565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690632eb2c2d69061289a90339030908f908f90600401614252565b600060405180830381600087803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561291657600080fd5b505af115801561292a573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c9061295f908e908e9060040161432e565b602060405180830381600087803b15801561297957600080fd5b505af115801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613ccb565b905060006129c7670de0b6b3a7640000836143cf565b90506129d78d85838d8d8d613393565b9650965096505050505096509650969350505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216169063dbe66ca09060240160206040518083038186803b158015612a5357600080fd5b505afa158015612a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8b9190613c6b565b612a9457600080fd5b6040516340d1b7db60e11b8152600481018990526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613aa9565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6c57600080fd5b505afa158015612b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba49190613aa9565b895190915060005b81811015612c2a57612be6838c8381518110612bd857634e487b7160e01b600052603260045260246000fd5b602002602001015186612d76565b612c1883858d8481518110612c0b57634e487b7160e01b600052603260045260246000fd5b60200260200101516130a6565b80612c2281614431565b915050612bac565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90612c5c908e90859060040161432e565b602060405180830381600087803b158015612c7657600080fd5b505af1158015612c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cae9190613ccb565b506000612cc3670de0b6b3a7640000846143cf565b9050612cd38d86838e8e8e613393565b9750975097505050505050955095509592505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261263b90849063a9059cbb60e01b90606401612604565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612e06576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050613019565b816001600160a01b0316866001600160a01b03161415612fb157600085604051602401612e3591815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a1690612e979085906141da565b600060405180830381855afa9150503d8060008114612ed2576040519150601f19603f3d011682016040523d82523d6000602084013e612ed7565b606091505b5091509150600081806020019051810190612ef29190613aa9565b9050828015612f0957506001600160a01b03811633145b612f555760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610255565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506130199350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161303491906141da565b6000604051808303816000865af19150503d8060008114613071576040519150601f19603f3d011682016040523d82523d6000602084013e613076565b606091505b509150915081819061309b5760405162461bcd60e51b81526004016102559190614353565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156130eb57505050505050565b816001600160a01b0316866001600160a01b031614156131725760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050613019565b505050505050565b60006131cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126409092919063ffffffff16565b80519091501561263b57808060200190518101906131ed9190613c6b565b61263b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610255565b6060824710156132d75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610255565b843b6133255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610255565b600080866001600160a01b0316858760405161334191906141da565b60006040518083038185875af1925050503d806000811461337e576040519150601f19603f3d011682016040523d82523d6000602084013e613383565b606091505b5091509150610b9c828286613695565b600080806133cb6001600160a01b0389167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f896124ab565b6040517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116602483015260448201899052606482018790526084820189905260a482018890523060c48301524260e4830152600091829182917f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9091169063e8e337009061010401606060405180830381600087803b1580156134a157600080fd5b505af11580156134b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d99190614126565b600254929550909350915061352c906001600160a01b03168261351c8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26136ce565b6001600160a01b031691906124ab565b6000613538338e610f48565b61354457600554613547565b60005b9050600260009054906101000a90046001600160a01b03166001600160a01b0316636c9b95888e8a85856040518563ffffffff1660e01b81526004016135af94939291909384526001600160a01b039290921660208401526040830152606082015260800190565b600060405180830381600087803b1580156135c957600080fd5b505af11580156135dd573d6000803e3d6000fd5b505050506000848c6135ef91906143ee565b9050801561360b5761360b6001600160a01b038e168a83612d46565b600061361783426143b7565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08f8e86848e6040516136779594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150939d929c50909a509098505050505050505050565b606083156136a4575081611002565b8251156136b45782518084602001fd5b8160405162461bcd60e51b81526004016102559190614353565b60008060006136dd858561384c565b915091507f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137729190613aa9565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b1660348201526048016040516020818303038152906040528051906020012060405160200161382b9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156138d75760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f45535345530000000000000000000000000000000000000000000000000000006064820152608401610255565b826001600160a01b0316846001600160a01b0316106138f75782846138fa565b83835b90925090506001600160a01b0382166139555760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f4144445245535300006044820152606401610255565b9250929050565b60008083601f84011261396d578182fd5b50813567ffffffffffffffff811115613984578182fd5b6020830191508360208260051b850101111561395557600080fd5b600082601f8301126139af578081fd5b8135602067ffffffffffffffff8211156139cb576139cb614462565b8160051b6139da828201614386565b8381528281019086840183880185018910156139f4578687fd5b8693505b85841015613a165780358352600193909301929184019184016139f8565b50979650505050505050565b600082601f830112613a32578081fd5b813567ffffffffffffffff811115613a4c57613a4c614462565b613a5f601f8201601f1916602001614386565b818152846020838601011115613a73578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613a9e578081fd5b813561100281614478565b600060208284031215613aba578081fd5b815161100281614478565b600080600080600060a08688031215613adc578081fd5b8535613ae781614478565b94506020860135613af781614478565b9350604086013567ffffffffffffffff80821115613b13578283fd5b613b1f89838a0161399f565b94506060880135915080821115613b34578283fd5b613b4089838a0161399f565b93506080880135915080821115613b55578283fd5b50613b6288828901613a22565b9150509295509295909350565b60008060008060808587031215613b84578384fd5b8435613b8f81614478565b93506020850135613b9f81614478565b925060408501359150606085013567ffffffffffffffff811115613bc1578182fd5b613bcd87828801613a22565b91505092959194509250565b600080600080600060a08688031215613bf0578081fd5b8535613bfb81614478565b94506020860135613c0b81614478565b93506040860135925060608601359150608086013567ffffffffffffffff811115613c34578182fd5b613b6288828901613a22565b60008060408385031215613c52578182fd5b8235613c5d81614478565b946020939093013593505050565b600060208284031215613c7c578081fd5b81518015158114611002578182fd5b600060208284031215613c9c578081fd5b81356001600160e01b031981168114611002578182fd5b600060208284031215613cc4578081fd5b5035919050565b600060208284031215613cdc578081fd5b5051919050565b600080600060408486031215613cf7578081fd5b83359250602084013567ffffffffffffffff811115613d14578182fd5b613d208682870161395c565b9497909650939450505050565b600080600080600060608688031215613d44578283fd5b85359450602086013567ffffffffffffffff80821115613d62578485fd5b613d6e89838a0161395c565b90965094506040880135915080821115613d86578283fd5b50613d938882890161395c565b969995985093965092949392505050565b60008060008060008060808789031215613dbc578384fd5b86359550602087013567ffffffffffffffff80821115613dda578586fd5b613de68a838b0161395c565b90975095506040890135915080821115613dfe578283fd5b50613e0b89828a0161395c565b979a9699509497949695606090950135949350505050565b60008060008060608587031215613e38578182fd5b84359350602085013567ffffffffffffffff811115613e55578283fd5b613e618782880161395c565b9598909750949560400135949350505050565b600080600080600060808688031215613e8b578283fd5b85359450602086013567ffffffffffffffff811115613ea8578384fd5b613eb48882890161395c565b9699909850959660408101359660609091013595509350505050565b600080600080600060a08688031215613ee7578283fd5b85359450602086013567ffffffffffffffff80821115613f05578485fd5b613f1189838a0161399f565b95506040880135915080821115613f26578485fd5b50613f338882890161399f565b935050606086013591506080860135613f4b81614478565b809150509295509295909350565b600080600080600060a08688031215613f70578283fd5b85359450602086013567ffffffffffffffff80821115613f8e578485fd5b613f9a89838a0161399f565b95506040880135915080821115613faf578485fd5b50613fbc8882890161399f565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215613fed578384fd5b86359550602087013567ffffffffffffffff8082111561400b578586fd5b6140178a838b0161399f565b9650604089013591508082111561402c578586fd5b5061403989828a0161399f565b945050606087013592506080870135915060a087013561405881614478565b809150509295509295509295565b6000806000806080858703121561407b578182fd5b84359350602085013567ffffffffffffffff811115614098578283fd5b6140a48782880161399f565b9350506040850135915060608501356140bc81614478565b939692955090935050565b600080600080600060a086880312156140de578283fd5b85359450602086013567ffffffffffffffff8111156140fb578384fd5b6141078882890161399f565b94505060408601359250606086013591506080860135613f4b81614478565b60008060006060848603121561413a578081fd5b8351925060208401519150604084015190509250925092565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614184578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156141cf578151875295820195908201906001016141b3565b509495945050505050565b600082516141ec818460208701614405565b9190910192915050565b60006001600160a01b03808916835280881660208401525060a0604083015261422360a083018688614153565b8281036060840152614236818587614153565b8381036080909401939093525081526020019695505050505050565b60006001600160a01b03808716835280861660208401525060a0604083015261427e60a08301856141a0565b828103606084015261429081856141a0565b838103608090940193909352508152602001949350505050565b6060815260006142be606083018789614153565b82810360208401526142d1818688614153565b9150506001600160a01b03831660408301529695505050505050565b606081526000614301606083018688614153565b828103602084015261431381866141a0565b9150506001600160a01b038316604083015295945050505050565b60408152600061434160408301856141a0565b828103602084015261098781856141a0565b6020815260008251806020840152614372816040850160208701614405565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff811182821017156143af576143af614462565b604052919050565b600082198211156143ca576143ca61444c565b500190565b60008160001904831182151516156143e9576143e961444c565b500290565b6000828210156144005761440061444c565b500390565b60005b83811015614420578181015183820152602001614408565b8381111561268f5750506000910152565b60006000198214156144455761444561444c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e9457600080fdfea2646970667358221220c98eedd6f8b76ad239439fff47c722651221d8cc2d5fecc66bff66cc6e4765bf64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
-----Decoded View---------------
Arg [0] : _nftxFactory (address): 0xBE86f647b167567525cCAAfcd6f881F1Ee558216
Arg [1] : _sushiRouter (address): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216
Arg [1] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode Sourcemap
60781:14996:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75330:10;-1:-1:-1;;;;;75352:4:0;75330:27;;75322:49;;;;-1:-1:-1;;;75322:49:0;;26155:2:1;75322:49:0;;;26137:21:1;26194:1;26174:18;;;26167:29;26232:11;26212:18;;;26205:39;26261:18;;75322:49:0;;;;;;;;;60781:14996;;;;;37046:269;;;;;;;;;;-1:-1:-1;37046:269:0;;;;;:::i;:::-;;:::i;:::-;;;22991:14:1;;22984:22;22966:41;;22954:2;22939:18;37046:269:0;;;;;;;;68560:648;;;;;;;;;;-1:-1:-1;68560:648:0;;;;;:::i;:::-;;:::i;:::-;;;31317:25:1;;;31305:2;31290:18;68560:648:0;31272:76:1;68280:274:0;;;;;;;;;;-1:-1:-1;68280:274:0;;;;;:::i;:::-;;:::i;61166:47::-;;;;;;;;;;-1:-1:-1;61166:47:0;;;;-1:-1:-1;;;;;61166:47:0;;;;;;-1:-1:-1;;;;;17013:55:1;;;16995:74;;16983:2;16968:18;61166:47:0;16950:125:1;33046:207:0;;;;;;;;;;-1:-1:-1;33046:207:0;;;;;:::i;:::-;33215:30;33046:207;;;;;;;;;;-1:-1:-1;;;;;;23180:79:1;;;23162:98;;23150:2;23135:18;33046:207:0;23117:149:1;67425:237:0;;;;;;;;;;-1:-1:-1;67425:237:0;;;;;:::i;:::-;;:::i;65456:222::-;;;;;;:::i;:::-;;:::i;67668:606::-;;;;;;;;;;-1:-1:-1;67668:606:0;;;;;:::i;:::-;;:::i;66389:264::-;;;;;;:::i;:::-;;:::i;61063:46::-;;;;;;;;;;;;;;;61114:47;;;;;;;;;;;;;;;60152:94;;;;;;;;;;;;;:::i;62555:196::-;;;;;;;;;;-1:-1:-1;62555:196:0;;;;;:::i;:::-;;:::i;61013:45::-;;;;;;;;;;-1:-1:-1;61013:45:0;;;;-1:-1:-1;;;;;61013:45:0;;;75383:391;;;;;;;;;;-1:-1:-1;75383:391:0;;;;;:::i;:::-;;:::i;62388:160::-;;;;;;;;;;-1:-1:-1;62388:160:0;;;;;:::i;:::-;;:::i;62757:283::-;;;;;;;;;;-1:-1:-1;62757:283:0;;;;;:::i;:::-;;:::i;59503:87::-;;;;;;;;;;-1:-1:-1;59549:7:0;59576:6;-1:-1:-1;;;;;59576:6:0;59503:87;;61837:413;;;;;;;;;;;;;:::i;62256:126::-;;;;;;;;;;-1:-1:-1;62256:126:0;;;;;:::i;:::-;;:::i;60977:31::-;;;;;;;;;;-1:-1:-1;60977:31:0;;;;-1:-1:-1;;;;;60977:31:0;;;64207:1243;;;;;;;;;;-1:-1:-1;64207:1243:0;;;;;:::i;:::-;;:::i;61220:36::-;;;;;;;;;;;;;;;;66659:760;;;;;;:::i;:::-;;:::i;60944:27::-;;;;;;;;;;;;;;;37726:203;;;;;;;;;;-1:-1:-1;37726:203:0;;;;;:::i;:::-;37885:36;37726:203;;;;;;;;65684:699;;;;;;:::i;:::-;;:::i;61262:41::-;;;;;;;;;;;;;;;;63046:1155;;;;;;;;;;-1:-1:-1;63046:1155:0;;;;;:::i;:::-;;:::i;37543:175::-;;;;;;;;;;-1:-1:-1;37543:175:0;;;;;:::i;:::-;37679:31;37543:175;;;;;;;;60401:192;;;;;;;;;;-1:-1:-1;60401:192:0;;;;;:::i;:::-;;:::i;37046:269::-;37170:4;-1:-1:-1;;;;;;37194:60:0;;37209:45;37194:60;;:113;;-1:-1:-1;36684:36:0;-1:-1:-1;;;;;;36669:51:0;;;37271:36;37187:120;37046:269;-1:-1:-1;;37046:269:0:o;68560:648::-;68765:7;57661:1;58257:7;;:19;;58249:63;;;;-1:-1:-1;;;58249:63:0;;30244:2:1;58249:63:0;;;30226:21:1;30283:2;30263:18;;;30256:30;30322:33;30302:18;;;30295:61;30373:18;;58249:63:0;30216:181:1;58249:63:0;57661:1;58390:7;:18;-1:-1:-1;;;;;68789:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;68809:19:0;::::1;68823:4;68809:19;;68789:39;68781:48;;;::::0;::::1;;68836:84;-1:-1:-1::0;;;;;68862:4:0::1;68836:49;68886:10;68906:4;68913:6:::0;68836:49:::1;:84::i;:::-;68930:17;68949::::0;68970:67:::1;68992:7;69001:3;69006:7;69015:9;69026:6;69034:2;68970:21;:67::i;:::-;68927:110;;;;;69069:17;69096:9;69089:6;:16;;;;:::i;:::-;69069:36:::0;-1:-1:-1;69117:14:0;;69113:65:::1;;69142:28;::::0;-1:-1:-1;;;69142:28:0;;-1:-1:-1;;;;;20985:55:1;;;69142:28:0::1;::::0;::::1;20967:74:1::0;21057:18;;;21050:34;;;69142:4:0::1;:13;::::0;::::1;::::0;20940:18:1;;69142:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69113:65;-1:-1:-1::0;57617:1:0;58569:22;;69193:9;68560:648;-1:-1:-1;;;;;;;;68560:648:0:o;68280:274::-;68453:7;68476:72;68495:7;68504:3;68509:7;68518:9;68529:6;68537:10;68476:18;:72::i;:::-;68469:79;68280:274;-1:-1:-1;;;;;;68280:274:0:o;67425:237::-;67571:7;67594:62;67612:7;67621:3;;67594:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67626:9:0;;-1:-1:-1;67637:6:0;;-1:-1:-1;67645:10:0;;-1:-1:-1;67594:17:0;:62::i;65456:222::-;65592:7;65615:57;65636:7;65645:3;;65615:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65650:9:0;;-1:-1:-1;65661:10:0;;-1:-1:-1;65615:20:0;;-1:-1:-1;65615:57:0:i;:::-;65608:64;65456:222;-1:-1:-1;;;;;65456:222:0:o;67668:606::-;67842:7;57661:1;58257:7;;:19;;58249:63;;;;-1:-1:-1;;;58249:63:0;;30244:2:1;58249:63:0;;;30226:21:1;30283:2;30263:18;;;30256:30;30322:33;30302:18;;;30295:61;30373:18;;58249:63:0;30216:181:1;58249:63:0;57661:1;58390:7;:18;-1:-1:-1;;;;;67866:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;67886:19:0;::::1;67900:4;67886:19;;67866:39;67858:48;;;::::0;::::1;;67913:84;-1:-1:-1::0;;;;;67939:4:0::1;67913:49;67963:10;67983:4;67990:6:::0;67913:49:::1;:84::i;:::-;68007:17;68026::::0;68047:57:::1;68068:7;68077:3;68082:9;68093:6;68101:2;68047:20;:57::i;:::-;68004:100;;;;;68136:17;68163:9;68156:6;:16;;;;:::i;:::-;68136:36:::0;-1:-1:-1;68183:14:0;;68179:65:::1;;68208:28;::::0;-1:-1:-1;;;68208:28:0;;-1:-1:-1;;;;;20985:55:1;;;68208:28:0::1;::::0;::::1;20967:74:1::0;21057:18;;;21050:34;;;68208:4:0::1;:13;::::0;::::1;::::0;20940:18:1;;68208:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68179:65;-1:-1:-1::0;57617:1:0;58569:22;;68259:9;67668:606;-1:-1:-1;;;;;;;67668:606:0:o;66389:264::-;66558:7;66581:66;66603:7;66612:3;;66581:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66581:66:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66617:7:0;;-1:-1:-1;66617:7:0;;;;66581:66;;;66617:7;;66581:66;66617:7;66581:66;;;;;;;;;-1:-1:-1;66626:8:0;;-1:-1:-1;66636:10:0;;-1:-1:-1;66581:21:0;;-1:-1:-1;66581:66:0:i;:::-;66574:73;66389:264;-1:-1:-1;;;;;;;66389:264:0:o;60152:94::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;60217:21:::1;60235:1;60217:9;:21::i;:::-;60152:94::o:0;62555:196::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;62673:7:::1;62649:20;:31;;62641:57;;;::::0;-1:-1:-1;;;62641:57:0;;27732:2:1;62641:57:0::1;::::0;::::1;27714:21:1::0;27771:2;27751:18;;;27744:30;-1:-1:-1;;;27790:18:1;;;27783:43;27843:18;;62641:57:0::1;27704:163:1::0;62641:57:0::1;62705:17;:40:::0;62555:196::o;75383:391::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;-1:-1:-1;;;;;75444:19:0;::::1;75440:329;;75493:58;::::0;75475:12:::1;::::0;75501:10:::1;::::0;75525:21:::1;::::0;75475:12;75493:58;75475:12;75493:58;75525:21;75501:10;75493:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75474:77;;;75568:7;75560:78;;;::::0;-1:-1:-1;;;75560:78:0;;26898:2:1;75560:78:0::1;::::0;::::1;26880:21:1::0;26937:2;26917:18;;;26910:30;26976:34;26956:18;;;26949:62;27047:28;27027:18;;;27020:56;27093:19;;75560:78:0::1;26870:248:1::0;75560:78:0::1;75440:329;75383:391:::0;:::o;75440:329::-:1;75711:49;::::0;-1:-1:-1;;;75711:49:0;;75754:4:::1;75711:49;::::0;::::1;16995:74:1::0;75661:100:0::1;::::0;75699:10:::1;::::0;-1:-1:-1;;;;;75711:34:0;::::1;::::0;::::1;::::0;16968:18:1;;75711:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;75661:37:0;::::1;::::0;:100;:37:::1;:100::i;:::-;75383:391:::0;:::o;62388:160::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;62485:6:::1;62468:13;:23;;62460:49;;;::::0;-1:-1:-1;;;62460:49:0;;27732:2:1;62460:49:0::1;::::0;::::1;27714:21:1::0;27771:2;27751:18;;;27744:30;-1:-1:-1;;;27790:18:1;;;27783:43;27843:18;;62460:49:0::1;27704:163:1::0;62460:49:0::1;62516:10;:26:::0;62388:160::o;62757:283::-;62873:19;;62844:4;;-1:-1:-1;;;;;62873:19:0;62861:172;;-1:-1:-1;62931:5:0;62924:12;;62861:172;62976:19;;;:45;;;;;-1:-1:-1;;;;;20985:55:1;;;62976:45:0;;;20967:74:1;;;;21057:18;;;21050:34;;;62976:19:0;;;:30;;20940:18:1;;62976:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62969:52;62757:283;-1:-1:-1;;;62757:283:0:o;61837:413::-;61901:9;;-1:-1:-1;;;;;61901:9:0;61893:32;;:75;;-1:-1:-1;61937:16:0;;-1:-1:-1;;;;;61937:16:0;61929:39;61893:75;61885:96;;;;-1:-1:-1;;;61885:96:0;;28793:2:1;61885:96:0;;;28775:21:1;28832:1;28812:18;;;28805:29;28870:10;28850:18;;;28843:38;28898:18;;61885:96:0;28765:157:1;61885:96:0;62059:11;-1:-1:-1;;;;;62041:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62015:84:0;;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61988:9;;:114;;;;;-1:-1:-1;;;;;61988:114:0;;;;;-1:-1:-1;;;;;61988:114:0;;;;;;62194:11;-1:-1:-1;;;;;62176:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62150:91:0;;:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62109:16;:135;;-1:-1:-1;;62109:135:0;-1:-1:-1;;;;;62109:135:0;;;;;;;;;;61837:413::o;62256:126::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;62328:19:::1;:48:::0;;-1:-1:-1;;62328:48:0::1;-1:-1:-1::0;;;;;62328:48:0;;;::::1;::::0;;;::::1;::::0;;62256:126::o;64207:1243::-;64344:8;64374:24;;;64366:53;;;;-1:-1:-1;;;64366:53:0;;29129:2:1;64366:53:0;;;29111:21:1;29168:2;29148:18;;;29141:30;29207:18;29187;;;29180:46;29243:18;;64366:53:0;29101:166:1;64366:53:0;64426:13;64451:9;64446:69;64466:6;64462:1;:10;64446:69;;;64497:7;;64505:1;64497:10;;;;;-1:-1:-1;;;64497:10:0;;;;;;;;;;;;;;;64488:19;;;;;:::i;:::-;;-1:-1:-1;64474:3:0;;;:::i;:::-;;;64446:69;;;-1:-1:-1;64551:26:0;;-1:-1:-1;;;64551:26:0;;;;;31317:25:1;;;64521:16:0;;64551:11;-1:-1:-1;;;;;64551:17:0;;;;31290:18:1;;64551:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64521:57;;64585:20;64608:46;64634:10;64646:7;64608:25;:46::i;:::-;:70;;64661:17;;64608:70;;;64657:1;64608:70;64685:16;;64585:93;;-1:-1:-1;;;;;;64685:16:0;:32;64718:7;64727:10;61333:4;64727:5;:10;:::i;:::-;64685:79;;-1:-1:-1;;;;;;64685:79:0;;;;;;;;;;32419:25:1;;;;32460:18;;;32453:34;64739:10:0;32503:18:1;;;32496:83;32595:18;;;32588:34;;;32391:19;;64685:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64788:16:0;;:37;;-1:-1:-1;;;64788:37:0;;;;;31317:25:1;;;64771:14:0;;-1:-1:-1;;;;;64788:16:0;;:28;;31290:18:1;;64788:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64849:51;;-1:-1:-1;;;64849:51:0;;-1:-1:-1;;;;;17013:55:1;;;64849:51:0;;;16995:74:1;64771:54:0;;-1:-1:-1;64832:14:0;;64849:34;;;;;16968:18:1;;64849:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64832:68;;64907:23;64953:5;-1:-1:-1;;;;;64953:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64907:67;;64981:3;-1:-1:-1;;;;;64981:25:0;;65007:10;65027:4;65034:8;;65044:7;;64981:75;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65063:43:0;;-1:-1:-1;;;65063:43:0;;-1:-1:-1;;;;;20667:55:1;;;65063:43:0;;;20649:74:1;65101:4:0;20739:18:1;;;20732:50;65063:21:0;;;-1:-1:-1;65063:21:0;;-1:-1:-1;20622:18:1;;65063:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65113:48:0;;-1:-1:-1;;;65113:48:0;;-1:-1:-1;;;;;65113:12:0;;;-1:-1:-1;65113:12:0;;-1:-1:-1;65113:48:0;;65126:8;;;;65136:7;;;;65153:6;;65113:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;65185:51:0;;-1:-1:-1;;;65185:51:0;;-1:-1:-1;;;;;17013:55:1;;;65185:51:0;;;16995:74:1;65168:14:0;;65185:34;;;;;;16968:18:1;;65185:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65168:68;-1:-1:-1;65270:10:0;61333:4;65270:5;:10;:::i;:::-;65261:19;;:6;:19;:::i;:::-;65251:6;:29;65243:66;;;;-1:-1:-1;;;65243:66:0;;25802:2:1;65243:66:0;;;25784:21:1;25841:2;25821:18;;;25814:30;25880:26;25860:18;;;25853:54;25924:18;;65243:66:0;25774:174:1;65243:66:0;65316:19;65338:30;65356:12;65338:15;:30;:::i;:::-;65316:52;;65380:64;65391:7;65400:8;;:15;;65417:1;65420:11;65433:10;65380:64;;;;;;;;;32900:25:1;;;32956:2;32941:18;;32934:34;;;;32999:2;32984:18;;32977:34;;;;33042:2;33027:18;;33020:34;-1:-1:-1;;;;;33091:55:1;33085:3;33070:19;;33063:84;32887:3;32872:19;;32854:299;65380:64:0;;;;;;;;64207:1243;;;;;;;;;;;;;;:::o;66659:760::-;66854:7;57661:1;58257:7;;:19;;58249:63;;;;-1:-1:-1;;;58249:63:0;;30244:2:1;58249:63:0;;;30226:21:1;30283:2;30263:18;;;30256:30;30322:33;30302:18;;;30295:61;30373:18;;58249:63:0;30216:181:1;58249:63:0;57661:1;58390:7;:18;-1:-1:-1;;;;;66878:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;66898:19:0;::::1;66912:4;66898:19;;66878:39;66870:48;;;::::0;::::1;;66925:4;-1:-1:-1::0;;;;;66925:12:0::1;;66945:9;66925:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;66988:17;67007::::0;67028:69:::1;67050:7;67059:3;67064:7;67073:8;67083:9;67094:2;67028:21;:69::i;:::-;66985:112;;;;;67129:17;67159:9;67149;:19;;;;:::i;:::-;67129:39:::0;-1:-1:-1;67179:14:0;;67175:214:::1;;67204:24;::::0;-1:-1:-1;;;67204:24:0;;::::1;::::0;::::1;31317:25:1::0;;;67204:4:0::1;-1:-1:-1::0;;;;;67204:13:0::1;::::0;::::1;::::0;31290:18:1;;67204:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67238:12;67264:2;-1:-1:-1::0;;;;;67256:16:0::1;67280:9;67256:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67237:57;;;67311:7;67303:78;;;::::0;-1:-1:-1;;;67303:78:0;;26898:2:1;67303:78:0::1;::::0;::::1;26880:21:1::0;26937:2;26917:18;;;26910:30;26976:34;26956:18;;;26949:62;27047:28;27027:18;;;27020:56;27093:19;;67303:78:0::1;26870:248:1::0;65684:699:0;65848:7;57661:1;58257:7;;:19;;58249:63;;;;-1:-1:-1;;;58249:63:0;;30244:2:1;58249:63:0;;;30226:21:1;30283:2;30263:18;;;30256:30;30322:33;30302:18;;;30295:61;30373:18;;58249:63:0;30216:181:1;58249:63:0;57661:1;58390:7;:18;-1:-1:-1;;;;;65872:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;65892:19:0;::::1;65906:4;65892:19;;65872:39;65864:48;;;::::0;::::1;;65919:4;-1:-1:-1::0;;;;;65919:12:0::1;;65939:9;65919:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;65961:17;65980::::0;66001:60:::1;66022:7;66031:3;66036:9;66047;66058:2;66001:20;:60::i;:::-;65958:103;;;;;66093:17;66123:9;66113;:19;;;;:::i;:::-;66093:39:::0;-1:-1:-1;66143:14:0;;66139:214:::1;;66168:24;::::0;-1:-1:-1;;;66168:24:0;;::::1;::::0;::::1;31317:25:1::0;;;66168:4:0::1;-1:-1:-1::0;;;;;66168:13:0::1;::::0;::::1;::::0;31290:18:1;;66168:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66202:12;66228:2;-1:-1:-1::0;;;;;66220:16:0::1;66244:9;66220:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66201:57;;;66275:7;66267:78;;;::::0;-1:-1:-1;;;66267:78:0;;26898:2:1;66267:78:0::1;::::0;::::1;26880:21:1::0;26937:2;26917:18;;;26910:30;26976:34;26956:18;;;26949:62;27047:28;27027:18;;;27020:56;27093:19;;66267:78:0::1;26870:248:1::0;66267:78:0::1;66139:214;;-1:-1:-1::0;57617:1:0;58569:22;;66368:9;65684:699;-1:-1:-1;;;;;;65684:699:0:o;63046:1155::-;63205:26;;-1:-1:-1;;;63205:26:0;;;;;31317:25:1;;;63153:8:0;;63137:13;;63205:11;-1:-1:-1;;;;;63205:17:0;;;;31290:18:1;;63205:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63175:57;;63239:20;63262:46;63288:10;63300:7;63262:25;:46::i;:::-;:70;;63315:17;;63262:70;;;63311:1;63262:70;63339:16;;63239:93;;-1:-1:-1;;;;;;63339:16:0;:32;63372:7;63381:10;61333:4;63381:5;:10;:::i;:::-;63339:79;;-1:-1:-1;;;;;;63339:79:0;;;;;;;;;;32419:25:1;;;;32460:18;;;32453:34;63393:10:0;32503:18:1;;;32496:83;32595:18;;;32588:34;;;32391:19;;63339:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63442:16:0;;:37;;-1:-1:-1;;;63442:37:0;;;;;31317:25:1;;;63425:14:0;;-1:-1:-1;;;;;63442:16:0;;:28;;31290:18:1;;63442:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63503:42;;-1:-1:-1;;;63503:42:0;;-1:-1:-1;;;;;17013:55:1;;;63503:42:0;;;16995:74:1;63425:54:0;;-1:-1:-1;63486:14:0;;63503:34;;;;;16968:18:1;;63503:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63579:16;;;63552:24;63579:16;;;;;;;;;63486:59;;-1:-1:-1;63552:43:0;63602:20;63625:5;-1:-1:-1;;;;;63625:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63602:43;-1:-1:-1;63669:8:0;63652:14;63691:176;63711:6;63707:1;:10;63691:176;;;63733:61;63752:12;63766:8;;63775:1;63766:11;;;;;-1:-1:-1;;;63766:11:0;;;;;;;;;;;;;;;63787:5;63733:18;:61::i;:::-;63803:56;63817:12;63839:5;63847:8;;63856:1;63847:11;;;;;-1:-1:-1;;;63847:11:0;;;;;;;;;;;;;;;63803:13;:56::i;:::-;63719:3;;;:::i;:::-;;;63691:176;;;-1:-1:-1;63873:48:0;;-1:-1:-1;;;63873:48:0;;-1:-1:-1;;;;;63873:12:0;;;;;:48;;63886:8;;;;63896:7;;63913:6;;63873:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63945:42:0;;-1:-1:-1;;;63945:42:0;;-1:-1:-1;;;;;17013:55:1;;;63945:42:0;;;16995:74:1;63928:14:0;;63945:34;;;;;;16968:18:1;;63945:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63928:59;-1:-1:-1;64021:10:0;61333:4;64021:5;:10;:::i;:::-;64012:19;;:6;:19;:::i;:::-;64002:6;:29;63994:66;;;;-1:-1:-1;;;63994:66:0;;25802:2:1;63994:66:0;;;25784:21:1;25841:2;25821:18;;;25814:30;25880:26;25860:18;;;25853:54;25924:18;;63994:66:0;25774:174:1;63994:66:0;64067:19;64089:30;64107:12;64089:15;:30;:::i;:::-;64131:64;;;32900:25:1;;;32956:2;32941:18;;32934:34;;;-1:-1:-1;32984:18:1;;;32977:34;33042:2;33027:18;;33020:34;;;64184:10:0;33085:3:1;33070:19;;33063:84;64131:64:0;;33020:34:1;;-1:-1:-1;64131:64:0;;;;;;32887:3:1;64131:64:0;;;63046:1155;;;;;;;;;;;;;:::o;60401:192::-;59734:10;59723:7;59549;59576:6;-1:-1:-1;;;;;59576:6:0;;59503:87;59723:7;-1:-1:-1;;;;;59723:21:0;;59715:66;;;;-1:-1:-1;;;59715:66:0;;28074:2:1;59715:66:0;;;28056:21:1;;;28093:18;;;28086:30;28152:34;28132:18;;;28125:62;28204:18;;59715:66:0;28046:182:1;59715:66:0;-1:-1:-1;;;;;60490:22:0;::::1;60482:73;;;::::0;-1:-1:-1;;;60482:73:0;;25395:2:1;60482:73:0::1;::::0;::::1;25377:21:1::0;25434:2;25414:18;;;25407:30;25473:34;25453:18;;;25446:62;25544:8;25524:18;;;25517:36;25570:19;;60482:73:0::1;25367:228:1::0;60482:73:0::1;60566:19;60576:8;60566:9;:19::i;52896:633::-:0;53277:10;;;53276:62;;-1:-1:-1;53293:39:0;;;;;53317:4;53293:39;;;17315:34:1;-1:-1:-1;;;;;17385:15:1;;;17365:18;;;17358:43;53293:15:0;;;;;17227:18:1;;53293:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;53276:62;53268:152;;;;-1:-1:-1;;;53268:152:0;;30604:2:1;53268:152:0;;;30586:21:1;30643:2;30623:18;;;30616:30;30682:34;30662:18;;;30655:62;30753:24;30733:18;;;30726:52;30795:19;;53268:152:0;30576:244:1;53268:152:0;53458:62;;-1:-1:-1;;;;;20985:55:1;;53458:62:0;;;20967:74:1;21057:18;;;21050:34;;;53431:90:0;;53451:5;;53481:22;;20940:18:1;;53458:62:0;;;;-1:-1:-1;;53458:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53458:62:0;-1:-1:-1;;;;;;53458:62:0;;;;;;;;;;53431:19;:90::i;:::-;52896:633;;;:::o;47242:195::-;47345:12;47377:52;47399:6;47407:4;47413:1;47416:12;47377:21;:52::i;:::-;47370:59;47242:195;-1:-1:-1;;;;47242:195:0:o;52411:216::-;52550:68;;-1:-1:-1;;;;;19587:15:1;;;52550:68:0;;;19569:34:1;19639:15;;19619:18;;;19612:43;19671:18;;;19664:34;;;52523:96:0;;52543:5;;-1:-1:-1;;;52573:27:0;19481:18:1;;52550:68:0;19463:241:1;52523:96:0;52411:216;;;;:::o;70069:860::-;70308:43;;-1:-1:-1;;;70308:43:0;;70345:4;70308:43;;;16995:74:1;70266:7:0;;;;;;-1:-1:-1;;;;;70308:11:0;:28;;;;16968:18:1;;70308:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70300:52;;;;;;70375:26;;-1:-1:-1;;;70375:26:0;;;;;31317:25:1;;;70359:13:0;;70375:11;-1:-1:-1;;;;;70375:17:0;;;;31290:18:1;;70375:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70359:42;;70459:20;70493:5;-1:-1:-1;;;;;70482:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70521:100;;;;;70459:55;;-1:-1:-1;;;;;;70521:55:0;;;;;:100;;70577:10;;70597:4;;70604:3;;70609:7;;70521:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70628:64:0;;-1:-1:-1;;;70628:64:0;;-1:-1:-1;;;;;20667:55:1;;;70628:64:0;;;20649:74:1;70687:4:0;20739:18:1;;;20732:50;70628:51:0;;;-1:-1:-1;70628:51:0;;-1:-1:-1;20622:18:1;;70628:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70721:36:0;;-1:-1:-1;;;70721:36:0;;70705:13;;-1:-1:-1;;;;;;70721:22:0;;;-1:-1:-1;70721:22:0;;:36;;70744:3;;70749:7;;70721:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70705:52;-1:-1:-1;70764:15:0;70783:12;61333:4;70705:52;70783:12;:::i;:::-;70764:32;;70855:68;70876:7;70885:5;70892:7;70901:9;70912:6;70920:2;70855:20;:68::i;:::-;70848:75;;;;;;;;;;70069:860;;;;;;;;;;:::o;69214:849::-;69422:43;;-1:-1:-1;;;69422:43:0;;69459:4;69422:43;;;16995:74:1;69380:7:0;;;;;;-1:-1:-1;;;;;69422:11:0;:28;;;;16968:18:1;;69422:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69414:52;;;;;;69489:26;;-1:-1:-1;;;69489:26:0;;;;;31317:25:1;;;69473:13:0;;69489:11;-1:-1:-1;;;;;69489:17:0;;;;31290:18:1;;69489:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69473:42;;69573:20;69607:5;-1:-1:-1;;;;;69596:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69652:10;;69573:55;;-1:-1:-1;69635:14:0;69669:148;69689:6;69685:1;:10;69669:148;;;69711:47;69730:12;69744:3;69748:1;69744:6;;;;;;-1:-1:-1;;;69744:6:0;;;;;;;;;;;;;;;69752:5;69711:18;:47::i;:::-;69767:42;69781:12;69795:5;69802:3;69806:1;69802:6;;;;;;-1:-1:-1;;;69802:6:0;;;;;;;;;;;;;;;69767:13;:42::i;:::-;69697:3;;;;:::i;:::-;;;;69669:148;;;-1:-1:-1;69855:37:0;;-1:-1:-1;;;69855:37:0;;69823:25;;-1:-1:-1;;;;;69855:22:0;;;;;:37;;69878:3;;69823:25;;69855:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;69899:15:0;69917:13;61333:4;69917:6;:13;:::i;:::-;69899:31;;69989:68;70010:7;70019:5;70026:7;70035:9;70046:6;70054:2;69989:20;:68::i;:::-;69982:75;;;;;;;;;;;69214:849;;;;;;;;;:::o;60601:173::-;60657:16;60676:6;;-1:-1:-1;;;;;60693:17:0;;;-1:-1:-1;;60693:17:0;;;;;;60726:40;;60676:6;;;;;;;60726:40;;60657:16;60726:40;60601:173;;:::o;52215:188::-;52336:58;;-1:-1:-1;;;;;20985:55:1;;52336:58:0;;;20967:74:1;21057:18;;;21050:34;;;52309:86:0;;52329:5;;-1:-1:-1;;;52359:23:0;20940:18:1;;52336:58:0;20922:168:1;72161:1303:0;72279:42;72344;72393:17;-1:-1:-1;;;;;72421:20:0;;;;72417:921;;;72488:89;;72553:10;72488:89;;;19569:34:1;-1:-1:-1;;;;;19639:15:1;;19619:18;;;19612:43;19671:18;;;19664:34;;;19481:18;;72488:89:0;;;-1:-1:-1;;72488:89:0;;;;;;;;;;;;;;-1:-1:-1;;;;;72488:89:0;-1:-1:-1;;;72488:89:0;;;;-1:-1:-1;72417:921:0;;;72608:5;-1:-1:-1;;;;;72595:18:0;:9;-1:-1:-1;;;;;72595:18:0;;72591:747;;;72710:31;72799:7;72744:63;;;;;;31317:25:1;;31305:2;31290:18;;31272:76;72744:63:0;;;;-1:-1:-1;;72744:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;72744:63:0;;;;;72861:49;72744:63;;-1:-1:-1;;;;;;;;;;72861:29:0;;;:49;;72744:63;;72861:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72818:92;;;;72922:16;72953:6;72942:29;;;;;;;;;;;;:::i;:::-;72921:50;;72990:12;:38;;;;-1:-1:-1;;;;;;73006:22:0;;73018:10;73006:22;72990:38;72982:68;;;;-1:-1:-1;;;72982:68:0;;31027:2:1;72982:68:0;;;31009:21:1;31066:2;31046:18;;;31039:30;31105:19;31085:18;;;31078:47;31142:18;;72982:68:0;30999:167:1;72982:68:0;73068:52;;;;;31317:25:1;;;31290:18;;73068:52:0;;;-1:-1:-1;;73068:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73068:52:0;;;;;;-1:-1:-1;72591:747:0;;-1:-1:-1;;;;72591:747:0;;73237:93;;73306:10;73237:93;;;19569:34:1;-1:-1:-1;;;;;19639:15:1;;19619:18;;;19612:43;19671:18;;;19664:34;;;19481:18;;73237:93:0;;;-1:-1:-1;;73237:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73237:93:0;;;;;;-1:-1:-1;72591:747:0;73345:12;73359:23;73394:9;-1:-1:-1;;;;;73386:23:0;73410:4;73386:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73344:71;;;;73430:7;73446:10;73422:36;;;;;-1:-1:-1;;;73422:36:0;;;;;;;;:::i;:::-;;72161:1303;;;;;;;;:::o;73470:849::-;73583:42;73648;73697:17;-1:-1:-1;;;;;73725:20:0;;;;73721:472;;;73924:7;;;73470:849;;;:::o;73721:472::-;73961:5;-1:-1:-1;;;;;73948:18:0;:9;-1:-1:-1;;;;;73948:18:0;;73944:249;;;74011:93;;;;;32006:25:1;;;74098:1:0;32047:18:1;;;32040:45;-1:-1:-1;;;;;32121:55:1;;32101:18;;;32094:83;31979:18;;74011:93:0;;;-1:-1:-1;;74011:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;74011:93:0;;;;;;-1:-1:-1;73944:249:0;;;74179:7;;;73470:849;;;:::o;54704:772::-;55139:23;55165:69;55193:4;55165:69;;;;;;;;;;;;;;;;;55173:5;-1:-1:-1;;;;;55165:27:0;;;:69;;;;;:::i;:::-;55249:17;;55139:95;;-1:-1:-1;55249:21:0;55245:224;;55391:10;55380:30;;;;;;;;;;;;:::i;:::-;55372:85;;;;-1:-1:-1;;;55372:85:0;;29833:2:1;55372:85:0;;;29815:21:1;29872:2;29852:18;;;29845:30;29911:34;29891:18;;;29884:62;29982:12;29962:18;;;29955:40;30012:19;;55372:85:0;29805:232:1;48294:530:0;48421:12;48479:5;48454:21;:30;;48446:81;;;;-1:-1:-1;;;48446:81:0;;27325:2:1;48446:81:0;;;27307:21:1;27364:2;27344:18;;;27337:30;27403:34;27383:18;;;27376:62;27474:8;27454:18;;;27447:36;27500:19;;48446:81:0;27297:228:1;48446:81:0;44691:20;;48538:60;;;;-1:-1:-1;;;48538:60:0;;28435:2:1;48538:60:0;;;28417:21:1;28474:2;28454:18;;;28447:30;28513:31;28493:18;;;28486:59;28562:18;;48538:60:0;28407:179:1;48538:60:0;48672:12;48686:23;48713:6;-1:-1:-1;;;;;48713:11:0;48733:5;48741:4;48713:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48671:75;;;;48764:52;48782:7;48791:10;48803:12;48764:17;:52::i;70935:1220::-;71121:7;;;71182:70;-1:-1:-1;;;;;71182:36:0;;71227:11;71241:10;71182:36;:70::i;:::-;71321:193;;;;;-1:-1:-1;;;;;20131:15:1;;;71321:193:0;;;20113:34:1;71385:4:0;20183:15:1;;20163:18;;;20156:43;20215:18;;;20208:34;;;20258:18;;;20251:34;;;20301:19;;;20294:35;;;20345:19;;;20338:35;;;71478:4:0;20389:19:1;;;20382:44;71492:15:0;20442:19:1;;;20435:35;-1:-1:-1;;;;;;71321:11:0;:24;;;;;;20024:19:1;;71321:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71630:9;;71259:255;;-1:-1:-1;71259:255:0;;-1:-1:-1;71259:255:0;-1:-1:-1;71561:91:0;;-1:-1:-1;;;;;71630:9:0;71259:255;71579:29;71587:5;71602:4;71579:7;:29::i;:::-;-1:-1:-1;;;;;71561:60:0;;:91;:60;:91::i;:::-;71659:20;71682:46;71708:10;71720:7;71682:25;:46::i;:::-;:63;;71735:10;;71682:63;;;71731:1;71682:63;71659:86;;71752:9;;;;;;;;;-1:-1:-1;;;;;71752:9:0;-1:-1:-1;;;;;71752:28:0;;71781:7;71790:2;71794:9;71805:12;71752:66;;;;;;;;;;;;;;;;;31584:25:1;;;-1:-1:-1;;;;;31645:55:1;;;;31640:2;31625:18;;31618:83;31732:2;31717:18;;31710:34;31775:2;31760:18;;31753:34;31571:3;31556:19;;31538:255;71752:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71831:17;71862:11;71851:10;:22;;;;:::i;:::-;71831:42;-1:-1:-1;71884:14:0;;71880:89;;71909:52;-1:-1:-1;;;;;71909:37:0;;71947:2;71951:9;71909:37;:52::i;:::-;71977:19;71999:30;72017:12;71999:15;:30;:::i;:::-;71977:52;;72041:59;72052:7;72061:10;72073:9;72084:11;72097:2;72041:59;;;;;;;;;32900:25:1;;;32956:2;32941:18;;32934:34;;;;32999:2;32984:18;;32977:34;;;;33042:2;33027:18;;33020:34;-1:-1:-1;;;;;33091:55:1;33085:3;33070:19;;33063:84;32887:3;32872:19;;32854:299;72041:59:0;;;;;;;;-1:-1:-1;72115:11:0;;72128:9;;-1:-1:-1;72139:9:0;;-1:-1:-1;70935:1220:0;;-1:-1:-1;;;;;;;;;70935:1220:0:o;50834:742::-;50949:12;50978:7;50974:595;;;-1:-1:-1;51009:10:0;51002:17;;50974:595;51123:17;;:21;51119:439;;51386:10;51380:17;51447:15;51434:10;51430:2;51426:19;51419:44;51334:148;51529:12;51522:20;;-1:-1:-1;;;51522:20:0;;;;;;;;:::i;74407:429::-;74479:12;74501:14;74517;74535:26;74546:6;74554;74535:10;:26::i;:::-;74500:61;;;;74650:11;-1:-1:-1;;;;;74650:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74690:32;;-1:-1:-1;;15555:2:1;15551:15;;;15547:24;;74690:32:0;;;15535:37:1;15606:15;;;15602:24;15588:12;;;15581:46;15643:12;;74690:32:0;;;;;;;;;;;;74680:43;;;;;;74609:217;;;;;;;;16316:66:1;16304:79;;16420:2;16416:15;;;;-1:-1:-1;;16412:53:1;16408:1;16399:11;;16392:74;16491:2;16482:12;;16475:28;16533:66;16528:2;16519:12;;16512:88;16625:2;16616:12;;16294:340;74609:217:0;;;;-1:-1:-1;;74609:217:0;;;;;;;;;74599:228;;74609:217;74599:228;;;;;74407:429;-1:-1:-1;;;;;74407:429:0:o;74941:341::-;75016:14;75032;75075:6;-1:-1:-1;;;;;75065:16:0;:6;-1:-1:-1;;;;;75065:16:0;;;75057:66;;;;-1:-1:-1;;;75057:66:0;;26492:2:1;75057:66:0;;;26474:21:1;26531:2;26511:18;;;26504:30;26570:34;26550:18;;;26543:62;26641:7;26621:18;;;26614:35;26666:19;;75057:66:0;26464:227:1;75057:66:0;75160:6;-1:-1:-1;;;;;75151:15:0;:6;-1:-1:-1;;;;;75151:15:0;;:53;;75189:6;75197;75151:53;;;75170:6;75178;75151:53;75132:72;;-1:-1:-1;75132:72:0;-1:-1:-1;;;;;;75221:20:0;;75213:63;;;;-1:-1:-1;;;75213:63:0;;29474:2:1;75213:63:0;;;29456:21:1;29513:2;29493:18;;;29486:30;29552:32;29532:18;;;29525:60;29602:18;;75213:63:0;29446:180:1;75213:63:0;74941:341;;;;;:::o;14:395:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;414:743;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:550::-;1204:5;1257:3;1250:4;1242:6;1238:17;1234:27;1224:2;;1279:5;1272;1265:20;1224:2;1319:6;1306:20;1345:18;1341:2;1338:26;1335:2;;;1367:18;;:::i;:::-;1411:55;1454:2;1435:13;;-1:-1:-1;;1431:27:1;1460:4;1427:38;1411:55;:::i;:::-;1491:2;1482:7;1475:19;1537:3;1530:4;1525:2;1517:6;1513:15;1509:26;1506:35;1503:2;;;1558:5;1551;1544:20;1503:2;1627;1620:4;1612:6;1608:17;1601:4;1592:7;1588:18;1575:55;1650:16;;;1668:4;1646:27;1639:42;;;;1654:7;1214:498;-1:-1:-1;;1214:498:1:o;1717:257::-;1776:6;1829:2;1817:9;1808:7;1804:23;1800:32;1797:2;;;1850:6;1842;1835:22;1797:2;1894:9;1881:23;1913:31;1938:5;1913:31;:::i;1979:261::-;2049:6;2102:2;2090:9;2081:7;2077:23;2073:32;2070:2;;;2123:6;2115;2108:22;2070:2;2160:9;2154:16;2179:31;2204:5;2179:31;:::i;2519:1111::-;2673:6;2681;2689;2697;2705;2758:3;2746:9;2737:7;2733:23;2729:33;2726:2;;;2780:6;2772;2765:22;2726:2;2824:9;2811:23;2843:31;2868:5;2843:31;:::i;:::-;2893:5;-1:-1:-1;2950:2:1;2935:18;;2922:32;2963:33;2922:32;2963:33;:::i;:::-;3015:7;-1:-1:-1;3073:2:1;3058:18;;3045:32;3096:18;3126:14;;;3123:2;;;3158:6;3150;3143:22;3123:2;3186:61;3239:7;3230:6;3219:9;3215:22;3186:61;:::i;:::-;3176:71;;3300:2;3289:9;3285:18;3272:32;3256:48;;3329:2;3319:8;3316:16;3313:2;;;3350:6;3342;3335:22;3313:2;3378:63;3433:7;3422:8;3411:9;3407:24;3378:63;:::i;:::-;3368:73;;3494:3;3483:9;3479:19;3466:33;3450:49;;3524:2;3514:8;3511:16;3508:2;;;3545:6;3537;3530:22;3508:2;;3573:51;3616:7;3605:8;3594:9;3590:24;3573:51;:::i;:::-;3563:61;;;2716:914;;;;;;;;:::o;3635:685::-;3730:6;3738;3746;3754;3807:3;3795:9;3786:7;3782:23;3778:33;3775:2;;;3829:6;3821;3814:22;3775:2;3873:9;3860:23;3892:31;3917:5;3892:31;:::i;:::-;3942:5;-1:-1:-1;3999:2:1;3984:18;;3971:32;4012:33;3971:32;4012:33;:::i;:::-;4064:7;-1:-1:-1;4118:2:1;4103:18;;4090:32;;-1:-1:-1;4173:2:1;4158:18;;4145:32;4200:18;4189:30;;4186:2;;;4237:6;4229;4222:22;4186:2;4265:49;4306:7;4297:6;4286:9;4282:22;4265:49;:::i;:::-;4255:59;;;3765:555;;;;;;;:::o;4325:754::-;4429:6;4437;4445;4453;4461;4514:3;4502:9;4493:7;4489:23;4485:33;4482:2;;;4536:6;4528;4521:22;4482:2;4580:9;4567:23;4599:31;4624:5;4599:31;:::i;:::-;4649:5;-1:-1:-1;4706:2:1;4691:18;;4678:32;4719:33;4678:32;4719:33;:::i;:::-;4771:7;-1:-1:-1;4825:2:1;4810:18;;4797:32;;-1:-1:-1;4876:2:1;4861:18;;4848:32;;-1:-1:-1;4931:3:1;4916:19;;4903:33;4959:18;4948:30;;4945:2;;;4996:6;4988;4981:22;4945:2;5024:49;5065:7;5056:6;5045:9;5041:22;5024:49;:::i;5084:325::-;5152:6;5160;5213:2;5201:9;5192:7;5188:23;5184:32;5181:2;;;5234:6;5226;5219:22;5181:2;5278:9;5265:23;5297:31;5322:5;5297:31;:::i;:::-;5347:5;5399:2;5384:18;;;;5371:32;;-1:-1:-1;;;5171:238:1:o;5414:297::-;5481:6;5534:2;5522:9;5513:7;5509:23;5505:32;5502:2;;;5555:6;5547;5540:22;5502:2;5592:9;5586:16;5645:5;5638:13;5631:21;5624:5;5621:32;5611:2;;5672:6;5664;5657:22;5716:352;5774:6;5827:2;5815:9;5806:7;5802:23;5798:32;5795:2;;;5848:6;5840;5833:22;5795:2;5892:9;5879:23;-1:-1:-1;;;;;;5935:5:1;5931:78;5924:5;5921:89;5911:2;;6029:6;6021;6014:22;6073:190;6132:6;6185:2;6173:9;6164:7;6160:23;6156:32;6153:2;;;6206:6;6198;6191:22;6153:2;-1:-1:-1;6234:23:1;;6143:120;-1:-1:-1;6143:120:1:o;6268:194::-;6338:6;6391:2;6379:9;6370:7;6366:23;6362:32;6359:2;;;6412:6;6404;6397:22;6359:2;-1:-1:-1;6440:16:1;;6349:113;-1:-1:-1;6349:113:1:o;6467:525::-;6562:6;6570;6578;6631:2;6619:9;6610:7;6606:23;6602:32;6599:2;;;6652:6;6644;6637:22;6599:2;6693:9;6680:23;6670:33;;6754:2;6743:9;6739:18;6726:32;6781:18;6773:6;6770:30;6767:2;;;6818:6;6810;6803:22;6767:2;6862:70;6924:7;6915:6;6904:9;6900:22;6862:70;:::i;:::-;6589:403;;6951:8;;-1:-1:-1;6836:96:1;;-1:-1:-1;;;;6589:403:1:o;6997:871::-;7128:6;7136;7144;7152;7160;7213:2;7201:9;7192:7;7188:23;7184:32;7181:2;;;7234:6;7226;7219:22;7181:2;7275:9;7262:23;7252:33;;7336:2;7325:9;7321:18;7308:32;7359:18;7400:2;7392:6;7389:14;7386:2;;;7421:6;7413;7406:22;7386:2;7465:70;7527:7;7518:6;7507:9;7503:22;7465:70;:::i;:::-;7554:8;;-1:-1:-1;7439:96:1;-1:-1:-1;7642:2:1;7627:18;;7614:32;;-1:-1:-1;7658:16:1;;;7655:2;;;7692:6;7684;7677:22;7655:2;;7736:72;7800:7;7789:8;7778:9;7774:24;7736:72;:::i;:::-;7171:697;;;;-1:-1:-1;7171:697:1;;-1:-1:-1;7827:8:1;;7710:98;7171:697;-1:-1:-1;;;7171:697:1:o;7873:940::-;8013:6;8021;8029;8037;8045;8053;8106:3;8094:9;8085:7;8081:23;8077:33;8074:2;;;8128:6;8120;8113:22;8074:2;8169:9;8156:23;8146:33;;8230:2;8219:9;8215:18;8202:32;8253:18;8294:2;8286:6;8283:14;8280:2;;;8315:6;8307;8300:22;8280:2;8359:70;8421:7;8412:6;8401:9;8397:22;8359:70;:::i;:::-;8448:8;;-1:-1:-1;8333:96:1;-1:-1:-1;8536:2:1;8521:18;;8508:32;;-1:-1:-1;8552:16:1;;;8549:2;;;8586:6;8578;8571:22;8549:2;;8630:72;8694:7;8683:8;8672:9;8668:24;8630:72;:::i;:::-;8064:749;;;;-1:-1:-1;8064:749:1;;;;;8803:2;8788:18;;;8775:32;;8064:749;-1:-1:-1;;;;8064:749:1:o;8818:593::-;8922:6;8930;8938;8946;8999:2;8987:9;8978:7;8974:23;8970:32;8967:2;;;9020:6;9012;9005:22;8967:2;9061:9;9048:23;9038:33;;9122:2;9111:9;9107:18;9094:32;9149:18;9141:6;9138:30;9135:2;;;9186:6;9178;9171:22;9135:2;9230:70;9292:7;9283:6;9272:9;9268:22;9230:70;:::i;:::-;8957:454;;9319:8;;-1:-1:-1;9204:96:1;;9401:2;9386:18;9373:32;;8957:454;-1:-1:-1;;;;8957:454:1:o;9416:662::-;9529:6;9537;9545;9553;9561;9614:3;9602:9;9593:7;9589:23;9585:33;9582:2;;;9636:6;9628;9621:22;9582:2;9677:9;9664:23;9654:33;;9738:2;9727:9;9723:18;9710:32;9765:18;9757:6;9754:30;9751:2;;;9802:6;9794;9787:22;9751:2;9846:70;9908:7;9899:6;9888:9;9884:22;9846:70;:::i;:::-;9572:506;;9935:8;;-1:-1:-1;9820:96:1;;10017:2;10002:18;;9989:32;;10068:2;10053:18;;;10040:32;;-1:-1:-1;9572:506:1;-1:-1:-1;;;;9572:506:1:o;10083:898::-;10228:6;10236;10244;10252;10260;10313:3;10301:9;10292:7;10288:23;10284:33;10281:2;;;10335:6;10327;10320:22;10281:2;10376:9;10363:23;10353:33;;10437:2;10426:9;10422:18;10409:32;10460:18;10501:2;10493:6;10490:14;10487:2;;;10522:6;10514;10507:22;10487:2;10550:61;10603:7;10594:6;10583:9;10579:22;10550:61;:::i;:::-;10540:71;;10664:2;10653:9;10649:18;10636:32;10620:48;;10693:2;10683:8;10680:16;10677:2;;;10714:6;10706;10699:22;10677:2;;10742:63;10797:7;10786:8;10775:9;10771:24;10742:63;:::i;:::-;10732:73;;;10852:2;10841:9;10837:18;10824:32;10814:42;;10906:3;10895:9;10891:19;10878:33;10920:31;10945:5;10920:31;:::i;:::-;10970:5;10960:15;;;10271:710;;;;;;;;:::o;10986:831::-;11131:6;11139;11147;11155;11163;11216:3;11204:9;11195:7;11191:23;11187:33;11184:2;;;11238:6;11230;11223:22;11184:2;11279:9;11266:23;11256:33;;11340:2;11329:9;11325:18;11312:32;11363:18;11404:2;11396:6;11393:14;11390:2;;;11425:6;11417;11410:22;11390:2;11453:61;11506:7;11497:6;11486:9;11482:22;11453:61;:::i;:::-;11443:71;;11567:2;11556:9;11552:18;11539:32;11523:48;;11596:2;11586:8;11583:16;11580:2;;;11617:6;11609;11602:22;11580:2;;11645:63;11700:7;11689:8;11678:9;11674:24;11645:63;:::i;:::-;11174:643;;;;-1:-1:-1;11635:73:1;;11755:2;11740:18;;11727:32;;-1:-1:-1;11806:3:1;11791:19;11778:33;;11174:643;-1:-1:-1;;;11174:643:1:o;11822:967::-;11976:6;11984;11992;12000;12008;12016;12069:3;12057:9;12048:7;12044:23;12040:33;12037:2;;;12091:6;12083;12076:22;12037:2;12132:9;12119:23;12109:33;;12193:2;12182:9;12178:18;12165:32;12216:18;12257:2;12249:6;12246:14;12243:2;;;12278:6;12270;12263:22;12243:2;12306:61;12359:7;12350:6;12339:9;12335:22;12306:61;:::i;:::-;12296:71;;12420:2;12409:9;12405:18;12392:32;12376:48;;12449:2;12439:8;12436:16;12433:2;;;12470:6;12462;12455:22;12433:2;;12498:63;12553:7;12542:8;12531:9;12527:24;12498:63;:::i;:::-;12488:73;;;12608:2;12597:9;12593:18;12580:32;12570:42;;12659:3;12648:9;12644:19;12631:33;12621:43;;12714:3;12703:9;12699:19;12686:33;12728:31;12753:5;12728:31;:::i;:::-;12778:5;12768:15;;;12027:762;;;;;;;;:::o;12794:640::-;12905:6;12913;12921;12929;12982:3;12970:9;12961:7;12957:23;12953:33;12950:2;;;13004:6;12996;12989:22;12950:2;13045:9;13032:23;13022:33;;13106:2;13095:9;13091:18;13078:32;13133:18;13125:6;13122:30;13119:2;;;13170:6;13162;13155:22;13119:2;13198:61;13251:7;13242:6;13231:9;13227:22;13198:61;:::i;:::-;13188:71;;;13306:2;13295:9;13291:18;13278:32;13268:42;;13360:2;13349:9;13345:18;13332:32;13373:31;13398:5;13373:31;:::i;:::-;12940:494;;;;-1:-1:-1;12940:494:1;;-1:-1:-1;;12940:494:1:o;13439:709::-;13559:6;13567;13575;13583;13591;13644:3;13632:9;13623:7;13619:23;13615:33;13612:2;;;13666:6;13658;13651:22;13612:2;13707:9;13694:23;13684:33;;13768:2;13757:9;13753:18;13740:32;13795:18;13787:6;13784:30;13781:2;;;13832:6;13824;13817:22;13781:2;13860:61;13913:7;13904:6;13893:9;13889:22;13860:61;:::i;:::-;13850:71;;;13968:2;13957:9;13953:18;13940:32;13930:42;;14019:2;14008:9;14004:18;13991:32;13981:42;;14073:3;14062:9;14058:19;14045:33;14087:31;14112:5;14087:31;:::i;14153:316::-;14241:6;14249;14257;14310:2;14298:9;14289:7;14285:23;14281:32;14278:2;;;14331:6;14323;14316:22;14278:2;14365:9;14359:16;14349:26;;14415:2;14404:9;14400:18;14394:25;14384:35;;14459:2;14448:9;14444:18;14438:25;14428:35;;14268:201;;;;;:::o;14474:407::-;14574:6;14569:3;14562:19;14544:3;14604:66;14596:6;14593:78;14590:2;;;14686:3;14681;14674:16;14590:2;14724:6;14721:1;14717:14;14776:8;14769:5;14762:4;14757:3;14753:14;14740:45;14808:18;;;;14828:4;14804:29;14842:15;;;-1:-1:-1;14804:29:1;;14552:329;-1:-1:-1;14552:329:1:o;14886:437::-;14939:3;14977:5;14971:12;15004:6;14999:3;14992:19;15030:4;15059:2;15054:3;15050:12;15043:19;;15096:2;15089:5;15085:14;15117:3;15129:169;15143:6;15140:1;15137:13;15129:169;;;15204:13;;15192:26;;15238:12;;;;15273:15;;;;15165:1;15158:9;15129:169;;;-1:-1:-1;15314:3:1;;14947:376;-1:-1:-1;;;;;14947:376:1:o;15666:274::-;15795:3;15833:6;15827:13;15849:53;15895:6;15890:3;15883:4;15875:6;15871:17;15849:53;:::i;:::-;15918:16;;;;;15803:137;-1:-1:-1;;15803:137:1:o;17412:969::-;17808:4;-1:-1:-1;;;;;17918:2:1;17910:6;17906:15;17895:9;17888:34;17970:2;17962:6;17958:15;17953:2;17942:9;17938:18;17931:43;;18010:3;18005:2;17994:9;17990:18;17983:31;18037:74;18106:3;18095:9;18091:19;18083:6;18075;18037:74;:::i;:::-;18159:9;18151:6;18147:22;18142:2;18131:9;18127:18;18120:50;18193:61;18247:6;18239;18231;18193:61;:::i;:::-;18291:22;;;18285:3;18270:19;;;18263:51;;;;-1:-1:-1;18323:20:1;;18372:2;18360:15;;17817:564;-1:-1:-1;;;;;;17817:564:1:o;18386:915::-;18762:4;-1:-1:-1;;;;;18872:2:1;18864:6;18860:15;18849:9;18842:34;18924:2;18916:6;18912:15;18907:2;18896:9;18892:18;18885:43;;18964:3;18959:2;18948:9;18944:18;18937:31;18991:57;19043:3;19032:9;19028:19;19020:6;18991:57;:::i;:::-;19096:9;19088:6;19084:22;19079:2;19068:9;19064:18;19057:50;19130:44;19167:6;19159;19130:44;:::i;:::-;19211:22;;;19205:3;19190:19;;;19183:51;;;;-1:-1:-1;19243:20:1;;19292:2;19280:15;;18771:530;-1:-1:-1;;;;18771:530:1:o;21095:639::-;21400:2;21389:9;21382:21;21363:4;21426:73;21495:2;21484:9;21480:18;21472:6;21464;21426:73;:::i;:::-;21547:9;21539:6;21535:22;21530:2;21519:9;21515:18;21508:50;21575:61;21629:6;21621;21613;21575:61;:::i;:::-;21567:69;;;-1:-1:-1;;;;;21676:6:1;21672:55;21667:2;21656:9;21652:18;21645:83;21372:362;;;;;;;;:::o;21739:612::-;22034:2;22023:9;22016:21;21997:4;22060:73;22129:2;22118:9;22114:18;22106:6;22098;22060:73;:::i;:::-;22181:9;22173:6;22169:22;22164:2;22153:9;22149:18;22142:50;22209:44;22246:6;22238;22209:44;:::i;:::-;22201:52;;;-1:-1:-1;;;;;22293:6:1;22289:55;22284:2;22273:9;22269:18;22262:83;22006:345;;;;;;;:::o;22356:465::-;22613:2;22602:9;22595:21;22576:4;22639:56;22691:2;22680:9;22676:18;22668:6;22639:56;:::i;:::-;22743:9;22735:6;22731:22;22726:2;22715:9;22711:18;22704:50;22771:44;22808:6;22800;22771:44;:::i;24805:383::-;24954:2;24943:9;24936:21;24917:4;24986:6;24980:13;25029:6;25024:2;25013:9;25009:18;25002:34;25045:66;25104:6;25099:2;25088:9;25084:18;25079:2;25071:6;25067:15;25045:66;:::i;:::-;25172:2;25151:15;-1:-1:-1;;25147:29:1;25132:45;;;;25179:2;25128:54;;24926:262;-1:-1:-1;;24926:262:1:o;33675:275::-;33746:2;33740:9;33811:2;33792:13;;-1:-1:-1;;33788:27:1;33776:40;;33846:18;33831:34;;33867:22;;;33828:62;33825:2;;;33893:18;;:::i;:::-;33929:2;33922:22;33720:230;;-1:-1:-1;33720:230:1:o;33955:128::-;33995:3;34026:1;34022:6;34019:1;34016:13;34013:2;;;34032:18;;:::i;:::-;-1:-1:-1;34068:9:1;;34003:80::o;34088:168::-;34128:7;34194:1;34190;34186:6;34182:14;34179:1;34176:21;34171:1;34164:9;34157:17;34153:45;34150:2;;;34201:18;;:::i;:::-;-1:-1:-1;34241:9:1;;34140:116::o;34261:125::-;34301:4;34329:1;34326;34323:8;34320:2;;;34334:18;;:::i;:::-;-1:-1:-1;34371:9:1;;34310:76::o;34391:258::-;34463:1;34473:113;34487:6;34484:1;34481:13;34473:113;;;34563:11;;;34557:18;34544:11;;;34537:39;34509:2;34502:10;34473:113;;;34604:6;34601:1;34598:13;34595:2;;;-1:-1:-1;;34639:1:1;34621:16;;34614:27;34444:205::o;34654:135::-;34693:3;-1:-1:-1;;34714:17:1;;34711:2;;;34734:18;;:::i;:::-;-1:-1:-1;34781:1:1;34770:13;;34701:88::o;34794:184::-;-1:-1:-1;;;34843:1:1;34836:88;34943:4;34940:1;34933:15;34967:4;34964:1;34957:15;34983:184;-1:-1:-1;;;35032:1:1;35025:88;35132:4;35129:1;35122:15;35156:4;35153:1;35146:15;35172:154;-1:-1:-1;;;;;35251:5:1;35247:54;35240:5;35237:65;35227:2;;35316:1;35313;35306:12
Swarm Source
ipfs://c98eedd6f8b76ad239439fff47c722651221d8cc2d5fecc66bff66cc6e4765bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.