Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60808060 | 16550113 | 651 days ago | IN | 0 ETH | 0.1314439 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SweepersTokenV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; import { ERC721CheckpointableUpgradeable } from './base/ERC721CheckpointableUpgradeable.sol'; import { ISweepersDescriptor } from './interfaces/ISweepersDescriptor.sol'; import { ISweepersSeeder } from './interfaces/ISweepersSeeder.sol'; import { ISweepersToken } from './interfaces/ISweepersToken.sol'; import { ISweepersTokenV1 } from './interfaces/ISweepersTokenV1.sol'; import { ERC721Upgradeable } from './base/ERC721Upgradeable.sol'; import { IERC721Upgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol'; import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol'; import { IERC721ReceiverUpgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol'; import { IProxyRegistry } from './external/opensea/IProxyRegistry.sol'; import { IDust } from './interfaces/IDust.sol'; contract SweepersTokenV2 is ISweepersToken, OwnableUpgradeable, ERC721CheckpointableUpgradeable, IERC721ReceiverUpgradeable, ReentrancyGuardUpgradeable { // The sweepersTreasury address address public sweepersTreasury; // An address who has permissions to mint Sweepers address public minter; // The Sweepers token URI descriptor ISweepersDescriptor public descriptor; // The Sweepers token seeder ISweepersSeeder public seeder; // The Sweepers V1 token ISweepersTokenV1 public sweepersV1; // The sweeper seeds mapping(uint256 => ISweepersSeeder.Seed) public override seeds; // The internal sweeper ID tracker uint256 private _currentSweeperId; // IPFS content hash of contract-level metadata string private _contractURIHash; // OpenSea's Proxy Registry IProxyRegistry public proxyRegistry; // The Dust token IDust private DUST; // The base amount of Dust earned per day per Sweeper uint256 public dailyDust; // The timestamp that rewards will end (if/when applicable) uint80 private rewardEnd; // The total number of Sweepers staked in the garage uint256 public sweepersInGarage; // Mapping of background seed to the multiplier rate mapping(uint8 => uint16) public multiplier; // Mapping of an address to their staked Sweeper info mapping(address => stakedNFT) public StakedNFTInfo; // address to struct // Mapping of an address to the total number of Sweepers that they have staked mapping(address => uint256) public userStakedSweepers; // Address which will call to unstake if NFT is listed on a marketplace while staked mapping(address => bool) private remover; // Address which will receive the penalty fee to recoup the tx fee of removing the stake address payable public PenaltyReceiver; // Mapping of an address to their penalty info from being removed mapping(address => unstakeEarnings) public penaltyEarnings; // Mapping of an address to the number of times they have been removed from the garage mapping(address => uint16) public timesRemoved; // Mapping of an address to whether they are currently blocked from the garage mapping(address => bool) public blockedFromGarage; // The number of times that someone is allowed to be removed from the garage before being blocked uint256 public allowedTimesRemoved; // The static penalty to be assessed if useCalculatedPenalty is false uint256 public penalty; // The adjuster to be applied to a calculated penalty amount as the calculation will always be inherently short uint8 public penaltyAdjuster; // Whether to use calculated penalties or the static penalty amount bool public useCalculatedPenalty; /** * @notice Require that the sender is the sweepers Treasury. */ modifier onlySweepersTreasury() { require(msg.sender == sweepersTreasury); _; } /** * @notice Require that the sender is the minter. */ modifier onlyMinter() { require(msg.sender == minter); _; } /** * @notice Require that the sender is a remover. */ modifier onlyRemover() { require(remover[msg.sender]); _; } function initialize( address _sweepersTreasury, address _minter, address _descriptor, address _seeder, address _proxyRegistry, address _sweepersV1, uint256 __currentSweeperId, address _dust ) external initializer { __ERC721_init("Sweepers", "SWEEPER"); __Ownable_init(); __ReentrancyGuard_init(); sweepersTreasury = _sweepersTreasury; minter = _minter; descriptor = ISweepersDescriptor(_descriptor); seeder = ISweepersSeeder(_seeder); proxyRegistry = IProxyRegistry(_proxyRegistry); sweepersV1 = ISweepersTokenV1(_sweepersV1); _currentSweeperId = __currentSweeperId; _contractURIHash = 'QmeaKx7er3tEgmc4vfCAu9Jus9yVWV8KMydpmbupSKSuJ1'; dailyDust = 10*10**18; DUST = IDust(_dust); penaltyAdjuster = 110; useCalculatedPenalty = true; } /** * @notice The IPFS URI of contract-level metadata. */ function contractURI() public view returns (string memory) { return string(abi.encodePacked('ipfs://', _contractURIHash)); } /** * @notice Set the _contractURIHash. * @dev Only callable by the owner. */ function setContractURIHash(string memory newContractURIHash) external onlyOwner { _contractURIHash = newContractURIHash; } /** * @notice Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override(ERC721Upgradeable, IERC721Upgradeable) returns (bool) { // Whitelist OpenSea proxy contract for easy trading. if (proxyRegistry.proxies(owner) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * @notice Mint a Sweeper to the minter. * @dev Call _mintTo with the to address(es). */ function mint() public override onlyMinter returns (uint256) { return _mintTo(minter, _currentSweeperId++); } /** * @notice Burn a sweeper. */ function burn(uint256 sweeperId) public override onlyMinter { _burn(sweeperId); emit SweeperBurned(sweeperId); } /** * @notice Dev manually migrate a single sweeper. * @dev Does not burn V1 Sweeper. */ function migrate(uint256 sweeperId) external onlyOwner { _mintExistingTo(sweepersV1.ownerOf(sweeperId), sweeperId); } /** * @notice Dev manually migrate a batch of sweepers. * @dev Does not burn V1 Sweepers. */ function migrateMany(uint256[] calldata sweeperIds) external onlyOwner { for(uint i = 0; i < sweeperIds.length;) { _mintExistingTo(sweepersV1.ownerOf(sweeperIds[i]), sweeperIds[i]); unchecked{i++;} } } /** * @notice Holder migrate their owned sweepers in batches of <= 95. * @dev Transfers V1 Sweeper to this contract and then burns it. */ function migrateManyByOwner() external { uint256 b = sweepersV1.balanceOf(msg.sender); uint256 l; if(b > 95) { l = b - 95; } for(uint i = b; i > l;) { uint256 sweeperId = sweepersV1.tokenOfOwnerByIndex(msg.sender, i - 1); _mintExistingTo(msg.sender, sweeperId); unchecked{i--;} } } /** * @notice A distinct Uniform Resource Identifier (URI) for a given asset. * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), 'URI query for nonexistent token'); return descriptor.tokenURI(tokenId, seeds[tokenId]); } /** * @notice Similar to `tokenURI`, but always serves a base64 encoded data URI * with the JSON contents directly inlined. */ function dataURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), 'URI query for nonexistent token'); return descriptor.dataURI(tokenId, seeds[tokenId]); } /** * @notice Set the sweepers Treasury. * @dev Only callable by the sweepers Treasury when not locked. */ function setSweepersTreasury(address _sweepersTreasury) external override onlySweepersTreasury { sweepersTreasury = _sweepersTreasury; emit SweepersTreasuryUpdated(_sweepersTreasury); } /** * @notice Set the token minter. * @dev Only callable by the owner when not locked. */ function setMinter(address _minter) external override onlyOwner { minter = _minter; emit MinterUpdated(_minter); } /** * @notice Set the token URI descriptor. * @dev Only callable by the owner when not locked. */ function setDescriptor(ISweepersDescriptor _descriptor) external override onlyOwner { descriptor = _descriptor; emit DescriptorUpdated(_descriptor); } /** * @notice Set the token seeder. * @dev Only callable by the owner when not locked. */ function setSeeder(ISweepersSeeder _seeder) external override onlyOwner { seeder = _seeder; emit SeederUpdated(_seeder); } /** * @notice Mint a Sweeper with `sweeperId` to the provided `to` address. */ function _mintTo(address to, uint256 sweeperId) internal returns (uint256) { ISweepersSeeder.Seed memory seed = seeds[sweeperId] = seeder.generateSeed(sweeperId, descriptor); _mint(owner(), to, sweeperId); emit SweeperCreated(sweeperId, seed); return sweeperId; } /** * @notice Mint a Sweeper with `sweeperId` to the provided `to` address. */ function _mintExistingTo(address to, uint256 sweeperId) internal { (uint48 _background, uint48 _body, uint48 _accessory, uint48 _head, uint48 _eyes, uint48 _mouth ) = sweepersV1.seeds(sweeperId); ISweepersSeeder.Seed memory seed = seeds[sweeperId] = ISweepersSeeder.Seed({ background: _background, body: _body, accessory: _accessory, head: _head, eyes: _eyes, mouth: _mouth }); _mint(owner(), to, sweeperId); emit SweeperMigrated(sweeperId, seed); } /** * @notice Allows this contract to receive V1 Sweepers in order to Burn them. */ function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721ReceiverUpgradeable.onERC721Received.selector; } //******* Garage Functions /** * @notice Set the daily DUST earned per Sweeper staked in the garage. * @dev Only callable by the owner. */ function setDailyDust(uint256 _dailyDust) external override onlyOwner { dailyDust = _dailyDust; } /** * @notice Set the DUST contract address. * @dev Only callable by the owner. */ function setDustContract(address _dust) external override onlyOwner { DUST = IDust(_dust); } /** * @notice Set the Remover address to allow automation of unstaking Sweepers listed on marketplaces. * @dev Only callable by the owner. */ function setRemover(address _remover, bool _flag) external override onlyOwner { remover[_remover] = _flag; } /** * @notice Set the multipliers based on Sweeper backgrounds. * @dev Only callable by the owner. */ function setMultipliers(uint8[] memory _index, uint16[] memory _mult) external override onlyOwner { for(uint i = 0; i < _index.length; i++) { require(multiplier[_index[i]] == 0, 'Multiplier already set'); multiplier[_index[i]] = _mult[i]; } } /** * @notice Set the timestamp that staking rewards will end. * @dev Only callable by the owner. */ function setRewardEnd(uint80 _endTime) external override onlyOwner { rewardEnd = _endTime; emit RewardEndSet(_endTime, block.timestamp); } /** * @notice Set the penalty parameters for being removed from the garage when listing a staked Sweeper. * @dev Only callable by the owner. */ function setPenalty(uint256 _penalty, uint8 _adjuster, address payable _receiver, bool _useCalc) external override onlyOwner { penalty = _penalty; penaltyAdjuster = _adjuster; PenaltyReceiver = _receiver; useCalculatedPenalty = _useCalc; emit PenaltyAmountSet(_penalty, _receiver, block.timestamp); } /** * @notice Set the number of times allowed to be removed before being blocked from the garage. * @dev Only callable by the owner. */ function setAllowedTimesRemoved(uint16 _limit) external override onlyOwner { allowedTimesRemoved = _limit; } /** * @notice Manually unblock an address from the garage. * @dev Only callable by the owner. */ function unblockGarageAccess(address account) external override onlyOwner { blockedFromGarage[account] = false; } /** * @notice Correct a penalty amount in case of miscalculation removeStake(). * @dev Only callable by the owner. Can only decrease penalty amount. */ function penaltyCorrection(address account, uint256 _newPenalty) external override onlyOwner { require(_newPenalty < penaltyEarnings[account].penaltyOwed); penaltyEarnings[account].penaltyOwed = _newPenalty; } /** * @notice Stake and lock Sweepers in the garage. * @dev Also claims all DUST earned prior to updating StakedNFTInfo state. */ function stakeAndLock(uint16[] calldata _ids) external override nonReentrant { require(!blockedFromGarage[msg.sender], "Please claim penalty reward"); _claimDust(msg.sender); uint16 length = uint16(_ids.length); uint256 _multiplier; uint256 m; for (uint16 i = 0; i < length; i++) { require(!isStakedAndLocked[_ids[i]], "Already Staked"); require(msg.sender == ownerOf(_ids[i]), "Not owner"); m = multiplier[uint8(seeds[_ids[i]].background)]; require(m > 0, "Contact Dev"); isStakedAndLocked[_ids[i]] = true; _multiplier += m; emit SweeperStakedAndLocked(_ids[i], block.timestamp); } StakedNFTInfo[msg.sender].earningsMultiplier += _multiplier; userStakedSweepers[msg.sender] += length; sweepersInGarage += length; emit SweepersStaked(msg.sender, _ids); } /** * @notice Claim all earned DUST. * @dev Call _claimDust with the caller's address. */ function claimDust() external override nonReentrant { _claimDust(msg.sender); } /** * @notice Claim all earned DUST. * @dev Called by all holder garage functions. */ function _claimDust(address account) internal { uint256 owed; if(rewardEnd > 0 && block.timestamp > rewardEnd) { owed = ((((rewardEnd - StakedNFTInfo[account].lastClaimTimestamp) * dailyDust) / 86400) * StakedNFTInfo[account].earningsMultiplier) / 10000; StakedNFTInfo[account].lastClaimTimestamp = rewardEnd; } else { owed = ((((block.timestamp - StakedNFTInfo[account].lastClaimTimestamp) * dailyDust) / 86400) * StakedNFTInfo[account].earningsMultiplier) / 10000; StakedNFTInfo[account].lastClaimTimestamp = uint80(block.timestamp); } if(owed > 0) { DUST.mint(msg.sender, owed); emit DustClaimed(msg.sender, owed); } } /** * @notice Get all Sweepers and garage status for a given account. * @dev Returns total DUST owed and arrays of owned Sweepers, DUST earned per Sweeper, Multipliers, and is staked bool. */ function getUnclaimedDust(address account) external view override returns (uint256 owed, uint256[] memory ownedSweepers, uint256[] memory dustPerNFTList, uint256[] memory multipliers, bool[] memory isStaked) { uint256 length = balanceOf(account); ownedSweepers = new uint256[](length); multipliers = new uint256[](length); dustPerNFTList = new uint256[](length); isStaked = new bool[](length); uint256 _multiplier; uint256 _owed; if(rewardEnd > 0 && block.timestamp > rewardEnd) { _owed = (((rewardEnd - StakedNFTInfo[account].lastClaimTimestamp) * dailyDust) / 86400); } else { _owed = (((block.timestamp - StakedNFTInfo[account].lastClaimTimestamp) * dailyDust) / 86400); } for (uint i = 0; i < length; i++) { uint256 _id = tokenOfOwnerByIndex(account, i); _multiplier = multiplier[uint8(seeds[_id].background)]; if(isStakedAndLocked[_id]) { dustPerNFTList[i] = (_owed * _multiplier) / 10000; isStaked[i] = true; } multipliers[i] = _multiplier; ownedSweepers[i] = _id; } owed = (_owed * StakedNFTInfo[account].earningsMultiplier) / 10000; return (owed, ownedSweepers, dustPerNFTList, multipliers, isStaked); } /** * @notice Returns whether a single Sweeper is Staked. */ function isNFTStaked(uint16 _id) public view override returns (bool) { if(isStakedAndLocked[_id]) { return true; } else { return false; } } /** * @notice Returns whether a batch of Sweepers are Staked. */ function isNFTStakedBatch(uint16[] calldata _ids) external view override returns (bool[] memory isStaked) { uint length = _ids.length; isStaked = new bool[](length); for(uint i = 0; i < length; i++) { isStaked[i] = isNFTStaked(_ids[i]); } } /** * @notice Unstake Sweepers from garage. * @dev Also claims all DUST earned prior to updating StakedNFTInfo state. */ function unstake(uint16[] calldata _ids) external override nonReentrant { _claimDust(msg.sender); uint16 length = uint16(_ids.length); uint256 _multiplier; for (uint16 i = 0; i < length; i++) { require(isStakedAndLocked[_ids[i]], "Not staked"); require(msg.sender == ownerOf(_ids[i]), "Not owner"); isStakedAndLocked[_ids[i]] = false; _multiplier += multiplier[uint8(seeds[_ids[i]].background)]; emit SweeperStakedAndLocked(_ids[i], block.timestamp); } StakedNFTInfo[msg.sender].earningsMultiplier -= _multiplier; sweepersInGarage -= length; userStakedSweepers[msg.sender] -= length; if(userStakedSweepers[msg.sender] == 0) { delete StakedNFTInfo[msg.sender]; } emit SweepersUnstaked(msg.sender, _ids); } /** * @notice Unstakes a Sweeper if it get's listed on an NFT Marketplace. * @dev Only callable by remover. Owner of Sweeper is levied a penalty that reimburses the cost of unstaking them. */ function removeStake(uint16 _id) external override onlyRemover { uint256 gasForTX = gasleft(); require(isStakedAndLocked[_id]); address sweepOwner = ownerOf(_id); if(rewardEnd > 0 && block.timestamp > rewardEnd) { penaltyEarnings[sweepOwner].earnings += ((((rewardEnd - StakedNFTInfo[sweepOwner].lastClaimTimestamp) * dailyDust) / 86400) * StakedNFTInfo[sweepOwner].earningsMultiplier) / 10000; StakedNFTInfo[sweepOwner].lastClaimTimestamp = rewardEnd; } else { penaltyEarnings[sweepOwner].earnings += ((((block.timestamp - StakedNFTInfo[sweepOwner].lastClaimTimestamp) * dailyDust) / 86400) * StakedNFTInfo[sweepOwner].earningsMultiplier) / 10000; StakedNFTInfo[sweepOwner].lastClaimTimestamp = uint80(block.timestamp); } penaltyEarnings[sweepOwner].numUnstakedSweepers++; isStakedAndLocked[_id] = false; timesRemoved[sweepOwner]++; if(penaltyEarnings[sweepOwner].numUnstakedSweepers > allowedTimesRemoved) { blockedFromGarage[sweepOwner] = true; } uint16[] memory _ids = new uint16[](1); _ids[0] = _id; StakedNFTInfo[sweepOwner].earningsMultiplier -= multiplier[uint8(seeds[_id].background)]; sweepersInGarage--; userStakedSweepers[sweepOwner]--; emit SweepersUnstaked(sweepOwner, _ids); emit SweeperRemoved(sweepOwner, _id, block.timestamp); penaltyEarnings[sweepOwner].penaltyOwed += ((gasForTX - gasleft()) * tx.gasprice * penaltyAdjuster) / 100 ; } /** * @notice Claim earnings from being removed from garage. * @dev Must pay penalty amount equal to cost of removeStake(). Also unblocks holder from garage. */ function claimWithPenalty() external payable override { if(useCalculatedPenalty) { require(msg.value == penaltyEarnings[msg.sender].penaltyOwed, "Value must equal penalty"); } else { require(msg.value == penaltyEarnings[msg.sender].numUnstakedSweepers * penalty, "Value must equal penalty"); } uint256 owed = penaltyEarnings[msg.sender].earnings; DUST.mint(msg.sender, owed); (bool sent,) = PenaltyReceiver.call{value: msg.value}(""); require(sent); blockedFromGarage[msg.sender] = false; delete penaltyEarnings[msg.sender]; emit DustClaimed(msg.sender, owed); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; interface IDust { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address from, address to, uint256 amount ) external returns (bool); function burn(uint256 _amount) external; function burnFrom(address _from, uint256 _amount) external; function mint(address _to, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; interface IProxyRegistry { function proxies(address) external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _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 making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT /// @title ERC721 Token Implementation // LICENSE // ERC721.sol modifies OpenZeppelin's ERC721.sol: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/6618f9f18424ade44116d0221719f4c93be6a078/contracts/token/ERC721/ERC721.sol // // ERC721.sol source code copyright OpenZeppelin licensed under the MIT License. // With modifications by Sweeperders Treasury. // // // MODIFICATIONS: // `_safeMint` and `_mint` contain an additional `creator` argument and // emit two `Transfer` logs, rather than one. The first log displays the // transfer (mint) from `address(0)` to the `creator`. The second displays the // transfer from the `creator` to the `to` address. This enables correct // attribution on various NFT marketplaces. pragma solidity ^0.8.6; import '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol'; import '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol'; import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(uint256 => bool) public isStakedAndLocked; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); require(!isStakedAndLocked[tokenId], 'Token is Staked and Locked'); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); require(!isStakedAndLocked[tokenId], 'Token is Staked and Locked'); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(address(0), to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address creator, address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), creator, tokenId); emit Transfer(creator, to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721Upgradeable.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; }
// SPDX-License-Identifier: MIT /// @title Interface for SweepersToken pragma solidity ^0.8.6; import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import { ISweepersDescriptor } from './ISweepersDescriptor.sol'; import { ISweepersSeeder } from './ISweepersSeeder.sol'; interface ISweepersTokenV1 is IERC721 { event SweeperCreated(uint256 indexed tokenId, ISweepersSeeder.Seed seed); event SweeperMigrated(uint256 indexed tokenId, ISweepersSeeder.Seed seed); event SweeperBurned(uint256 indexed tokenId); event SweeperStakedAndLocked(uint256 indexed tokenId, uint256 timestamp); event SweeperUnstakedAndUnlocked(uint256 indexed tokenId, uint256 timestamp); event SweepersTreasuryUpdated(address sweepersTreasury); event MinterUpdated(address minter); event MinterLocked(); event GarageUpdated(address garage); event DescriptorUpdated(ISweepersDescriptor descriptor); event DescriptorLocked(); event SeederUpdated(ISweepersSeeder seeder); event SeederLocked(); function mint() external returns (uint256); function burn(uint256 tokenId) external; function dataURI(uint256 tokenId) external returns (string memory); function setSweepersTreasury(address sweepersTreasury) external; function setMinter(address minter) external; function lockMinter() external; function setDescriptor(ISweepersDescriptor descriptor) external; function lockDescriptor() external; function setSeeder(ISweepersSeeder seeder) external; function lockSeeder() external; function stakeAndLock(uint256 tokenId) external returns (uint8); function unstakeAndUnlock(uint256 tokenId) external; function setGarage(address _garage, bool _flag) external; function isStakedAndLocked(uint256 _id) external view returns (bool); function seeds(uint256 sweeperId) external view returns (uint48, uint48, uint48, uint48, uint48, uint48); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT /// @title Interface for SweepersToken pragma solidity ^0.8.6; // import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import { IERC721Upgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol'; import { ISweepersDescriptor } from './ISweepersDescriptor.sol'; import { ISweepersSeeder } from './ISweepersSeeder.sol'; interface ISweepersToken is IERC721Upgradeable{ event SweeperCreated(uint256 indexed tokenId, ISweepersSeeder.Seed seed); event SweeperMigrated(uint256 indexed tokenId, ISweepersSeeder.Seed seed); event SweeperBurned(uint256 indexed tokenId); event SweeperStakedAndLocked(uint256 indexed tokenId, uint256 timestamp); event SweeperUnstakedAndUnlocked(uint256 indexed tokenId, uint256 timestamp); event SweepersTreasuryUpdated(address sweepersTreasury); event MinterUpdated(address minter); event MinterLocked(); event GarageUpdated(address garage); event DescriptorUpdated(ISweepersDescriptor descriptor); event DescriptorLocked(); event SeederUpdated(ISweepersSeeder seeder); event SeederLocked(); event SweepersStaked(address indexed staker, uint16[] stakedIDs); event SweepersUnstaked(address indexed unstaker, uint16[] stakedIDs); event DustClaimed(address indexed claimer, uint256 amount); event SweeperRemoved(address indexed sweepOwner, uint16 stakedId, uint256 timestamp); event RewardEndSet(uint80 rewardEnd, uint256 timestamp); event PenaltyAmountSet(uint256 PenaltyAmount, address PenaltyReceiver, uint256 timestamp); struct stakedNFT { uint80 lastClaimTimestamp; uint256 earningsMultiplier; } struct unstakeEarnings { uint256 earnings; uint16 numUnstakedSweepers; uint256 penaltyOwed; } function mint() external returns (uint256); function burn(uint256 tokenId) external; function dataURI(uint256 tokenId) external returns (string memory); function setSweepersTreasury(address sweepersTreasury) external; function setMinter(address minter) external; // function lockMinter() external; function setDescriptor(ISweepersDescriptor descriptor) external; // function lockDescriptor() external; function setSeeder(ISweepersSeeder seeder) external; // function lockSeeder() external; // function stakeAndLock(uint256 tokenId) external returns (uint8); // function unstakeAndUnlock(uint256 tokenId) external; // function isStakedAndLocked(uint256 _id) external view returns (bool); // function setGarage(address _garage, bool _flag) external; function seeds(uint256 sweeperId) external view returns (uint48, uint48, uint48, uint48, uint48, uint48); function setDailyDust(uint256 _dailyDust) external; function setDustContract(address _dust) external; function setRemover(address _remover, bool _flag) external; // function setSingleMultiplier(uint8 _index, uint16 _mult) external; function setMultipliers(uint8[] memory _index, uint16[] memory _mult) external; function setRewardEnd(uint80 _endTime) external; function setPenalty(uint256 _penalty, uint8 _adjuster, address payable _receiver, bool _useCalc) external; function setAllowedTimesRemoved(uint16 _limit) external; function unblockGarageAccess(address account) external; function penaltyCorrection(address account, uint256 _newPenalty) external; function stakeAndLock(uint16[] calldata _ids) external; function claimDust() external; function getUnclaimedDust(address account) external view returns (uint256 owed, uint256[] memory ownedSweepers, uint256[] memory dustPerNFTList, uint256[] memory multipliers, bool[] memory isStaked); function isNFTStaked(uint16 _id) external view returns (bool); function isNFTStakedBatch(uint16[] calldata _ids) external view returns (bool[] memory isStaked); function unstake(uint16[] calldata _ids) external; function removeStake(uint16 _id) external; function claimWithPenalty() external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; import { ISweepersDescriptor } from './ISweepersDescriptor.sol'; interface ISweepersSeeder { struct Seed { uint48 background; uint48 body; uint48 accessory; uint48 head; uint48 eyes; uint48 mouth; } function generateSeed(uint256 sweeperId, ISweepersDescriptor descriptor) external view returns (Seed memory); }
// SPDX-License-Identifier: MIT /// @title Interface for SweepersDescriptor pragma solidity ^0.8.6; import { ISweepersSeeder } from './ISweepersSeeder.sol'; interface ISweepersDescriptor { event PartsLocked(); event DataURIToggled(bool enabled); event BaseURIUpdated(string baseURI); function arePartsLocked() external returns (bool); function isDataURIEnabled() external returns (bool); function baseURI() external returns (string memory); function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory); function bgPalette(uint256 index) external view returns (uint8); function bgColors(uint256 index) external view returns (string memory); function backgrounds(uint256 index) external view returns (bytes memory); function bodies(uint256 index) external view returns (bytes memory); function accessories(uint256 index) external view returns (bytes memory); function heads(uint256 index) external view returns (bytes memory); function eyes(uint256 index) external view returns (bytes memory); function mouths(uint256 index) external view returns (bytes memory); function backgroundNames(uint256 index) external view returns (string memory); function bodyNames(uint256 index) external view returns (string memory); function accessoryNames(uint256 index) external view returns (string memory); function headNames(uint256 index) external view returns (string memory); function eyesNames(uint256 index) external view returns (string memory); function mouthNames(uint256 index) external view returns (string memory); function bgColorsCount() external view returns (uint256); function backgroundCount() external view returns (uint256); function bodyCount() external view returns (uint256); function accessoryCount() external view returns (uint256); function headCount() external view returns (uint256); function eyesCount() external view returns (uint256); function mouthCount() external view returns (uint256); function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external; function addManyBgColors(string[] calldata bgColors) external; function addManyBackgrounds(bytes[] calldata backgrounds, uint8 _paletteAdjuster) external; function addManyBodies(bytes[] calldata bodies) external; function addManyAccessories(bytes[] calldata accessories) external; function addManyHeads(bytes[] calldata heads) external; function addManyEyes(bytes[] calldata eyes) external; function addManyMouths(bytes[] calldata mouths) external; function addManyBackgroundNames(string[] calldata backgroundNames) external; function addManyBodyNames(string[] calldata bodyNames) external; function addManyAccessoryNames(string[] calldata accessoryNames) external; function addManyHeadNames(string[] calldata headNames) external; function addManyEyesNames(string[] calldata eyesNames) external; function addManyMouthNames(string[] calldata mouthNames) external; function addColorToPalette(uint8 paletteIndex, string calldata color) external; function addBgColor(string calldata bgColor) external; function addBackground(bytes calldata background, uint8 _paletteAdjuster) external; function addBody(bytes calldata body) external; function addAccessory(bytes calldata accessory) external; function addHead(bytes calldata head) external; function addEyes(bytes calldata eyes) external; function addMouth(bytes calldata mouth) external; function addBackgroundName(string calldata backgroundName) external; function addBodyName(string calldata bodyName) external; function addAccessoryName(string calldata accessoryName) external; function addHeadName(string calldata headName) external; function addEyesName(string calldata eyesName) external; function addMouthName(string calldata mouthName) external; function lockParts() external; function toggleDataURIEnabled() external; function setBaseURI(string calldata baseURI) external; function tokenURI(uint256 tokenId, ISweepersSeeder.Seed memory seed) external view returns (string memory); function dataURI(uint256 tokenId, ISweepersSeeder.Seed memory seed) external view returns (string memory); function genericDataURI( string calldata name, string calldata description, ISweepersSeeder.Seed memory seed ) external view returns (string memory); function generateSVGImage(ISweepersSeeder.Seed memory seed) external view returns (string memory); }
// SPDX-License-Identifier: BSD-3-Clause /// @title Vote checkpointing for an ERC-721 token // LICENSE // ERC721Checkpointable.sol uses and modifies part of Compound Lab's Comp.sol: // https://github.com/compound-finance/compound-protocol/blob/ae4388e780a8d596d97619d9704a931a2752c2bc/contracts/Governance/Comp.sol // // Comp.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license. // With modifications by Sweeperders Treasury. // // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause // // MODIFICATIONS // Checkpointing logic from Comp.sol has been used with the following modifications: // - `delegates` is renamed to `_delegates` and is set to private // - `delegates` is a public function that uses the `_delegates` mapping look-up, but unlike // Comp.sol, returns the delegator's own address if there is no delegate. // This avoids the delegator needing to "delegate to self" with an additional transaction // - `_transferTokens()` is renamed `_beforeTokenTransfer()` and adapted to hook into OpenZeppelin's ERC721 hooks. pragma solidity ^0.8.6; import './ERC721EnumerableUpgradeable.sol'; import './IERC721CheckpointableUpgradeable.sol'; abstract contract ERC721CheckpointableUpgradeable is ERC721EnumerableUpgradeable, IERC721CheckpointableUpgradeable { /// @notice Defines decimals as per ERC-20 convention to make integrations with 3rd party governance platforms easier uint8 public constant decimals = 0; /// @notice A record of each accounts delegate mapping(address => address) private _delegates; // /// @notice A checkpoint for marking number of votes from a given block // struct Checkpoint { // uint32 fromBlock; // uint96 votes; // } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)'); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)'); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; // /// @notice An event thats emitted when an account changes its delegate // event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); // /// @notice An event thats emitted when a delegate account's vote balance changes // event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @notice The votes a delegator can delegate, which is the current balance of the delegator. * @dev Used when calling `_delegate()` */ function votesToDelegate(address delegator) public view virtual override returns (uint96) { return safe96(balanceOf(delegator), 'votesToDelegate: amount exceeds 96 bits'); } /** * @notice Overrides the standard `Comp.sol` delegates mapping to return * the delegator's own address if they haven't delegated. * This avoids having to delegate to oneself. */ function delegates(address delegator) public view virtual override returns (address) { address current = _delegates[delegator]; return current == address(0) ? delegator : current; } /** * @notice Adapted from `_transferTokens()` in `Comp.sol` to update delegate votes. * @dev hooks into OpenZeppelin's `ERC721._transfer` */ function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert(); } /// @notice Differs from `_transferTokens()` to use `delegates` override method to simulate auto-delegation _moveDelegates(delegates(from), delegates(to), uint96(batchSize)); } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) public virtual override { if (delegatee == address(0)) delegatee = msg.sender; return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { bytes32 domainSeparator = keccak256( abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)) ); bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'delegateBySig: invalid signature'); require(nonce == nonces[signatory]++, 'delegateBySig: invalid nonce'); require(block.timestamp <= expiry, 'delegateBySig: signature expired'); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view virtual override returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) public view virtual override returns (uint96) { require(blockNumber < block.number, 'getPriorVotes: not yet determined'); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation address currentDelegate = delegates(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); uint96 amount = votesToDelegate(delegator); _moveDelegates(currentDelegate, delegatee, amount); } function _moveDelegates( address srcRep, address dstRep, uint96 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96(srcRepOld, amount, '_moveDelegates: amount underflows'); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint96 dstRepNew = add96(dstRepOld, amount, '_moveDelegates: amount overflows'); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes ) internal { uint32 blockNumber = safe32( block.number, '_writeCheckpoint: block number exceeds 32 bits' ); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function add96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function sub96( uint96 a, uint96 b, string memory errorMessage ) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function getChainId() internal view returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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 onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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 proxied contracts do not make use of 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. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * 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. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @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 Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/MathUpgradeable.sol"; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC721CheckpointableUpgradeable { struct Checkpoint { uint32 fromBlock; uint96 votes; } event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); function votesToDelegate(address delegator) external view returns (uint96); function delegates(address delegator) external view returns (address); function delegate(address delegatee) external; function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external; function getCurrentVotes(address account) external view returns (uint96); function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { function __ERC721Enumerable_init() internal onlyInitializing { } function __ERC721Enumerable_init_unchained() internal onlyInitializing { } // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721Upgradeable.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[46] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/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 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721EnumerableUpgradeable is IERC721Upgradeable { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
{ "optimizer": { "enabled": true, "runs": 999 }, "viaIR": true, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"DescriptorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISweepersDescriptor","name":"descriptor","type":"address"}],"name":"DescriptorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DustClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"garage","type":"address"}],"name":"GarageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[],"name":"MinterLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"MinterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"PenaltyAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"PenaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PenaltyAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint80","name":"rewardEnd","type":"uint80"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardEndSet","type":"event"},{"anonymous":false,"inputs":[],"name":"SeederLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISweepersSeeder","name":"seeder","type":"address"}],"name":"SeederUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SweeperBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"}],"indexed":false,"internalType":"struct ISweepersSeeder.Seed","name":"seed","type":"tuple"}],"name":"SweeperCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"}],"indexed":false,"internalType":"struct ISweepersSeeder.Seed","name":"seed","type":"tuple"}],"name":"SweeperMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sweepOwner","type":"address"},{"indexed":false,"internalType":"uint16","name":"stakedId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SweeperRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SweeperStakedAndLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SweeperUnstakedAndUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"stakedIDs","type":"uint16[]"}],"name":"SweepersStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sweepersTreasury","type":"address"}],"name":"SweepersTreasuryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"unstaker","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"stakedIDs","type":"uint16[]"}],"name":"SweepersUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PenaltyReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"StakedNFTInfo","outputs":[{"internalType":"uint80","name":"lastClaimTimestamp","type":"uint80"},{"internalType":"uint256","name":"earningsMultiplier","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedTimesRemoved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blockedFromGarage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sweeperId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWithPenalty","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyDust","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract ISweepersDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnclaimedDust","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"},{"internalType":"uint256[]","name":"ownedSweepers","type":"uint256[]"},{"internalType":"uint256[]","name":"dustPerNFTList","type":"uint256[]"},{"internalType":"uint256[]","name":"multipliers","type":"uint256[]"},{"internalType":"bool[]","name":"isStaked","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sweepersTreasury","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_descriptor","type":"address"},{"internalType":"address","name":"_seeder","type":"address"},{"internalType":"address","name":"_proxyRegistry","type":"address"},{"internalType":"address","name":"_sweepersV1","type":"address"},{"internalType":"uint256","name":"__currentSweeperId","type":"uint256"},{"internalType":"address","name":"_dust","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"isNFTStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"}],"name":"isNFTStakedBatch","outputs":[{"internalType":"bool[]","name":"isStaked","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isStakedAndLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sweeperId","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"sweeperIds","type":"uint256[]"}],"name":"migrateMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateManyByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"multiplier","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","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":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penaltyAdjuster","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_newPenalty","type":"uint256"}],"name":"penaltyCorrection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"penaltyEarnings","outputs":[{"internalType":"uint256","name":"earnings","type":"uint256"},{"internalType":"uint16","name":"numUnstakedSweepers","type":"uint16"},{"internalType":"uint256","name":"penaltyOwed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistry","outputs":[{"internalType":"contract IProxyRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"}],"name":"removeStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seeder","outputs":[{"internalType":"contract ISweepersSeeder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seeds","outputs":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"body","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"head","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_limit","type":"uint16"}],"name":"setAllowedTimesRemoved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURIHash","type":"string"}],"name":"setContractURIHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dailyDust","type":"uint256"}],"name":"setDailyDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISweepersDescriptor","name":"_descriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dust","type":"address"}],"name":"setDustContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_index","type":"uint8[]"},{"internalType":"uint16[]","name":"_mult","type":"uint16[]"}],"name":"setMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_penalty","type":"uint256"},{"internalType":"uint8","name":"_adjuster","type":"uint8"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"bool","name":"_useCalc","type":"bool"}],"name":"setPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_remover","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setRemover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_endTime","type":"uint80"}],"name":"setRewardEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISweepersSeeder","name":"_seeder","type":"address"}],"name":"setSeeder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sweepersTreasury","type":"address"}],"name":"setSweepersTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"}],"name":"stakeAndLock","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":"sweepersInGarage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepersTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepersV1","outputs":[{"internalType":"contract ISweepersTokenV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"timesRemoved","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockGarageAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useCalculatedPenalty","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userStakedSweepers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"votesToDelegate","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080806040523461001757615e4d90816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c806301b9a39714613cef57806301ffc9a714613be957806305dd1fd414613bca57806306fdde0314613b245780630754617214613afc578063081812fc14613add578063095ea7b31461395c57806309b32b571461393a5780630cd58089146138fd5780630dd64a35146138bc5780630edd2ffc1461389d5780631249c58b146135dd578063150b7a02146135735780631570bc0d1461354b57806318160ddd1461352d57806320606b70146134f257806323b872dd146134af57806325ea33801461345a578063286e323a146134365780632d7d681b1461340f5780632f745c59146133e7578063303e74df146133bf578063313ce567146133a3578063358a5fb8146131e45780633697e5631461319057806336b69dd11461303c5780633ade115c1461301d5780633b1263a114612fe15780633b7cb63314612fb957806342842e0e14612f7f57806342966c6814612cfd5780634452272914612ca8578063454b060814612c215780634c89167114612a905780634f6ccce7146129ee57806357c1af93146127c1578063587cde1e1461279d5780635ac1e3bb146126c25780635c19a95c146126875780636352211e1461265757806365701bec1461261957806367064d4c146125c8578063684931ed146125a05780636db18a15146125735780636e48de57146125545780636eee550c1461249b5780636fcfff451461245d57806370a0823114612431578063715018a6146123d5578063728c18de14612362578063782d6fe11461233a5780637ecebe00146123025780637f6fd6701461210c5780638da5cb5b146120e55780638e659c0814611a3b57806395d89b41146119565780639ab4972314611697578063a22cb465146115c1578063a32b9d831461152f578063a431b3d4146114f6578063ae994fa914611412578063b4b5ea5714611392578063b50cbd9f1461136a578063b88d4fde14611309578063baedc1c414611172578063c2263cc714611143578063c3cda52014610e09578063c87b56dd14610ccf578063c902461114610cb0578063d50b31eb14610c41578063d941cee414610ba9578063dcbf0b5514610b67578063df90ebe814610b3c578063e1ef8bbc14610b14578063e7a324dc14610ad9578063e8a3d485146109c5578063e9580e9114610990578063e985e9c514610959578063f0503e80146108ea578063f1127ed81461087d578063f2fde38b146107d6578063f5453f2f1461041b5763fca3b5aa146103ae57600080fd5b34610418576020366003190112610418577fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a60206001600160a01b036103f2613da6565b6103fa613fe2565b16610133816001600160a01b0319825416179055604051908152a180f35b80fd5b5034610418576020806003193601126107d257610436613ec5565b338352610142825260ff604084205416156107ce575a9161ffff80921692838552609d825260ff604086205416156107ca576001600160a01b03610479856155c3565b8669ffffffffffffffffffff61013d8181541680151590816107c0575b50156107385790816127106104ef8960016040866104d4985416988b8b16998a8252620151806104e06101409b8c938489528c878720541690614746565b8b61013c549116614733565b04948b83525220015490614733565b04848c52610144895261050760408d20918254614689565b905554169189528552604088209069ffffffffffffffffffff198254161790555b16938486526101449384845260018060408920018054908361054b81841661461c565b1661ffff19809316179055838952609d8652604089209060ff1991828154169055888a52610145875260408a20908154908561058881841661461c565b169116179055878952868652828260408b200154166101475410610721575b50604051906105b582613e37565b808252858201918636843780511561070b57919092849389958352848b52610137885260ff60408c2054168b5261013f88528a610607826040858185205416938a81526101408d522001918254614239565b905561013e610616815461495e565b9055858b52610141885260408b2061062e815461495e565b90556040519388850190898652518091526040850193928c905b8a8383106106f15750505050505093837f419510483a9bac83d5227ec93c06e4f9af4f3c4bb30700d75845e7ec06dffd9060406106c8956106d5977f0745a69f4abc5431da1472d508586663efcf0cf9f7398802b8bdf63e27eb17f8876106c19860649c0390a28151908152428a820152a25a90614239565b3a90614733565b60ff610149541690614733565b04928452526106ec60026040842001918254614689565b905580f35b8551821687528d9950958601959094019390830190610648565b634e487b7160e01b600052603260045260246000fd5b61014686528160408a2091825416179055386105a7565b509050828216808952610140908187526127106107848b60016040620151806107736107698a848720541642614239565b61013c5490614733565b0492868152878d5220015490614733565b04818b52610144885261079c60408c20918254614689565b9055895285526040882090421669ffffffffffffffffffff19825416179055610528565b9050421138610496565b8480fd5b8280fd5b5080fd5b5034610418576020366003190112610418576107f0613da6565b6107f8613fe2565b6001600160a01b03811615610813576108109061403a565b80f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b503461041857604036600319011261041857610897613da6565b60243563ffffffff918282168092036108e6576040936001600160a01b03859216815260fd60205220906000526020526001600160601b0382600020548351928116835260201c166020820152f35b8380fd5b503461041857602036600319011261041857604060c091600435815261013760205220600181549165ffffffffffff91829101541690604051928181168452818160301c166020850152818160601c166040850152818160901c166060850152841c16608083015260a0820152f35b5034610418576040366003190112610418576020610986610978613da6565b610980613dbc565b90614163565b6040519015158152f35b50346104185760203660031901126104185760206109b46109af613da6565b6149e6565b6001600160601b0360405191168152f35b5034610418578060031936011261041857604051906020907f697066733a2f2f00000000000000000000000000000000000000000000000000828401528281610139928354610a1381614082565b94600191808316908115610ab45750600114610a58575b505050610a40925003601f198101845283613e8b565b610a54604051928284938452830190613d81565b0390f35b8252909150847f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f65b858410610a9c57505050506027610a4092820101388080610a2a565b80548885016027015287945092019185908201610a80565b9250505060279250610a4094915060ff19168284015280151502820101388080610a2a565b503461041857806003193601126104185760206040517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8152f35b503461041857806003193601126104185760206001600160a01b036101435416604051908152f35b5034610418578060031936011261041857610b556146dd565b610b5e33614762565b60016101005580f35b5034610418576020366003190112610418576001600160a01b03610b89613da6565b610b91613fe2565b16815261014660205260408120805460ff1916905580f35b50346104185760203660031901126104185760043569ffffffffffffffffffff81168082036107ce577f8418510ee1b4493b8fffec3221f57d7d58974f8faef99a9752f9c7eb41ad4d2991610c3b91610c00613fe2565b61013d805469ffffffffffffffffffff191690911790556040805169ffffffffffffffffffff92909216825242602083015290918291820190565b0390a180f35b5034610418576020366003190112610418576004356001600160a01b0381168091036107d25760207fb3025222d01ce9a26c7f9d52bc3bfd0352366bd90a793c273fbfe1c81e0e288e91610c93613fe2565b610135816001600160a01b0319825416179055604051908152a180f35b5034610418578060031936011261041857602061013c54604051908152f35b503461041857602036600319011261041857610daf81600435610d10610d0b8260005260996020526001600160a01b0360406000205416151590565b614246565b6001600160a01b03610134541681835261013760205260408320916040518095819482937f426381210000000000000000000000000000000000000000000000000000000084526004840190929160c09060e08301948352600181549165ffffffffffff83818095166020880152818160301c166040880152818160601c166060880152818160901c166080880152851c1660a0860152015416910152565b03915afa908115610dfe5782610a549392610ddb575b5050604051918291602083526020830190613d81565b610df792503d8091833e610def8183613e8b565b810190614291565b3880610dc5565b6040513d84823e3d90fd5b50346104185760c036600319011261041857610e23613da6565b90602435916044356064359060ff821680920361113e576040519484926097549387610e4e86614082565b918282526020998a91828201946001998a8116908160001461112257506001146110c8575b50610e8092500382613e8b565b51902060405190888201907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866825260408301524660608301526080913083820152828152610ecd81613e53565b51902090604051958987017fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81526001600160a01b0397888a1660408201528660608201528784820152838152610f2381613e53565b51902090604051918b8301947f1901000000000000000000000000000000000000000000000000000000000000865260228401526042830152604282528282019180831067ffffffffffffffff8411176110b2578b958b958460405282519020845260a082015260843560c082015260e060a4359101528380525afa156110a7578451928316801561106457855260ff86526040852090815491610fc68361421a565b905503611020574211610fdd579061081091614d2e565b6064846040519062461bcd60e51b825280600483015260248201527f64656c656761746542795369673a207369676e617475726520657870697265646044820152fd5b6064856040519062461bcd60e51b82526004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e6365000000006044820152fd5b6064876040519062461bcd60e51b825280600483015260248201527f64656c656761746542795369673a20696e76616c6964207369676e61747572656044820152fd5b6040513d86823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b60978c528b9150897f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff95b82841061110b5750505091610e80928201018b92610e73565b8054878501870152869450928501928b91016110f2565b60ff19168752508c9390151560051b8301019050610e80610e73565b600080fd5b50346104185760203660031901126104185760ff60406020926004358152609d84522054166040519015158152f35b503461041857602090816003193601126104185767ffffffffffffffff916004358381116107ce57366023820112156107ce576111b9903690602481600401359101613fab565b926111c2613fe2565b83519081116112f557610139916111d98354614082565b601f811161129d575b5080601f831160011461121d5750839482939492611212575b50508160011b916000199060031b1c191617905580f35b0151905038806111fb565b838552601f198316957f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6929186905b8882106112855750508360019596971061126c575b505050811b01905580f35b015160001960f88460031b161c19169055388080611261565b8060018596829496860151815501950193019061124c565b6112e590846000527f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6601f850160051c8101918486106112eb575b601f0160051c01906140bc565b386111e2565b90915081906112d8565b602483634e487b7160e01b81526041600452fd5b503461041857608036600319011261041857611323613da6565b61132b613dbc565b6064359167ffffffffffffffff83116108e657366023840112156108e657611360610810933690602481600401359101613fab565b91604435916156e3565b503461041857806003193601126104185760206001600160a01b0361013a5416604051908152f35b50346104185760209081600319360112610418576001600160a01b036113b6613da6565b16815260fe8252604081205463ffffffff90811691821561140a5760406113e29160fd86522092614ada565b1660005281526001600160601b03604060002054821c166001600160601b0360405191168152f35b9150506109b4565b5034610418576020806003193601126107d25760043567ffffffffffffffff81116107ce57611445903690600401613ef4565b9161144e613fe2565b835b83811061145b578480f35b6001600160a01b0361013654169082611475828787614229565b356024604051809581936331a9108f60e11b835260048301525afa9182156114eb576001926114b89188916114be575b506114b1838888614229565b359061435c565b01611450565b6114de9150853d87116114e4575b6114d68183613e8b565b810190614144565b386114a5565b503d6114cc565b6040513d88823e3d90fd5b50346104185760203660031901126104185760406020916001600160a01b0361151d613da6565b16815261014183522054604051908152f35b50346104185760203660031901126104185760043567ffffffffffffffff81116107d257611561903690600401613ef4565b61156a81614906565b925b8181106115895760405160208082528190610a5490820187613f59565b806115a86115a361159e6115bc948688614229565b61462f565b614938565b6115b28287614608565b901515905261421a565b61156c565b5034610418576040366003190112610418576115db613da6565b6001600160a01b036115eb613ee5565b91169081331461165357338352609c60205260408320826000526020526116228160406000209060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461041857602090816003193601126104185760043567ffffffffffffffff81116107d2576116cb903690600401613ef4565b6116d36146dd565b338352610146845260ff9081604085205416611912576116f233614762565b61ffff928382169285865b868116918683101561188a578761171861159e858989614229565b168952609d90818b528460408b205416611846576117576001600160a01b0361174f8b61174961159e898d8d614229565b166155c3565b16331461463e565b8861176661159e868a8a614229565b168a526101378b528460408b2054168a5261013f8b528860408b2054169182156118025761159e6117c66117fd95948c948f8f6117ce966040928f8f61159e8f8d936117b193614229565b1683525220805460ff19166001179055614689565b958989614229565b167f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed8b604051428152a261461c565b6116fd565b60648c6040519062461bcd60e51b82526004820152600b60248201527f436f6e74616374204465760000000000000000000000000000000000000000006044820152fd5b60648b6040519062461bcd60e51b82526004820152600e60248201527f416c7265616479205374616b65640000000000000000000000000000000000006044820152fd5b847f5d5bd8d660edcbaa77f1a24c595f7da61a2a9e6bbf3fa36711927c85cba8d483611906888a6101418f8f9733895261014082526118d1600160408b2001918254614689565b905533885252604086206118e6828254614689565b90556118f661013e918254614689565b9055604051918291339583614696565b0390a260016101005580f35b6064856040519062461bcd60e51b82526004820152601b60248201527f506c6561736520636c61696d2070656e616c74792072657761726400000000006044820152fd5b5034610418578060031936011261041857604051908060985461197881614082565b80855291600191808316908115611a1157506001146119b6575b610a54856119a281870382613e8b565b604051918291602083526020830190613d81565b9250609883527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d8145b8284106119f95750505081016020016119a282610a54611992565b805460208587018101919091529093019281016119de565b869550610a54969350602092506119a294915060ff191682840152151560051b8201019293611992565b50346104185761010036600319011261041857611a56613da6565b611a5e613dbc565b90604435906001600160a01b038216820361113e576064356001600160a01b038116810361113e576084356001600160a01b038116810361113e5760a435916001600160a01b038316830361113e5760e435946001600160a01b038616860361113e5787549660ff8860081c1615978880996120d8575b80156120c1575b156120575760ff1981166001178a5588612046575b50604051611afe81613e37565b600881527f5377656570657273000000000000000000000000000000000000000000000000602082015260405190611b3582613e37565b600782527f53574545504552000000000000000000000000000000000000000000000000006020830152611b7860ff8c5460081c16611b73816140d3565b6140d3565b80519067ffffffffffffffff8211612032578190611b97609754614082565b601f8111611fe3575b50602090601f8311600114611f5b578d92611f50575b50508160011b916000199060031b1c1916176097555b80519067ffffffffffffffff8211611f3c578190611beb609854614082565b601f8111611eed575b50602090601f8311600114611e65578c92611e5a575b50508160011b916000199060031b1c1916176098555b611c3460ff8a5460081c16611b73816140d3565b611c3d3361403a565b611c5160ff8a5460081c16611b73816140d3565b6001610100556001600160a01b0319956001600160a01b036101329116878254161790556001600160a01b036101339116868254161790556001600160a01b036101349116858254161790556001600160a01b036101359116848254161790556001600160a01b0361013a9116838254161790556001600160a01b0361013691168282541617905560c43561013855610139611ced8154614082565b601f8111611df2575b50605d815584527f516d65614b78376572337445676d63347666434175394a75733979565756384b7f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6557f4d7964706d627570534b53754a310000000000000000000000000000000000007f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f755678ac7230489e8000061013c556001600160a01b0361013b92169082541617905561014961016e61ffff19825416179055611dbb5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b601f90826000520160051c7f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6017f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f85b818110611e4e5750611cf6565b60008155600101611e41565b015190503880611c0a565b925060988c527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d814908c935b601f1984168510611ed2576001945083601f19811610611eb9575b505050811b01609855611c20565b015160001960f88460031b161c19169055388080611eab565b81810151835560209485019460019093019290910190611e90565b611f369060986000527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d814601f850160051c810191602086106112eb57601f0160051c01906140bc565b38611bf4565b60248b634e487b7160e01b81526041600452fd5b015190503880611bb6565b925060978d527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9908d935b601f1984168510611fc8576001945083601f19811610611faf575b505050811b01609755611bcc565b015160001960f88460031b161c19169055388080611fa1565b81810151835560209485019460019093019290910190611f86565b61202c9060976000527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9601f850160051c810191602086106112eb57601f0160051c01906140bc565b38611ba0565b60248c634e487b7160e01b81526041600452fd5b61ffff191661010117895538611af1565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b50303b158015611adc5750600160ff821614611adc565b50600160ff821610611ad5565b503461041857806003193601126104185760206001600160a01b0360655416604051908152f35b5034610418576020908160031936011261041857612128613da6565b612131816154ee565b61213a81614906565b9261214482614906565b9161214e81614906565b9161215882614906565b946201518069ffffffffffffffffffff8061013d5416801515806122f9575b156122ca57906121a26121ad926001600160a01b03861687526101408d528260408820541690614746565b61013c549116614733565b04929088915b835b8181106122365750506127106121f3610a549897956001604061221a976101406122289b986001600160a01b0361220c991683525220015490614733565b049760a06040519a8b9a8b528a015260a0890190613f25565b908782036040890152613f25565b908582036060870152613f25565b908382036080850152613f59565b829350612247816122969394615417565b8086526101378c528b60ff80604089205416885261013f8252609d61ffff60408a20541692848a525260408820541661229f575b612285838b614608565b52612290828c614608565b5261421a565b908992916121b5565b6127106122ac828a614733565b046122b7848b614608565b5260016122c4848d614608565b5261227b565b506107696122ef916001600160a01b03851686526101408c5260408620541642614239565b04929088916121b3565b50804211612177565b50346104185760203660031901126104185760406020916001600160a01b03612329613da6565b16815260ff83522054604051908152f35b50346104185760403660031901126104185760206109b4612359613da6565b60243590614b06565b50346104185760203660031901126104185761237c613da6565b6101328054916001600160a01b039182841633036107ca577f922c2392f081081ce632aa0e69aec5bec8ac0deb638f309b416a4694863ffec2936020936001600160a01b0319931692839116179055604051908152a180f35b50346104185780600319360112610418576123ee613fe2565b60006001600160a01b036065546001600160a01b03198116606555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610418576020366003190112610418576020612455612450613da6565b6154ee565b604051908152f35b50346104185760203660031901126104185763ffffffff60406020926001600160a01b03612489613da6565b16815260fe8452205416604051908152f35b5034610418576080366003190112610418576004356024359060ff821680920361113e57604435906001600160a01b0382168092036108e6576064359182151580930361113e577fbd8502b084a97b09b275fc942f493195daf138a7dd0d13c92cfb9dca8a5c44459360609361250f613fe2565b83610148556101499161ff00835492610143866001600160a01b031982541617905560081b169161ffff1916171790556040519182526020820152426040820152a180f35b50346104185760203660031901126104185760206109866115a3613ec5565b50346104185760203660031901126104185761ffff612590613ec5565b612598613fe2565b166101475580f35b503461041857806003193601126104185760206001600160a01b036101355416604051908152f35b5034610418576040366003190112610418576125e2613da6565b6001600160a01b03602435916125f6613fe2565b16825261014460205260026040832001548110156107d257600260408320015580f35b50346104185760203660031901126104185760ff60406020926001600160a01b03612642613da6565b16815261014684522054166040519015158152f35b50346104185760203660031901126104185760206126766004356155c3565b6001600160a01b0360405191168152f35b5034610418576020366003190112610418576126a1613da6565b6001600160a01b038116156126bb575b6108109033614d2e565b50336126b1565b503461041857602036600319011261041857610daf816004356126fe610d0b8260005260996020526001600160a01b0360406000205416151590565b6001600160a01b03610134541681835261013760205260408320916040518095819482937fa18f67100000000000000000000000000000000000000000000000000000000084526004840190929160c09060e08301948352600181549165ffffffffffff83818095166020880152818160301c166040880152818160601c166060880152818160901c166080880152851c1660a0860152015416910152565b50346104185760203660031901126104185760206126766127bc613da6565b614aae565b503461041857602090816003193601126104185760043567ffffffffffffffff81116107d2576127f5903690600401613ef4565b906127fe6146dd565b61280733614762565b61ffff918281169184855b8581169185831015612946578661282d61159e858888614229565b168852609d808a5260ff908160408b205416156129025761159e6128c66128fd95948b60408f8f9061013f9084998f8f8f8083836128ce9f6128896001600160a01b0361174f8f61174961159e61159e9a839d6128ad9d614229565b8661289861159e868686614229565b168b5288528a8a20805460ff19169055614229565b1684526101378252848420541683525220541690614689565b958888614229565b167f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed8a604051428152a261461c565b612812565b60648b6040519062461bcd60e51b82526004820152600a60248201527f4e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b837f0745a69f4abc5431da1472d508586663efcf0cf9f7398802b8bdf63e27eb17f8611906878b948d8b3388526101409283835261298c600160408b2001918254614239565b905561013e61299c828254614239565b9055338852610141908183526129b760408a20918254614239565b905533885281526040872054156129d9575b5050604051918291339583614696565b526000600160408720878155015585806129c9565b50346104185760203660031901126104185760043560cc54811015612a2657612a186020916154b7565b90546040519160031b1c8152f35b608460405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152fd5b50346104185780600319360112610418576001600160a01b036101368181541660405192839283927f70a08231000000000000000000000000000000000000000000000000000000008452336004850152602093849160249687915afa9485156114eb578695612bf2575b508594605f8111612bcb575b858111612b12578680f35b828254166000198201918211612bb8576040517f2f745c5900000000000000000000000000000000000000000000000000000000815233600482015260248101839052908590829060449082905afa8015612bad578890612b7e575b612b7991503361435c565b612b07565b508481813d8311612ba6575b612b948183613e8b565b8101031261113e57612b799051612b6e565b503d612b8a565b6040513d8a823e3d90fd5b8588634e487b7160e01b81526011600452fd5b9450605e198501858111612bdf5794612b07565b8487634e487b7160e01b81526011600452fd5b9094508281813d8311612c1a575b612c0a8183613e8b565b8101031261113e57519338612afb565b503d612c00565b5034610418576020366003190112610418576024600435612c40613fe2565b60206001600160a01b036101365416604051938480926331a9108f60e11b82528560048301525afa8015612c9d57610810928491612c7f575b5061435c565b612c97915060203d81116114e4576114d68183613e8b565b38612c79565b6040513d85823e3d90fd5b50346104185760203660031901126104185760406060916001600160a01b03612ccf613da6565b16815261014460205220805490600261ffff6001830154169101549060405192835260208301526040820152f35b5034610418576020806003193601126107d257600435906001600160a01b0380610133541633036108e657612d31836155c3565b9080821680612ee3575060cc548460005260cd845280604060002055680100000000000000008110156110b25784612d72826001612d8d940160cc556154b7565b90919082549060031b600019811b9283911b16911916179055565b60cc546000199190828101908111612ecd578560005260cd8552612db6604060002054916154b7565b90549060031b1c612dca81612d72846154b7565b60005260cd8552604060002055846000526000604081205560cc548015612eb7578594612e25612e1789968660999501612e03816154b7565b8982549160031b1b1916905560cc55614aae565b612e1f614a6f565b90614f9f565b612e2e866155c3565b92868652609b825260408620936001600160a01b0319948581541690551693848652609a82526040862090815401905585855252604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a47f1bbce8ecee5dc0a3e78c8f538fed8a0018e9efd5eec8348f696b0dbe29a743e28280a280f35b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b612eec836154ee565b600019810191908211612ecd578560005260cb8552604060002054828103612f39575b50856000526000604081205560005260ca8452604060002090600052835260006040812055612d8d565b8160005260ca865260406000208360005286526040600020548260005260ca875260406000208260005287528060406000205560005260cb865260406000205538612f0f565b503461041857612f8e36613dd2565b60405191602083019383851067ffffffffffffffff8611176110b257610810946040528584526156e3565b503461041857806003193601126104185760206001600160a01b036101325416604051908152f35b5034610418576020366003190112610418576004359060ff821680920361113e5760408160209361ffff935261013f8452205416604051908152f35b5034610418578060031936011261041857602061014754604051908152f35b5080600319360112610418576101495460081c60ff161561315f573381526101446020526130726002604083200154341461496b565b338152610144806020526040822054906001600160a01b038061013b5416803b156107ca576040516340c10f1960e01b8152336004820152602481018590529085908290604490829084905af1801561315457613141575b508380808093610143541634905af16130e16149b6565b50156107ce573383526101466020526040832060ff198154169055602052600060026040842082815584600182015501556040519081527f5f8d49c18052233b73a9d4894806a0dfb373996a18a604b3ef29ae8dd2d789a460203392a280f35b61314d90949194613e23565b92386130ca565b6040513d87823e3d90fd5b33815261014460205261318b61318461ffff6001604085200154166101485490614733565b341461496b565b613072565b5034610418576040366003190112610418576108106131ad613da6565b6001600160a01b036131bd613ee5565b916131c6613fe2565b168352610142602052604083209060ff801983541691151516179055565b50346104185760403660031901126104185760043567ffffffffffffffff8082116107ce57366023830112156107ce5781600401359261322384613ead565b916132316040519384613e8b565b8483526020938484016024809760051b830101913683116107ca578701905b8282106133865750505084359081116107d257366023820112156107d25780600401359061327d82613ead565b9161328b6040519384613e8b565b808352868684019160051b830101913683116107ca5787879101915b83831061336e57505050506132ba613fe2565b815b835181101561336a5760ff806132d28387614608565b5116845261013f80875261ffff8060408720541661332757908392916132fb6133229587614608565b5116916133088489614608565b511686528752604085209061ffff1982541617905561421a565b6132bc565b60648860168b6040519262461bcd60e51b845260048401528201527f4d756c7469706c69657220616c726561647920736574000000000000000000006044820152fd5b8280f35b819061337984613ed6565b81520191019086906132a7565b813560ff8116810361339f578152908601908601613250565b8580fd5b5034610418578060031936011261041857602090604051908152f35b503461041857806003193601126104185760206001600160a01b036101345416604051908152f35b5034610418576040366003190112610418576020612455613406613da6565b60243590615417565b5034610418578060031936011261041857602060ff6101495460081c166040519015158152f35b503461041857602036600319011261041857613450613fe2565b60043561013c5580f35b5034610418576020366003190112610418576040906001600160a01b0361347f613da6565b168152610140602090815291902080546001909101546040805169ffffffffffffffffffff909316835292820152f35b5034610418576108106134c136613dd2565b916134d46134cf8433615794565b615627565b828552609d6020526134ed60ff60408720541615615698565b615a36565b503461041857806003193601126104185760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b5034610418578060031936011261041857602060cc54604051908152f35b503461041857806003193601126104185760206001600160a01b036101365416604051908152f35b50346104185760803660031901126104185761358d613da6565b50613596613dbc565b5060643567ffffffffffffffff8082116107ce57366023830112156107ce5781600401359081116107ce5736910160240111610418576020604051630a85bd0160e11b8152f35b50346104185780600319360112610418576001600160a01b03806101335416908133036107ce57610138918254926136148461421a565b905581610135541660c08361013454166044604051809481937f422e2e9900000000000000000000000000000000000000000000000000000000835289600484015260248301525afa9081156131545785916137c6575b508392613763847f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de946137596137bb9560408b8560209d526101378d52209065ffffffffffff808251168354906bffffffffffff0000000000008f85015160301b1671ffffffffffff00000000000000000000000060408601519165ffffffffffff60901b606088015160901b16937fffff00000000000000000000000000000000000000000000000000000000000065ffffffffffff60c01b60808a015160c01b16961617179160601b16171717835560a0600184019201511665ffffffffffff19825416179055614306565b936065541661583b565b6040519182918291909160a060c08201938165ffffffffffff91828151168552826020820151166020860152826040820151166040860152826060820151166060860152826080820151166080860152015116910152565b0390a2604051908152f35b905060c0813d8211613895575b816137e060c09383613e8b565b810103126107ca578392613763847f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de9461375960209960406137bb9761388060a083519261382d84613e07565b613836816142f3565b84528f6138449082016142f3565b60208501526138548582016142f3565b85850152613864606082016142f3565b6060850152613875608082016142f3565b6080850152016142f3565b60a0820152975050995050945050509261366b565b3d91506137d3565b5034610418578060031936011261041857602061014854604051908152f35b5034610418576020366003190112610418576138d6613da6565b6138de613fe2565b6001600160a01b0361013b91166001600160a01b031982541617905580f35b50346104185760203660031901126104185761ffff60406020926001600160a01b03613927613da6565b1681526101458452205416604051908152f35b5034610418578060031936011261041857602060ff6101495416604051908152f35b503461041857604036600319011261041857613976613da6565b60243590613983826155c3565b6001600160a01b039081808216931692808414613a73573314908115613a61575b50156139f757828452609b60205260408420826001600160a01b03198254161790556139cf836155c3565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b613a6d91503390614163565b386139a4565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346104185760203660031901126104185760206126766004356155e5565b503461041857806003193601126104185760206001600160a01b036101335416604051908152f35b50346104185780600319360112610418576040519080609754613b4681614082565b80855291600191808316908115611a115750600114613b6f57610a54856119a281870382613e8b565b9250609783527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff95b828410613bb25750505081016020016119a282610a54611992565b80546020858701810191909152909301928101613b97565b5034610418578060031936011261041857602061013e54604051908152f35b5034610418576020366003190112610418576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036107d257807f780e9d630000000000000000000000000000000000000000000000000000000060209214908115613c61575b506040519015158152f35b7f80ac58cd00000000000000000000000000000000000000000000000000000000811491508115613cc5575b8115613c9b575b5082613c56565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482613c94565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150613c8d565b5034610418576020366003190112610418576004356001600160a01b0381168091036107d25760207f6e66ab22238a5471005895947c8f57db923c2a9c9c73180eff80864c21295c1b91613d41613fe2565b610134816001600160a01b0319825416179055604051908152a180f35b60005b838110613d715750506000910152565b8181015183820152602001613d61565b90602091613d9a81518092818552858086019101613d5e565b601f01601f1916010190565b600435906001600160a01b038216820361113e57565b602435906001600160a01b038216820361113e57565b606090600319011261113e576001600160a01b0390600435828116810361113e5791602435908116810361113e579060443590565b60c0810190811067ffffffffffffffff8211176110b257604052565b67ffffffffffffffff81116110b257604052565b6040810190811067ffffffffffffffff8211176110b257604052565b60a0810190811067ffffffffffffffff8211176110b257604052565b6060810190811067ffffffffffffffff8211176110b257604052565b90601f8019910116810190811067ffffffffffffffff8211176110b257604052565b67ffffffffffffffff81116110b25760051b60200190565b6004359061ffff8216820361113e57565b359061ffff8216820361113e57565b60243590811515820361113e57565b9181601f8401121561113e5782359167ffffffffffffffff831161113e576020808501948460051b01011161113e57565b90815180825260208080930193019160005b828110613f45575050505090565b835185529381019392810192600101613f37565b90815180825260208080930193019160005b828110613f79575050505090565b8351151585529381019392810192600101613f6b565b67ffffffffffffffff81116110b257601f01601f191660200190565b929192613fb782613f8f565b91613fc56040519384613e8b565b82948184528183011161113e578281602093846000960137010152565b6001600160a01b03606554163303613ff657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554906001600160a01b0380911691826001600160a01b0319821617606555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b90600182811c921680156140b2575b602083101461409c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691614091565b8181106140c7575050565b600081556001016140bc565b156140da57565b608460405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b9081602091031261113e57516001600160a01b038116810361113e5790565b6001600160a01b03918260208161013a5416936024604051809481937fc455279100000000000000000000000000000000000000000000000000000000835216968760048301525afa91821561420e5784916000936141ee575b5016921682146141e757600052609c60205260406000209060005260205260ff6040600020541690565b5050600190565b61420791935060203d81116114e4576114d68183613e8b565b91386141bd565b6040513d6000823e3d90fd5b6000198114612ecd5760010190565b919081101561070b5760051b0190565b91908203918211612ecd57565b1561424d57565b606460405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152fd5b60208183031261113e5780519067ffffffffffffffff821161113e570181601f8201121561113e5780516142c481613f8f565b926142d26040519485613e8b565b8184526020828401011161113e576142f09160208085019101613d5e565b90565b519065ffffffffffff8216820361113e57565b9060405161431381613e07565b60a08193600181549165ffffffffffff83818095168752818160301c166020880152818160601c166040880152818160901c16606088015260c01c166080860152015416910152565b6001600160a01b039081610136541690602460c06040938451928380927ff0503e800000000000000000000000000000000000000000000000000000000082528960048301525afa80156145fd57908592916000808193828391849561453f575b50938896936144da936144e497937f696aadb627398b697f0ea989310032d3adad06fa74dc9b20b5a0343f14acc7c19c9a9761453a9c51956143fe87613e07565b65ffffffffffff8095168752846020880194168452848c8801911681528460608801921682528460808801931683528460a088019616865289600052610137602052848c6000209751167fffff00000000000000000000000000000000000000000000000000000000000065ffffffffffff60c01b65ffffffffffff60901b71ffffffffffff0000000000000000000000006bffffffffffff0000000000008c54995160301b16955160601b16955160901b16955160c01b169516171717171783556001830191511665ffffffffffff19825416179055614306565b946065541661583b565b519182918291909160a060c08201938165ffffffffffff91828151168552826020820151166020860152826040820151166040860152826060820151166060860152826080820151166080860152015116910152565b0390a2565b96975050505091505060c0823d82116145f5575b8161456060c09383613e8b565b810103126104185750916144e4857f696aadb627398b697f0ea989310032d3adad06fa74dc9b20b5a0343f14acc7c195936144da866145a161453a986142f3565b906145ae602082016142f3565b6145b98883016142f3565b6145c5606084016142f3565b936145de60a06145d7608087016142f3565b95016142f3565b909291949390979a9c5093975093509396986143bd565b3d9150614553565b83513d6000823e3d90fd5b805182101561070b5760209160051b010190565b61ffff809116908114612ecd5760010190565b3561ffff8116810361113e5790565b1561464557565b606460405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b91908201809211612ecd57565b90916040602092828482018583525201929160005b8281106146b9575050505090565b90919293828060019261ffff6146ce89613ed6565b168152019501939291016146ab565b61010060028154146146ef5760029055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b81810292918115918404141715612ecd57565b69ffffffffffffffffffff9182169082160391908211612ecd57565b60009069ffffffffffffffffffff9161013d908382541680151590816148fc575b501561488a5750826001600160a01b03915416911691826000526127106147db620151806147c361014094856020526121a2816040600020541688614746565b04856000528360205260016040600020015490614733565b049260005260205260406000209069ffffffffffffffffffff198254161790555b806148045750565b6001600160a01b0361013b5416803b1561113e576040516340c10f1960e01b815233600482015260248101839052906000908290604490829084905af1801561420e5761487b575b506040519081527f5f8d49c18052233b73a9d4894806a0dfb373996a18a604b3ef29ae8dd2d789a460203392a2565b61488490613e23565b3861484c565b92916001600160a01b03915016918281526127106148d5610140928360205260016040620151806148c361076989848720541642614239565b04928881528660205220015490614733565b0492600052602052604060002090421669ffffffffffffffffffff198254161790556147fc565b9050421138614783565b9061491082613ead565b61491d6040519182613e8b565b828152809261492e601f1991613ead565b0190602036910137565b61ffff16600052609d60205260ff6040600020541660001461495957600190565b600090565b8015612ecd576000190190565b1561497257565b606460405162461bcd60e51b815260206004820152601860248201527f56616c7565206d75737420657175616c2070656e616c747900000000000000006044820152fd5b3d156149e1573d906149c782613f8f565b916149d56040519384613e8b565b82523d6000602084013e565b606090565b6149f76001600160601b03916154ee565b614a6b604051614a0681613e6f565b602781527f766f746573546f44656c65676174653a20616d6f756e7420657863656564732060208201527f393620626974730000000000000000000000000000000000000000000000000060408201526c0100000000000000000000000083106153e7565b1690565b6000805260fc6020527f3d65bc8af043c3492e2efc328ab30f794c3cc5eba72564adef73ad45ad4ac2ea546001600160a01b0316806142f05750600090565b6001600160a01b0380821660005260fc602052604060002054168015600014614ad5575090565b905090565b63ffffffff9081166000190191908211612ecd57565b63ffffffff9182169082160391908211612ecd57565b43821015614cc4576001600160a01b031660009080825260209160fe835263ffffffff91604092808484205416918215614cba5760fd9081875285852083614b4d86614ada565b1686528752878387872054161115614c935780855281875285852085805287528783878720541611614c885796614b848594614ada565b83851684821611614baf5750506001600160601b0396845285528383209116825283522054901c1690565b9190959396949297614bd3637fffffff614bc98a86614af0565b60011c1684614af0565b8185528287528585208a8216865287528585208651999082908b890167ffffffffffffffff81118d821017614c7457895254808d16808d52908a1c6001600160601b039081169c8b019c8d529c9594939291908b8103614c3e57505050505050505050505050511690565b90929496989a9c508c91939597999b5010600014614c62575050935b979097614b84565b909550614c6f9150614ada565b614c5a565b602489634e487b7160e01b81526041600452fd5b505050509250505090565b6001600160601b03975084528552614cad84842092614ada565b16825283522054901c1690565b5050509250505090565b608460405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152fd5b9190614d3983614aae565b926001600160a01b03918282169060009382855260209660fc8852614da06040958688208486169481866001600160a01b031981945416179055841680977f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f8b80a46149e6565b938281141580614f8d575b614dbb575b505050505050509050565b80614ebc575b505080614dd0575b8080614db0565b845260fe86528284205463ffffffff90811692908315614e935760fd885284862090614dfb85614ada565b16865287527f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77736001600160601b0385872054891c16945b5197614e3d89613e37565b8089528801526001600160601b03808086169216820195818711614e7f575096614e6f91614e749798871610156153e7565b615185565b803880808080614dc9565b80634e487b7160e01b602492526011600452fd5b507f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77738594614e32565b865260fe88528486205463ffffffff908116908115614f855760fd8a5286882090614ee683614ada565b16885289526001600160601b03868820548a1c16905b865192614f0884613e6f565b602184527f5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f778b850152607360f81b888501526001600160601b0393848416614f56868a1692828411156153e7565b03938411614f715790614f6a939291615185565b3880614dc1565b602489634e487b7160e01b81526011600452fd5b508690614efc565b506001600160601b0385161515614dab565b906001600160a01b0380821690831692818414158061517d575b614fc4575b50505050565b8394929361509b575b508091929350614fe0575b808293614fbe565b600090815260209260fe845263ffffffff80604084205416908115156000146150935760fd8652604084209061501583614ada565b16845285526001600160601b036040842054861c16915b7f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77736040519661505a88613e37565b8088528701526001600160601b03808416906001820195818711614e7f575096614e6f9161508c9798871610156153e7565b8038614fd8565b50829161502c565b600094855260fe602052604085205463ffffffff9081169081156151755760fd60205260408720906150cc83614ada565b1687526020526001600160601b03604087205460201c16905b604051926150f284613e6f565b602184527f5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f776020850152607360f81b60408501526001600160601b03936151408585169182600111156153e7565b60001901938411615161576151589495969750615185565b90829138614fcd565b602488634e487b7160e01b81526011600452fd5b5085906150e5565b506001614fb9565b9060409283519161519583613e6f565b602e83526151f66020937f5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065858201527f78636565647320333220626974730000000000000000000000000000000000008782015264010000000043106153e7565b63ffffffff804316818316801515806153b3575b156152b1575050916001600160a01b0393918593857fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72498971660005260fd84526152578760002092614ada565b1660005282526152978786600020906fffffffffffffffffffffffff0000000082549160201b16906fffffffffffffffffffffffff000000001916179055565b8451966001600160601b03809216885216908601521692a2565b87519350919083880167ffffffffffffffff8111858210176110b257885283528483019160016001600160601b0391828b16855261534e6001600160a01b038a169660009488865260fd8b528c86208487528b52868d87209251169763ffffffff19988984541617835551166fffffffffffffffffffffffff0000000082549160201b16906fffffffffffffffffffffffff000000001916179055565b019382851161539f579188826001600160a01b039896947fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7249b9a9896945260fe875220921690825416179055615297565b602482634e487b7160e01b81526011600452fd5b506001600160a01b03871660005260fd865287600020836153d386614ada565b16600052865281838960002054161461520a565b156153ef5750565b6154139060405191829162461bcd60e51b8352602060048401526024830190613d81565b0390fd5b615420816154ee565b82101561544d576001600160a01b031660005260ca60205260406000209060005260205260406000205490565b608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152fd5b60cc5481101561070b5760cc6000527f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe0190600090565b6001600160a01b0316801561550e57600052609a60205260406000205490565b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b1561557f57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260996020526001600160a01b03604060002054166142f0811515615578565b61560d6156088260005260996020526001600160a01b0360406000205416151590565b615578565b600052609b6020526001600160a01b036040600020541690565b1561562e57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b1561569f57565b606460405162461bcd60e51b815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152fd5b906157229392916156f76134cf8433615794565b82600052609d60205261571260ff6040600020541615615698565b61571d838383615a36565b615c9c565b1561572957565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b61579d826155c3565b916001600160a01b03908183169282851684149485156157dd575b505083156157c7575b50505090565b6157d3919293506155e5565b16143880806157c1565b6157e8929550614163565b9238806157b8565b156157f757565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b906001600160a01b03808216928315615981576158776158718660005260996020526001600160a01b0360406000205416151590565b156157f0565b60cc5460009386855260209060cd825260409280848820556801000000000000000081101561596d57609992916158bb8a612d728460016158f4960160cc556154b7565b6158c4816154ee565b89895260ca8452858920818a5284528a868a20558a895260cb845285892055612e1f6158ee614a6f565b91614aae565b6159176158718960005260996020526001600160a01b0360406000205416151590565b868652609a815282862060018154019055878652528320846001600160a01b031982541617905516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90848382848180a480a4565b602487634e487b7160e01b81526041600452fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b156159cc57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b615a5a91615a43846155c3565b6001600160a01b03938484169391851684146159c5565b838216938415615c33578380615b79575060cc548660005260cd60205280604060002055680100000000000000008110156110b257615ace93612e1f6158ee8795615ab28b612d72876001615abe990160cc556154b7565b868a03615b4757614aae565b615ac7866155c3565b16146159c5565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000848152609b602052604081206001600160a01b031990818154169055838252609a6020526040822060001981540190558482526040822060018154019055858252609960205284604083209182541617905580a4565b615b50846154ee565b604060008c815260ca6020528181208382526020528d828220558d815260cb6020522055614aae565b91858303615b95575b615ace93612e1f6158ee615abe93615ab2565b9150615ba0826154ee565b6000198101908111612ecd57615ace93612e1f6158ee8795615abe948b600091818352602060cb815260409283852054838103615bfc575b50845283838120558a845260ca815282842091845252812055935050509350615b82565b8c865260ca83528486208487528352848620548d875260ca845285872082885284528086882055865260cb83528486205538615bd8565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b91926000929190813b15615e0d57602091615cf39185604051958680958194630a85bd0160e11b9b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190613d81565b0393165af190829082615dad575b5050615d8757615d0f6149b6565b80519081615d825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211615e05575b81615dc960209383613e8b565b810103126107d25751907fffffffff00000000000000000000000000000000000000000000000000000000821682036104185750903880615d01565b3d9150615dbc565b505050505060019056fea26469706673582212206e9f81b388d75d032901f5df225133312c32dd0b6a9720db66d963fc5a42230e64736f6c63430008110033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c806301b9a39714613cef57806301ffc9a714613be957806305dd1fd414613bca57806306fdde0314613b245780630754617214613afc578063081812fc14613add578063095ea7b31461395c57806309b32b571461393a5780630cd58089146138fd5780630dd64a35146138bc5780630edd2ffc1461389d5780631249c58b146135dd578063150b7a02146135735780631570bc0d1461354b57806318160ddd1461352d57806320606b70146134f257806323b872dd146134af57806325ea33801461345a578063286e323a146134365780632d7d681b1461340f5780632f745c59146133e7578063303e74df146133bf578063313ce567146133a3578063358a5fb8146131e45780633697e5631461319057806336b69dd11461303c5780633ade115c1461301d5780633b1263a114612fe15780633b7cb63314612fb957806342842e0e14612f7f57806342966c6814612cfd5780634452272914612ca8578063454b060814612c215780634c89167114612a905780634f6ccce7146129ee57806357c1af93146127c1578063587cde1e1461279d5780635ac1e3bb146126c25780635c19a95c146126875780636352211e1461265757806365701bec1461261957806367064d4c146125c8578063684931ed146125a05780636db18a15146125735780636e48de57146125545780636eee550c1461249b5780636fcfff451461245d57806370a0823114612431578063715018a6146123d5578063728c18de14612362578063782d6fe11461233a5780637ecebe00146123025780637f6fd6701461210c5780638da5cb5b146120e55780638e659c0814611a3b57806395d89b41146119565780639ab4972314611697578063a22cb465146115c1578063a32b9d831461152f578063a431b3d4146114f6578063ae994fa914611412578063b4b5ea5714611392578063b50cbd9f1461136a578063b88d4fde14611309578063baedc1c414611172578063c2263cc714611143578063c3cda52014610e09578063c87b56dd14610ccf578063c902461114610cb0578063d50b31eb14610c41578063d941cee414610ba9578063dcbf0b5514610b67578063df90ebe814610b3c578063e1ef8bbc14610b14578063e7a324dc14610ad9578063e8a3d485146109c5578063e9580e9114610990578063e985e9c514610959578063f0503e80146108ea578063f1127ed81461087d578063f2fde38b146107d6578063f5453f2f1461041b5763fca3b5aa146103ae57600080fd5b34610418576020366003190112610418577fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a60206001600160a01b036103f2613da6565b6103fa613fe2565b16610133816001600160a01b0319825416179055604051908152a180f35b80fd5b5034610418576020806003193601126107d257610436613ec5565b338352610142825260ff604084205416156107ce575a9161ffff80921692838552609d825260ff604086205416156107ca576001600160a01b03610479856155c3565b8669ffffffffffffffffffff61013d8181541680151590816107c0575b50156107385790816127106104ef8960016040866104d4985416988b8b16998a8252620151806104e06101409b8c938489528c878720541690614746565b8b61013c549116614733565b04948b83525220015490614733565b04848c52610144895261050760408d20918254614689565b905554169189528552604088209069ffffffffffffffffffff198254161790555b16938486526101449384845260018060408920018054908361054b81841661461c565b1661ffff19809316179055838952609d8652604089209060ff1991828154169055888a52610145875260408a20908154908561058881841661461c565b169116179055878952868652828260408b200154166101475410610721575b50604051906105b582613e37565b808252858201918636843780511561070b57919092849389958352848b52610137885260ff60408c2054168b5261013f88528a610607826040858185205416938a81526101408d522001918254614239565b905561013e610616815461495e565b9055858b52610141885260408b2061062e815461495e565b90556040519388850190898652518091526040850193928c905b8a8383106106f15750505050505093837f419510483a9bac83d5227ec93c06e4f9af4f3c4bb30700d75845e7ec06dffd9060406106c8956106d5977f0745a69f4abc5431da1472d508586663efcf0cf9f7398802b8bdf63e27eb17f8876106c19860649c0390a28151908152428a820152a25a90614239565b3a90614733565b60ff610149541690614733565b04928452526106ec60026040842001918254614689565b905580f35b8551821687528d9950958601959094019390830190610648565b634e487b7160e01b600052603260045260246000fd5b61014686528160408a2091825416179055386105a7565b509050828216808952610140908187526127106107848b60016040620151806107736107698a848720541642614239565b61013c5490614733565b0492868152878d5220015490614733565b04818b52610144885261079c60408c20918254614689565b9055895285526040882090421669ffffffffffffffffffff19825416179055610528565b9050421138610496565b8480fd5b8280fd5b5080fd5b5034610418576020366003190112610418576107f0613da6565b6107f8613fe2565b6001600160a01b03811615610813576108109061403a565b80f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b503461041857604036600319011261041857610897613da6565b60243563ffffffff918282168092036108e6576040936001600160a01b03859216815260fd60205220906000526020526001600160601b0382600020548351928116835260201c166020820152f35b8380fd5b503461041857602036600319011261041857604060c091600435815261013760205220600181549165ffffffffffff91829101541690604051928181168452818160301c166020850152818160601c166040850152818160901c166060850152841c16608083015260a0820152f35b5034610418576040366003190112610418576020610986610978613da6565b610980613dbc565b90614163565b6040519015158152f35b50346104185760203660031901126104185760206109b46109af613da6565b6149e6565b6001600160601b0360405191168152f35b5034610418578060031936011261041857604051906020907f697066733a2f2f00000000000000000000000000000000000000000000000000828401528281610139928354610a1381614082565b94600191808316908115610ab45750600114610a58575b505050610a40925003601f198101845283613e8b565b610a54604051928284938452830190613d81565b0390f35b8252909150847f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f65b858410610a9c57505050506027610a4092820101388080610a2a565b80548885016027015287945092019185908201610a80565b9250505060279250610a4094915060ff19168284015280151502820101388080610a2a565b503461041857806003193601126104185760206040517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8152f35b503461041857806003193601126104185760206001600160a01b036101435416604051908152f35b5034610418578060031936011261041857610b556146dd565b610b5e33614762565b60016101005580f35b5034610418576020366003190112610418576001600160a01b03610b89613da6565b610b91613fe2565b16815261014660205260408120805460ff1916905580f35b50346104185760203660031901126104185760043569ffffffffffffffffffff81168082036107ce577f8418510ee1b4493b8fffec3221f57d7d58974f8faef99a9752f9c7eb41ad4d2991610c3b91610c00613fe2565b61013d805469ffffffffffffffffffff191690911790556040805169ffffffffffffffffffff92909216825242602083015290918291820190565b0390a180f35b5034610418576020366003190112610418576004356001600160a01b0381168091036107d25760207fb3025222d01ce9a26c7f9d52bc3bfd0352366bd90a793c273fbfe1c81e0e288e91610c93613fe2565b610135816001600160a01b0319825416179055604051908152a180f35b5034610418578060031936011261041857602061013c54604051908152f35b503461041857602036600319011261041857610daf81600435610d10610d0b8260005260996020526001600160a01b0360406000205416151590565b614246565b6001600160a01b03610134541681835261013760205260408320916040518095819482937f426381210000000000000000000000000000000000000000000000000000000084526004840190929160c09060e08301948352600181549165ffffffffffff83818095166020880152818160301c166040880152818160601c166060880152818160901c166080880152851c1660a0860152015416910152565b03915afa908115610dfe5782610a549392610ddb575b5050604051918291602083526020830190613d81565b610df792503d8091833e610def8183613e8b565b810190614291565b3880610dc5565b6040513d84823e3d90fd5b50346104185760c036600319011261041857610e23613da6565b90602435916044356064359060ff821680920361113e576040519484926097549387610e4e86614082565b918282526020998a91828201946001998a8116908160001461112257506001146110c8575b50610e8092500382613e8b565b51902060405190888201907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866825260408301524660608301526080913083820152828152610ecd81613e53565b51902090604051958987017fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81526001600160a01b0397888a1660408201528660608201528784820152838152610f2381613e53565b51902090604051918b8301947f1901000000000000000000000000000000000000000000000000000000000000865260228401526042830152604282528282019180831067ffffffffffffffff8411176110b2578b958b958460405282519020845260a082015260843560c082015260e060a4359101528380525afa156110a7578451928316801561106457855260ff86526040852090815491610fc68361421a565b905503611020574211610fdd579061081091614d2e565b6064846040519062461bcd60e51b825280600483015260248201527f64656c656761746542795369673a207369676e617475726520657870697265646044820152fd5b6064856040519062461bcd60e51b82526004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e6365000000006044820152fd5b6064876040519062461bcd60e51b825280600483015260248201527f64656c656761746542795369673a20696e76616c6964207369676e61747572656044820152fd5b6040513d86823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b60978c528b9150897f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff95b82841061110b5750505091610e80928201018b92610e73565b8054878501870152869450928501928b91016110f2565b60ff19168752508c9390151560051b8301019050610e80610e73565b600080fd5b50346104185760203660031901126104185760ff60406020926004358152609d84522054166040519015158152f35b503461041857602090816003193601126104185767ffffffffffffffff916004358381116107ce57366023820112156107ce576111b9903690602481600401359101613fab565b926111c2613fe2565b83519081116112f557610139916111d98354614082565b601f811161129d575b5080601f831160011461121d5750839482939492611212575b50508160011b916000199060031b1c191617905580f35b0151905038806111fb565b838552601f198316957f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6929186905b8882106112855750508360019596971061126c575b505050811b01905580f35b015160001960f88460031b161c19169055388080611261565b8060018596829496860151815501950193019061124c565b6112e590846000527f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6601f850160051c8101918486106112eb575b601f0160051c01906140bc565b386111e2565b90915081906112d8565b602483634e487b7160e01b81526041600452fd5b503461041857608036600319011261041857611323613da6565b61132b613dbc565b6064359167ffffffffffffffff83116108e657366023840112156108e657611360610810933690602481600401359101613fab565b91604435916156e3565b503461041857806003193601126104185760206001600160a01b0361013a5416604051908152f35b50346104185760209081600319360112610418576001600160a01b036113b6613da6565b16815260fe8252604081205463ffffffff90811691821561140a5760406113e29160fd86522092614ada565b1660005281526001600160601b03604060002054821c166001600160601b0360405191168152f35b9150506109b4565b5034610418576020806003193601126107d25760043567ffffffffffffffff81116107ce57611445903690600401613ef4565b9161144e613fe2565b835b83811061145b578480f35b6001600160a01b0361013654169082611475828787614229565b356024604051809581936331a9108f60e11b835260048301525afa9182156114eb576001926114b89188916114be575b506114b1838888614229565b359061435c565b01611450565b6114de9150853d87116114e4575b6114d68183613e8b565b810190614144565b386114a5565b503d6114cc565b6040513d88823e3d90fd5b50346104185760203660031901126104185760406020916001600160a01b0361151d613da6565b16815261014183522054604051908152f35b50346104185760203660031901126104185760043567ffffffffffffffff81116107d257611561903690600401613ef4565b61156a81614906565b925b8181106115895760405160208082528190610a5490820187613f59565b806115a86115a361159e6115bc948688614229565b61462f565b614938565b6115b28287614608565b901515905261421a565b61156c565b5034610418576040366003190112610418576115db613da6565b6001600160a01b036115eb613ee5565b91169081331461165357338352609c60205260408320826000526020526116228160406000209060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b503461041857602090816003193601126104185760043567ffffffffffffffff81116107d2576116cb903690600401613ef4565b6116d36146dd565b338352610146845260ff9081604085205416611912576116f233614762565b61ffff928382169285865b868116918683101561188a578761171861159e858989614229565b168952609d90818b528460408b205416611846576117576001600160a01b0361174f8b61174961159e898d8d614229565b166155c3565b16331461463e565b8861176661159e868a8a614229565b168a526101378b528460408b2054168a5261013f8b528860408b2054169182156118025761159e6117c66117fd95948c948f8f6117ce966040928f8f61159e8f8d936117b193614229565b1683525220805460ff19166001179055614689565b958989614229565b167f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed8b604051428152a261461c565b6116fd565b60648c6040519062461bcd60e51b82526004820152600b60248201527f436f6e74616374204465760000000000000000000000000000000000000000006044820152fd5b60648b6040519062461bcd60e51b82526004820152600e60248201527f416c7265616479205374616b65640000000000000000000000000000000000006044820152fd5b847f5d5bd8d660edcbaa77f1a24c595f7da61a2a9e6bbf3fa36711927c85cba8d483611906888a6101418f8f9733895261014082526118d1600160408b2001918254614689565b905533885252604086206118e6828254614689565b90556118f661013e918254614689565b9055604051918291339583614696565b0390a260016101005580f35b6064856040519062461bcd60e51b82526004820152601b60248201527f506c6561736520636c61696d2070656e616c74792072657761726400000000006044820152fd5b5034610418578060031936011261041857604051908060985461197881614082565b80855291600191808316908115611a1157506001146119b6575b610a54856119a281870382613e8b565b604051918291602083526020830190613d81565b9250609883527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d8145b8284106119f95750505081016020016119a282610a54611992565b805460208587018101919091529093019281016119de565b869550610a54969350602092506119a294915060ff191682840152151560051b8201019293611992565b50346104185761010036600319011261041857611a56613da6565b611a5e613dbc565b90604435906001600160a01b038216820361113e576064356001600160a01b038116810361113e576084356001600160a01b038116810361113e5760a435916001600160a01b038316830361113e5760e435946001600160a01b038616860361113e5787549660ff8860081c1615978880996120d8575b80156120c1575b156120575760ff1981166001178a5588612046575b50604051611afe81613e37565b600881527f5377656570657273000000000000000000000000000000000000000000000000602082015260405190611b3582613e37565b600782527f53574545504552000000000000000000000000000000000000000000000000006020830152611b7860ff8c5460081c16611b73816140d3565b6140d3565b80519067ffffffffffffffff8211612032578190611b97609754614082565b601f8111611fe3575b50602090601f8311600114611f5b578d92611f50575b50508160011b916000199060031b1c1916176097555b80519067ffffffffffffffff8211611f3c578190611beb609854614082565b601f8111611eed575b50602090601f8311600114611e65578c92611e5a575b50508160011b916000199060031b1c1916176098555b611c3460ff8a5460081c16611b73816140d3565b611c3d3361403a565b611c5160ff8a5460081c16611b73816140d3565b6001610100556001600160a01b0319956001600160a01b036101329116878254161790556001600160a01b036101339116868254161790556001600160a01b036101349116858254161790556001600160a01b036101359116848254161790556001600160a01b0361013a9116838254161790556001600160a01b0361013691168282541617905560c43561013855610139611ced8154614082565b601f8111611df2575b50605d815584527f516d65614b78376572337445676d63347666434175394a75733979565756384b7f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6557f4d7964706d627570534b53754a310000000000000000000000000000000000007f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f755678ac7230489e8000061013c556001600160a01b0361013b92169082541617905561014961016e61ffff19825416179055611dbb5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b601f90826000520160051c7f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f6017f22d66071756d4d57920b8322c1a903a27bd75b44065e925d5f9f1c08908d28f85b818110611e4e5750611cf6565b60008155600101611e41565b015190503880611c0a565b925060988c527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d814908c935b601f1984168510611ed2576001945083601f19811610611eb9575b505050811b01609855611c20565b015160001960f88460031b161c19169055388080611eab565b81810151835560209485019460019093019290910190611e90565b611f369060986000527f2237a976fa961f5921fd19f2b03c925c725d77b20ce8f790c19709c03de4d814601f850160051c810191602086106112eb57601f0160051c01906140bc565b38611bf4565b60248b634e487b7160e01b81526041600452fd5b015190503880611bb6565b925060978d527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9908d935b601f1984168510611fc8576001945083601f19811610611faf575b505050811b01609755611bcc565b015160001960f88460031b161c19169055388080611fa1565b81810151835560209485019460019093019290910190611f86565b61202c9060976000527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9601f850160051c810191602086106112eb57601f0160051c01906140bc565b38611ba0565b60248c634e487b7160e01b81526041600452fd5b61ffff191661010117895538611af1565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b50303b158015611adc5750600160ff821614611adc565b50600160ff821610611ad5565b503461041857806003193601126104185760206001600160a01b0360655416604051908152f35b5034610418576020908160031936011261041857612128613da6565b612131816154ee565b61213a81614906565b9261214482614906565b9161214e81614906565b9161215882614906565b946201518069ffffffffffffffffffff8061013d5416801515806122f9575b156122ca57906121a26121ad926001600160a01b03861687526101408d528260408820541690614746565b61013c549116614733565b04929088915b835b8181106122365750506127106121f3610a549897956001604061221a976101406122289b986001600160a01b0361220c991683525220015490614733565b049760a06040519a8b9a8b528a015260a0890190613f25565b908782036040890152613f25565b908582036060870152613f25565b908382036080850152613f59565b829350612247816122969394615417565b8086526101378c528b60ff80604089205416885261013f8252609d61ffff60408a20541692848a525260408820541661229f575b612285838b614608565b52612290828c614608565b5261421a565b908992916121b5565b6127106122ac828a614733565b046122b7848b614608565b5260016122c4848d614608565b5261227b565b506107696122ef916001600160a01b03851686526101408c5260408620541642614239565b04929088916121b3565b50804211612177565b50346104185760203660031901126104185760406020916001600160a01b03612329613da6565b16815260ff83522054604051908152f35b50346104185760403660031901126104185760206109b4612359613da6565b60243590614b06565b50346104185760203660031901126104185761237c613da6565b6101328054916001600160a01b039182841633036107ca577f922c2392f081081ce632aa0e69aec5bec8ac0deb638f309b416a4694863ffec2936020936001600160a01b0319931692839116179055604051908152a180f35b50346104185780600319360112610418576123ee613fe2565b60006001600160a01b036065546001600160a01b03198116606555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610418576020366003190112610418576020612455612450613da6565b6154ee565b604051908152f35b50346104185760203660031901126104185763ffffffff60406020926001600160a01b03612489613da6565b16815260fe8452205416604051908152f35b5034610418576080366003190112610418576004356024359060ff821680920361113e57604435906001600160a01b0382168092036108e6576064359182151580930361113e577fbd8502b084a97b09b275fc942f493195daf138a7dd0d13c92cfb9dca8a5c44459360609361250f613fe2565b83610148556101499161ff00835492610143866001600160a01b031982541617905560081b169161ffff1916171790556040519182526020820152426040820152a180f35b50346104185760203660031901126104185760206109866115a3613ec5565b50346104185760203660031901126104185761ffff612590613ec5565b612598613fe2565b166101475580f35b503461041857806003193601126104185760206001600160a01b036101355416604051908152f35b5034610418576040366003190112610418576125e2613da6565b6001600160a01b03602435916125f6613fe2565b16825261014460205260026040832001548110156107d257600260408320015580f35b50346104185760203660031901126104185760ff60406020926001600160a01b03612642613da6565b16815261014684522054166040519015158152f35b50346104185760203660031901126104185760206126766004356155c3565b6001600160a01b0360405191168152f35b5034610418576020366003190112610418576126a1613da6565b6001600160a01b038116156126bb575b6108109033614d2e565b50336126b1565b503461041857602036600319011261041857610daf816004356126fe610d0b8260005260996020526001600160a01b0360406000205416151590565b6001600160a01b03610134541681835261013760205260408320916040518095819482937fa18f67100000000000000000000000000000000000000000000000000000000084526004840190929160c09060e08301948352600181549165ffffffffffff83818095166020880152818160301c166040880152818160601c166060880152818160901c166080880152851c1660a0860152015416910152565b50346104185760203660031901126104185760206126766127bc613da6565b614aae565b503461041857602090816003193601126104185760043567ffffffffffffffff81116107d2576127f5903690600401613ef4565b906127fe6146dd565b61280733614762565b61ffff918281169184855b8581169185831015612946578661282d61159e858888614229565b168852609d808a5260ff908160408b205416156129025761159e6128c66128fd95948b60408f8f9061013f9084998f8f8f8083836128ce9f6128896001600160a01b0361174f8f61174961159e61159e9a839d6128ad9d614229565b8661289861159e868686614229565b168b5288528a8a20805460ff19169055614229565b1684526101378252848420541683525220541690614689565b958888614229565b167f7d36527e1690deb87a193610cc1f0afb9d56ea423406c96a315ba67117f766ed8a604051428152a261461c565b612812565b60648b6040519062461bcd60e51b82526004820152600a60248201527f4e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b837f0745a69f4abc5431da1472d508586663efcf0cf9f7398802b8bdf63e27eb17f8611906878b948d8b3388526101409283835261298c600160408b2001918254614239565b905561013e61299c828254614239565b9055338852610141908183526129b760408a20918254614239565b905533885281526040872054156129d9575b5050604051918291339583614696565b526000600160408720878155015585806129c9565b50346104185760203660031901126104185760043560cc54811015612a2657612a186020916154b7565b90546040519160031b1c8152f35b608460405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152fd5b50346104185780600319360112610418576001600160a01b036101368181541660405192839283927f70a08231000000000000000000000000000000000000000000000000000000008452336004850152602093849160249687915afa9485156114eb578695612bf2575b508594605f8111612bcb575b858111612b12578680f35b828254166000198201918211612bb8576040517f2f745c5900000000000000000000000000000000000000000000000000000000815233600482015260248101839052908590829060449082905afa8015612bad578890612b7e575b612b7991503361435c565b612b07565b508481813d8311612ba6575b612b948183613e8b565b8101031261113e57612b799051612b6e565b503d612b8a565b6040513d8a823e3d90fd5b8588634e487b7160e01b81526011600452fd5b9450605e198501858111612bdf5794612b07565b8487634e487b7160e01b81526011600452fd5b9094508281813d8311612c1a575b612c0a8183613e8b565b8101031261113e57519338612afb565b503d612c00565b5034610418576020366003190112610418576024600435612c40613fe2565b60206001600160a01b036101365416604051938480926331a9108f60e11b82528560048301525afa8015612c9d57610810928491612c7f575b5061435c565b612c97915060203d81116114e4576114d68183613e8b565b38612c79565b6040513d85823e3d90fd5b50346104185760203660031901126104185760406060916001600160a01b03612ccf613da6565b16815261014460205220805490600261ffff6001830154169101549060405192835260208301526040820152f35b5034610418576020806003193601126107d257600435906001600160a01b0380610133541633036108e657612d31836155c3565b9080821680612ee3575060cc548460005260cd845280604060002055680100000000000000008110156110b25784612d72826001612d8d940160cc556154b7565b90919082549060031b600019811b9283911b16911916179055565b60cc546000199190828101908111612ecd578560005260cd8552612db6604060002054916154b7565b90549060031b1c612dca81612d72846154b7565b60005260cd8552604060002055846000526000604081205560cc548015612eb7578594612e25612e1789968660999501612e03816154b7565b8982549160031b1b1916905560cc55614aae565b612e1f614a6f565b90614f9f565b612e2e866155c3565b92868652609b825260408620936001600160a01b0319948581541690551693848652609a82526040862090815401905585855252604083209081541690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a47f1bbce8ecee5dc0a3e78c8f538fed8a0018e9efd5eec8348f696b0dbe29a743e28280a280f35b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b612eec836154ee565b600019810191908211612ecd578560005260cb8552604060002054828103612f39575b50856000526000604081205560005260ca8452604060002090600052835260006040812055612d8d565b8160005260ca865260406000208360005286526040600020548260005260ca875260406000208260005287528060406000205560005260cb865260406000205538612f0f565b503461041857612f8e36613dd2565b60405191602083019383851067ffffffffffffffff8611176110b257610810946040528584526156e3565b503461041857806003193601126104185760206001600160a01b036101325416604051908152f35b5034610418576020366003190112610418576004359060ff821680920361113e5760408160209361ffff935261013f8452205416604051908152f35b5034610418578060031936011261041857602061014754604051908152f35b5080600319360112610418576101495460081c60ff161561315f573381526101446020526130726002604083200154341461496b565b338152610144806020526040822054906001600160a01b038061013b5416803b156107ca576040516340c10f1960e01b8152336004820152602481018590529085908290604490829084905af1801561315457613141575b508380808093610143541634905af16130e16149b6565b50156107ce573383526101466020526040832060ff198154169055602052600060026040842082815584600182015501556040519081527f5f8d49c18052233b73a9d4894806a0dfb373996a18a604b3ef29ae8dd2d789a460203392a280f35b61314d90949194613e23565b92386130ca565b6040513d87823e3d90fd5b33815261014460205261318b61318461ffff6001604085200154166101485490614733565b341461496b565b613072565b5034610418576040366003190112610418576108106131ad613da6565b6001600160a01b036131bd613ee5565b916131c6613fe2565b168352610142602052604083209060ff801983541691151516179055565b50346104185760403660031901126104185760043567ffffffffffffffff8082116107ce57366023830112156107ce5781600401359261322384613ead565b916132316040519384613e8b565b8483526020938484016024809760051b830101913683116107ca578701905b8282106133865750505084359081116107d257366023820112156107d25780600401359061327d82613ead565b9161328b6040519384613e8b565b808352868684019160051b830101913683116107ca5787879101915b83831061336e57505050506132ba613fe2565b815b835181101561336a5760ff806132d28387614608565b5116845261013f80875261ffff8060408720541661332757908392916132fb6133229587614608565b5116916133088489614608565b511686528752604085209061ffff1982541617905561421a565b6132bc565b60648860168b6040519262461bcd60e51b845260048401528201527f4d756c7469706c69657220616c726561647920736574000000000000000000006044820152fd5b8280f35b819061337984613ed6565b81520191019086906132a7565b813560ff8116810361339f578152908601908601613250565b8580fd5b5034610418578060031936011261041857602090604051908152f35b503461041857806003193601126104185760206001600160a01b036101345416604051908152f35b5034610418576040366003190112610418576020612455613406613da6565b60243590615417565b5034610418578060031936011261041857602060ff6101495460081c166040519015158152f35b503461041857602036600319011261041857613450613fe2565b60043561013c5580f35b5034610418576020366003190112610418576040906001600160a01b0361347f613da6565b168152610140602090815291902080546001909101546040805169ffffffffffffffffffff909316835292820152f35b5034610418576108106134c136613dd2565b916134d46134cf8433615794565b615627565b828552609d6020526134ed60ff60408720541615615698565b615a36565b503461041857806003193601126104185760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b5034610418578060031936011261041857602060cc54604051908152f35b503461041857806003193601126104185760206001600160a01b036101365416604051908152f35b50346104185760803660031901126104185761358d613da6565b50613596613dbc565b5060643567ffffffffffffffff8082116107ce57366023830112156107ce5781600401359081116107ce5736910160240111610418576020604051630a85bd0160e11b8152f35b50346104185780600319360112610418576001600160a01b03806101335416908133036107ce57610138918254926136148461421a565b905581610135541660c08361013454166044604051809481937f422e2e9900000000000000000000000000000000000000000000000000000000835289600484015260248301525afa9081156131545785916137c6575b508392613763847f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de946137596137bb9560408b8560209d526101378d52209065ffffffffffff808251168354906bffffffffffff0000000000008f85015160301b1671ffffffffffff00000000000000000000000060408601519165ffffffffffff60901b606088015160901b16937fffff00000000000000000000000000000000000000000000000000000000000065ffffffffffff60c01b60808a015160c01b16961617179160601b16171717835560a0600184019201511665ffffffffffff19825416179055614306565b936065541661583b565b6040519182918291909160a060c08201938165ffffffffffff91828151168552826020820151166020860152826040820151166040860152826060820151166060860152826080820151166080860152015116910152565b0390a2604051908152f35b905060c0813d8211613895575b816137e060c09383613e8b565b810103126107ca578392613763847f72668fc19363598fc595447cb58bcd4c0d2d2ff22fef57d2b62cc397fb1298de9461375960209960406137bb9761388060a083519261382d84613e07565b613836816142f3565b84528f6138449082016142f3565b60208501526138548582016142f3565b85850152613864606082016142f3565b6060850152613875608082016142f3565b6080850152016142f3565b60a0820152975050995050945050509261366b565b3d91506137d3565b5034610418578060031936011261041857602061014854604051908152f35b5034610418576020366003190112610418576138d6613da6565b6138de613fe2565b6001600160a01b0361013b91166001600160a01b031982541617905580f35b50346104185760203660031901126104185761ffff60406020926001600160a01b03613927613da6565b1681526101458452205416604051908152f35b5034610418578060031936011261041857602060ff6101495416604051908152f35b503461041857604036600319011261041857613976613da6565b60243590613983826155c3565b6001600160a01b039081808216931692808414613a73573314908115613a61575b50156139f757828452609b60205260408420826001600160a01b03198254161790556139cf836155c3565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b608460405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b613a6d91503390614163565b386139a4565b608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346104185760203660031901126104185760206126766004356155e5565b503461041857806003193601126104185760206001600160a01b036101335416604051908152f35b50346104185780600319360112610418576040519080609754613b4681614082565b80855291600191808316908115611a115750600114613b6f57610a54856119a281870382613e8b565b9250609783527f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff95b828410613bb25750505081016020016119a282610a54611992565b80546020858701810191909152909301928101613b97565b5034610418578060031936011261041857602061013e54604051908152f35b5034610418576020366003190112610418576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036107d257807f780e9d630000000000000000000000000000000000000000000000000000000060209214908115613c61575b506040519015158152f35b7f80ac58cd00000000000000000000000000000000000000000000000000000000811491508115613cc5575b8115613c9b575b5082613c56565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482613c94565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150613c8d565b5034610418576020366003190112610418576004356001600160a01b0381168091036107d25760207f6e66ab22238a5471005895947c8f57db923c2a9c9c73180eff80864c21295c1b91613d41613fe2565b610134816001600160a01b0319825416179055604051908152a180f35b60005b838110613d715750506000910152565b8181015183820152602001613d61565b90602091613d9a81518092818552858086019101613d5e565b601f01601f1916010190565b600435906001600160a01b038216820361113e57565b602435906001600160a01b038216820361113e57565b606090600319011261113e576001600160a01b0390600435828116810361113e5791602435908116810361113e579060443590565b60c0810190811067ffffffffffffffff8211176110b257604052565b67ffffffffffffffff81116110b257604052565b6040810190811067ffffffffffffffff8211176110b257604052565b60a0810190811067ffffffffffffffff8211176110b257604052565b6060810190811067ffffffffffffffff8211176110b257604052565b90601f8019910116810190811067ffffffffffffffff8211176110b257604052565b67ffffffffffffffff81116110b25760051b60200190565b6004359061ffff8216820361113e57565b359061ffff8216820361113e57565b60243590811515820361113e57565b9181601f8401121561113e5782359167ffffffffffffffff831161113e576020808501948460051b01011161113e57565b90815180825260208080930193019160005b828110613f45575050505090565b835185529381019392810192600101613f37565b90815180825260208080930193019160005b828110613f79575050505090565b8351151585529381019392810192600101613f6b565b67ffffffffffffffff81116110b257601f01601f191660200190565b929192613fb782613f8f565b91613fc56040519384613e8b565b82948184528183011161113e578281602093846000960137010152565b6001600160a01b03606554163303613ff657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554906001600160a01b0380911691826001600160a01b0319821617606555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b90600182811c921680156140b2575b602083101461409c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691614091565b8181106140c7575050565b600081556001016140bc565b156140da57565b608460405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b9081602091031261113e57516001600160a01b038116810361113e5790565b6001600160a01b03918260208161013a5416936024604051809481937fc455279100000000000000000000000000000000000000000000000000000000835216968760048301525afa91821561420e5784916000936141ee575b5016921682146141e757600052609c60205260406000209060005260205260ff6040600020541690565b5050600190565b61420791935060203d81116114e4576114d68183613e8b565b91386141bd565b6040513d6000823e3d90fd5b6000198114612ecd5760010190565b919081101561070b5760051b0190565b91908203918211612ecd57565b1561424d57565b606460405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152fd5b60208183031261113e5780519067ffffffffffffffff821161113e570181601f8201121561113e5780516142c481613f8f565b926142d26040519485613e8b565b8184526020828401011161113e576142f09160208085019101613d5e565b90565b519065ffffffffffff8216820361113e57565b9060405161431381613e07565b60a08193600181549165ffffffffffff83818095168752818160301c166020880152818160601c166040880152818160901c16606088015260c01c166080860152015416910152565b6001600160a01b039081610136541690602460c06040938451928380927ff0503e800000000000000000000000000000000000000000000000000000000082528960048301525afa80156145fd57908592916000808193828391849561453f575b50938896936144da936144e497937f696aadb627398b697f0ea989310032d3adad06fa74dc9b20b5a0343f14acc7c19c9a9761453a9c51956143fe87613e07565b65ffffffffffff8095168752846020880194168452848c8801911681528460608801921682528460808801931683528460a088019616865289600052610137602052848c6000209751167fffff00000000000000000000000000000000000000000000000000000000000065ffffffffffff60c01b65ffffffffffff60901b71ffffffffffff0000000000000000000000006bffffffffffff0000000000008c54995160301b16955160601b16955160901b16955160c01b169516171717171783556001830191511665ffffffffffff19825416179055614306565b946065541661583b565b519182918291909160a060c08201938165ffffffffffff91828151168552826020820151166020860152826040820151166040860152826060820151166060860152826080820151166080860152015116910152565b0390a2565b96975050505091505060c0823d82116145f5575b8161456060c09383613e8b565b810103126104185750916144e4857f696aadb627398b697f0ea989310032d3adad06fa74dc9b20b5a0343f14acc7c195936144da866145a161453a986142f3565b906145ae602082016142f3565b6145b98883016142f3565b6145c5606084016142f3565b936145de60a06145d7608087016142f3565b95016142f3565b909291949390979a9c5093975093509396986143bd565b3d9150614553565b83513d6000823e3d90fd5b805182101561070b5760209160051b010190565b61ffff809116908114612ecd5760010190565b3561ffff8116810361113e5790565b1561464557565b606460405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b91908201809211612ecd57565b90916040602092828482018583525201929160005b8281106146b9575050505090565b90919293828060019261ffff6146ce89613ed6565b168152019501939291016146ab565b61010060028154146146ef5760029055565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b81810292918115918404141715612ecd57565b69ffffffffffffffffffff9182169082160391908211612ecd57565b60009069ffffffffffffffffffff9161013d908382541680151590816148fc575b501561488a5750826001600160a01b03915416911691826000526127106147db620151806147c361014094856020526121a2816040600020541688614746565b04856000528360205260016040600020015490614733565b049260005260205260406000209069ffffffffffffffffffff198254161790555b806148045750565b6001600160a01b0361013b5416803b1561113e576040516340c10f1960e01b815233600482015260248101839052906000908290604490829084905af1801561420e5761487b575b506040519081527f5f8d49c18052233b73a9d4894806a0dfb373996a18a604b3ef29ae8dd2d789a460203392a2565b61488490613e23565b3861484c565b92916001600160a01b03915016918281526127106148d5610140928360205260016040620151806148c361076989848720541642614239565b04928881528660205220015490614733565b0492600052602052604060002090421669ffffffffffffffffffff198254161790556147fc565b9050421138614783565b9061491082613ead565b61491d6040519182613e8b565b828152809261492e601f1991613ead565b0190602036910137565b61ffff16600052609d60205260ff6040600020541660001461495957600190565b600090565b8015612ecd576000190190565b1561497257565b606460405162461bcd60e51b815260206004820152601860248201527f56616c7565206d75737420657175616c2070656e616c747900000000000000006044820152fd5b3d156149e1573d906149c782613f8f565b916149d56040519384613e8b565b82523d6000602084013e565b606090565b6149f76001600160601b03916154ee565b614a6b604051614a0681613e6f565b602781527f766f746573546f44656c65676174653a20616d6f756e7420657863656564732060208201527f393620626974730000000000000000000000000000000000000000000000000060408201526c0100000000000000000000000083106153e7565b1690565b6000805260fc6020527f3d65bc8af043c3492e2efc328ab30f794c3cc5eba72564adef73ad45ad4ac2ea546001600160a01b0316806142f05750600090565b6001600160a01b0380821660005260fc602052604060002054168015600014614ad5575090565b905090565b63ffffffff9081166000190191908211612ecd57565b63ffffffff9182169082160391908211612ecd57565b43821015614cc4576001600160a01b031660009080825260209160fe835263ffffffff91604092808484205416918215614cba5760fd9081875285852083614b4d86614ada565b1686528752878387872054161115614c935780855281875285852085805287528783878720541611614c885796614b848594614ada565b83851684821611614baf5750506001600160601b0396845285528383209116825283522054901c1690565b9190959396949297614bd3637fffffff614bc98a86614af0565b60011c1684614af0565b8185528287528585208a8216865287528585208651999082908b890167ffffffffffffffff81118d821017614c7457895254808d16808d52908a1c6001600160601b039081169c8b019c8d529c9594939291908b8103614c3e57505050505050505050505050511690565b90929496989a9c508c91939597999b5010600014614c62575050935b979097614b84565b909550614c6f9150614ada565b614c5a565b602489634e487b7160e01b81526041600452fd5b505050509250505090565b6001600160601b03975084528552614cad84842092614ada565b16825283522054901c1690565b5050509250505090565b608460405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152fd5b9190614d3983614aae565b926001600160a01b03918282169060009382855260209660fc8852614da06040958688208486169481866001600160a01b031981945416179055841680977f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f8b80a46149e6565b938281141580614f8d575b614dbb575b505050505050509050565b80614ebc575b505080614dd0575b8080614db0565b845260fe86528284205463ffffffff90811692908315614e935760fd885284862090614dfb85614ada565b16865287527f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77736001600160601b0385872054891c16945b5197614e3d89613e37565b8089528801526001600160601b03808086169216820195818711614e7f575096614e6f91614e749798871610156153e7565b615185565b803880808080614dc9565b80634e487b7160e01b602492526011600452fd5b507f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77738594614e32565b865260fe88528486205463ffffffff908116908115614f855760fd8a5286882090614ee683614ada565b16885289526001600160601b03868820548a1c16905b865192614f0884613e6f565b602184527f5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f778b850152607360f81b888501526001600160601b0393848416614f56868a1692828411156153e7565b03938411614f715790614f6a939291615185565b3880614dc1565b602489634e487b7160e01b81526011600452fd5b508690614efc565b506001600160601b0385161515614dab565b906001600160a01b0380821690831692818414158061517d575b614fc4575b50505050565b8394929361509b575b508091929350614fe0575b808293614fbe565b600090815260209260fe845263ffffffff80604084205416908115156000146150935760fd8652604084209061501583614ada565b16845285526001600160601b036040842054861c16915b7f5f6d6f766544656c6567617465733a20616d6f756e74206f766572666c6f77736040519661505a88613e37565b8088528701526001600160601b03808416906001820195818711614e7f575096614e6f9161508c9798871610156153e7565b8038614fd8565b50829161502c565b600094855260fe602052604085205463ffffffff9081169081156151755760fd60205260408720906150cc83614ada565b1687526020526001600160601b03604087205460201c16905b604051926150f284613e6f565b602184527f5f6d6f766544656c6567617465733a20616d6f756e7420756e646572666c6f776020850152607360f81b60408501526001600160601b03936151408585169182600111156153e7565b60001901938411615161576151589495969750615185565b90829138614fcd565b602488634e487b7160e01b81526011600452fd5b5085906150e5565b506001614fb9565b9060409283519161519583613e6f565b602e83526151f66020937f5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065858201527f78636565647320333220626974730000000000000000000000000000000000008782015264010000000043106153e7565b63ffffffff804316818316801515806153b3575b156152b1575050916001600160a01b0393918593857fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72498971660005260fd84526152578760002092614ada565b1660005282526152978786600020906fffffffffffffffffffffffff0000000082549160201b16906fffffffffffffffffffffffff000000001916179055565b8451966001600160601b03809216885216908601521692a2565b87519350919083880167ffffffffffffffff8111858210176110b257885283528483019160016001600160601b0391828b16855261534e6001600160a01b038a169660009488865260fd8b528c86208487528b52868d87209251169763ffffffff19988984541617835551166fffffffffffffffffffffffff0000000082549160201b16906fffffffffffffffffffffffff000000001916179055565b019382851161539f579188826001600160a01b039896947fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7249b9a9896945260fe875220921690825416179055615297565b602482634e487b7160e01b81526011600452fd5b506001600160a01b03871660005260fd865287600020836153d386614ada565b16600052865281838960002054161461520a565b156153ef5750565b6154139060405191829162461bcd60e51b8352602060048401526024830190613d81565b0390fd5b615420816154ee565b82101561544d576001600160a01b031660005260ca60205260406000209060005260205260406000205490565b608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152fd5b60cc5481101561070b5760cc6000527f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe0190600090565b6001600160a01b0316801561550e57600052609a60205260406000205490565b608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152fd5b1561557f57565b606460405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152fd5b60005260996020526001600160a01b03604060002054166142f0811515615578565b61560d6156088260005260996020526001600160a01b0360406000205416151590565b615578565b600052609b6020526001600160a01b036040600020541690565b1561562e57565b608460405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152fd5b1561569f57565b606460405162461bcd60e51b815260206004820152601a60248201527f546f6b656e206973205374616b656420616e64204c6f636b65640000000000006044820152fd5b906157229392916156f76134cf8433615794565b82600052609d60205261571260ff6040600020541615615698565b61571d838383615a36565b615c9c565b1561572957565b60405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b61579d826155c3565b916001600160a01b03908183169282851684149485156157dd575b505083156157c7575b50505090565b6157d3919293506155e5565b16143880806157c1565b6157e8929550614163565b9238806157b8565b156157f757565b606460405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152fd5b906001600160a01b03808216928315615981576158776158718660005260996020526001600160a01b0360406000205416151590565b156157f0565b60cc5460009386855260209060cd825260409280848820556801000000000000000081101561596d57609992916158bb8a612d728460016158f4960160cc556154b7565b6158c4816154ee565b89895260ca8452858920818a5284528a868a20558a895260cb845285892055612e1f6158ee614a6f565b91614aae565b6159176158718960005260996020526001600160a01b0360406000205416151590565b868652609a815282862060018154019055878652528320846001600160a01b031982541617905516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90848382848180a480a4565b602487634e487b7160e01b81526041600452fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b156159cc57565b608460405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152fd5b615a5a91615a43846155c3565b6001600160a01b03938484169391851684146159c5565b838216938415615c33578380615b79575060cc548660005260cd60205280604060002055680100000000000000008110156110b257615ace93612e1f6158ee8795615ab28b612d72876001615abe990160cc556154b7565b868a03615b4757614aae565b615ac7866155c3565b16146159c5565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000848152609b602052604081206001600160a01b031990818154169055838252609a6020526040822060001981540190558482526040822060018154019055858252609960205284604083209182541617905580a4565b615b50846154ee565b604060008c815260ca6020528181208382526020528d828220558d815260cb6020522055614aae565b91858303615b95575b615ace93612e1f6158ee615abe93615ab2565b9150615ba0826154ee565b6000198101908111612ecd57615ace93612e1f6158ee8795615abe948b600091818352602060cb815260409283852054838103615bfc575b50845283838120558a845260ca815282842091845252812055935050509350615b82565b8c865260ca83528486208487528352848620548d875260ca845285872082885284528086882055865260cb83528486205538615bd8565b608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b91926000929190813b15615e0d57602091615cf39185604051958680958194630a85bd0160e11b9b8c84523360048501526001600160a01b0380951660248501526044840152608060648401526084830190613d81565b0393165af190829082615dad575b5050615d8757615d0f6149b6565b80519081615d825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608490fd5b602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000161490565b909192506020813d8211615e05575b81615dc960209383613e8b565b810103126107d25751907fffffffff00000000000000000000000000000000000000000000000000000000821682036104185750903880615d01565b3d9150615dbc565b505050505060019056fea26469706673582212206e9f81b388d75d032901f5df225133312c32dd0b6a9720db66d963fc5a42230e64736f6c63430008110033
Deployed Bytecode Sourcemap
1082:21042:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;9093:22;1082:21042;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;1303:62:0;;:::i;:::-;1082:21042:15;9061:16;1082:21042;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;9093:22;1082:21042;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4331:10;1082:21042;;4323:7;1082:21042;;;;;;;;;;;19782:9;1082:21042;;;;;;;;;19809:17;1082:21042;;;;;;;;;;;-1:-1:-1;;;;;19863:12:15;;;:::i;:::-;1082:21042;;19888:9;1082:21042;;;;19888:13;;;:44;;;;1082:21042;-1:-1:-1;19885:623:15;;;1082:21042;;20122:5;19989:129;1082:21042;20074:44;1082:21042;;19992:56;1082:21042;;;;;;;;;;;20065:5;19991:70;20004:13;1082:21042;;;;;;;;;;;;19992:56;;:::i;:::-;1082:21042;20052:9;1082:21042;;;19991:70;:::i;:::-;1082:21042;;;;;;;20074:44;1082:21042;19989:129;;:::i;:::-;1082:21042;;;;19948:15;1082:21042;;19948:179;1082:21042;;;;;;19948:179;:::i;:::-;1082:21042;;;;;;;;;;;;;;;;;;;;;19885:623;1082:21042;;;;;20517:15;1082:21042;;;;20517:47;1082:21042;;;;20517:47;1082:21042;;;;20517:49;1082:21042;;;20517:49;:::i;:::-;1082:21042;;;;;;;;;;;;19809:17;1082:21042;;;;;;;;;;;;;;;;;;20616:12;1082:21042;;;;;;;;;;20616:26;1082:21042;;;20616:26;:::i;:::-;1082:21042;;;;;;;;;;;;;;;;;20655:47;1082:21042;;20705:19;1082:21042;-1:-1:-1;20652:135:15;;19885:623;1082:21042;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20935:5;1082:21042;;;;;;;;;;20918:10;1082:21042;;;20870:88;1082:21042;;;;;;;;;;;;20870:13;1082:21042;;;20870:44;1082:21042;;;20870:88;:::i;:::-;1082:21042;;20969:18;;1082:21042;;20969:18;:::i;:::-;1082:21042;;;;;20997:18;1082:21042;;;;;20997:32;1082:21042;;20997:32;:::i;:::-;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21045:34;;;;;;;;21094:48;1082:21042;21197:36;21045:34;21197:54;21045:34;;;21198:20;21045:34;21255:3;21045:34;;;;1082:21042;;;;;21126:15;1082:21042;;;;21094:48;21209:9;21198:20;;:::i;:::-;21222:11;21197:36;;:::i;:::-;1082:21042;21236:15;1082:21042;;21197:54;;:::i;:::-;1082:21042;;;;;21153:105;:39;1082:21042;;;21153:39;1082:21042;;;21153:105;:::i;:::-;1082:21042;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;20652:135;20740:17;1082:21042;;;;;;;;;;;;;20652:135;;;19885:623;1082:21042;;;;;;;;;20290:13;1082:21042;;;;20408:5;20269:135;1082:21042;20360:44;1082:21042;20351:5;20271:76;20272:62;1082:21042;;;;;;20272:15;:62;:::i;:::-;20338:9;1082:21042;20271:76;;:::i;:::-;1082:21042;;;;;;;;;20360:44;1082:21042;20269:135;;:::i;:::-;1082:21042;;;;20228:15;1082:21042;;20228:185;1082:21042;;;;;;20228:185;:::i;:::-;1082:21042;;;;;;;;;20272:15;;1082:21042;;;;;;;;;19885:623;;19888:44;19905:15;;;:27;19888:44;;;1082:21042;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;1303:62:0;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;2409:22:0;1082:21042:15;;2503:8:0;;;:::i;:::-;1082:21042:15;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;1875:68:16;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;1646:62;1082:21042;;;;;;;;1646:62;;;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;5454:45;;;1082:21042;5454:45;;;1082:21042;;;5482:16;1082:21042;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5454:45;;;;;;;1082:21042;;5454:45;;;;;;:::i;:::-;1082:21042;;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;5454:45;1082:21042;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;;;5454:45;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2402:71:16;1082:21042:15;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2900:38:15;1082:21042;;;;;;;;;;;;;;;;;;;;;2471:103:2;;:::i;:::-;15315:10:15;;;:::i;:::-;1787:1:2;2065:22;1082:21042:15;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;1303:62:0;;:::i;:::-;1082:21042:15;;;13580:17;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;12534:39;1303:62:0;12534:39:15;1303:62:0;;;:::i;:::-;12499:20:15;1082:21042;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;12557:15;1082:21042;;;;;;;;;;;;12534:39;;;;1082:21042;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;9645:22;1303:62:0;;;:::i;:::-;9613:16:15;1082:21042;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;9645:22;1082:21042;;;;;;;;;;;;;;;;2064:24;1082:21042;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;8115:44;1082:21042;;;8038:60;8046:16;;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;8979:31:18;;8891:126;;8046:16:15;8038:60;:::i;:::-;-1:-1:-1;;;;;8115:10:15;1082:21042;;;;;8144:5;1082:21042;;;;;;;;8115:44;;;;;;1082:21042;8115:44;;1082:21042;8115:44;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8115:44;;;;;;;;;;;1082:21042;8115:44;;;;1082:21042;;;;;;;;;;;;;;;;:::i;8115:44::-;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;1082:21042;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4029:5:18;1082:21042:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5519:24:16;;1082:21042:15;;5491:82:16;;;;1082:21042:15;2177:80:16;1082:21042:15;;;;;;11162:53:16;1082:21042:15;;;;;5567:4:16;;1082:21042:15;;;;5491:82:16;;;;;;:::i;:::-;1082:21042:15;5468:115:16;;1082:21042:15;;;5624:57:16;;;;2402:71;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;5624:57:16;;;;;;:::i;:::-;1082:21042:15;5614:68:16;;1082:21042:15;;;5719:57:16;;;;1082:21042:15;;;;;;;;;;;;;5719:57:16;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;5709:68:16;;1082:21042:15;;;;;;;;;;;;;;;;;;5807:26:16;;;;;;;;;;1082:21042:15;;;5851:23:16;;1082:21042:15;;;;;;;;;;;;;5938:19:16;;;;:::i;:::-;1082:21042:15;;5929:28:16;1082:21042:15;;6008:15:16;:25;1082:21042:15;;6108:9:16;;;;:::i;1082:21042:15:-;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;5807:26:16;1082:21042:15;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;4029:5:18;1082:21042:15;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;2447:49:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1303:62:0;;;:::i;:::-;1082:21042:15;;;;;;;5701:37;1082:21042;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1916:35:15;1082:21042;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;6441:14:16;1082:21042:15;;;;;;;;;;;6481:16:16;;1082:21042:15;;;6521:16:16;1082:21042:15;6500:11:16;1082:21042:15;;;6521:16:16;;:::i;:::-;1082:21042:15;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;6481:67:16;;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1303:62:0;;;:::i;:::-;7099:10:15;7111:21;;;;;;1082:21042;;;7099:10;-1:-1:-1;;;;;7165:10:15;1082:21042;;7184:13;;;;;;;:::i;:::-;1082:21042;;;;7165:33;;;;-1:-1:-1;;;7165:33:15;;1082:21042;7165:33;;1082:21042;7165:33;;;;;;;1082:21042;7165:33;7200:13;7165:33;;;;;7099:10;7200:13;;;;;;:::i;:::-;1082:21042;7200:13;;:::i;:::-;1082:21042;7099:10;;7165:33;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1082:21042;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;2610:53;1082:21042;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;:::i;:::-;18305:18;;;:::i;:::-;18337:10;18349;;;;;;1082:21042;;;;;;;;;;;;;;:::i;18361:3::-;18406:7;18394:20;18406:7;;18361:3;18406:7;;;;:::i;:::-;;:::i;:::-;18394:20;:::i;:::-;18380:34;;;;:::i;:::-;1082:21042;;;;;18361:3;:::i;:::-;18337:10;;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;929:10:8;;;14996:17:18;1082:21042:15;;929:10:8;1082:21042:15;;15053:18:18;1082:21042:15;;;;;;;;;;15053:46:18;1082:21042:15;;;;;;;;;;;;;;;;;;;15053:46:18;1082:21042:15;;;;;;;15114:41:18;1082:21042:15;929:10:8;15114:41:18;;1082:21042:15;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2471:103:2;;:::i;:::-;14296:10:15;1082:21042;;14278:17;1082:21042;;;;;;;;;;;;14360:10;14296;14360;:::i;:::-;1082:21042;;;;;14428:19;;14481:12;14507:3;1082:21042;;;14495:10;;;;;;;14553:7;;;;;;;:::i;:::-;1082:21042;;;14535:17;1082:21042;;;;;;;;;;;;14594:52;-1:-1:-1;;;;;14616:16:15;14624:7;;;;;;;:::i;:::-;1082:21042;14616:16;:::i;:::-;1082:21042;14296:10;14602:30;14594:52;:::i;:::-;14687:7;;;;;;;:::i;:::-;1082:21042;;;14681:5;1082:21042;;;;;;;;;;14664:10;1082:21042;;;;;;;;14730:5;;;1082:21042;;14883:7;14812:16;14507:3;14783:7;;;;;;14883;14783;1082:21042;14783:7;;;;;;;;;;:::i;:::-;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;14794:4;1082:21042;;;14812:16;:::i;:::-;14883:7;;;;:::i;:::-;1082:21042;14860:48;1082:21042;;;14892:15;1082:21042;;14860:48;14507:3;:::i;:::-;14481:12;;1082:21042;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;14495:10;;15088:32;;14495:10;;14997:18;14495:10;;;14296;1082:21042;;14928:13;1082:21042;;14928:59;14794:4;1082:21042;;;14928:44;1082:21042;;;14928:59;:::i;:::-;1082:21042;;14296:10;1082:21042;;;;;;14997:40;1082:21042;;;14997:40;:::i;:::-;1082:21042;;15047:26;;1082:21042;;;15047:26;:::i;:::-;1082:21042;;;;14296:10;;;;15088:32;;;:::i;:::-;;;;14794:4;2065:22:2;1082:21042:15;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4193:7:18;1082:21042:15;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;4193:7:18;1082:21042:15;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;:::i;:::-;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;3290:14:1;3336:34;;;;;;1082:21042:15;3335:108:1;;;;1082:21042:15;;;;-1:-1:-1;;1082:21042:15;;;;;;;3551:65:1;;1082:21042:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;5355:69:1;1082:21042:15;;;;;;5355:69:1;;;:::i;:::-;;:::i;:::-;1082:21042:15;;;;;;;;;;;2884:13:18;1082:21042:15;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2884:13:18;1082:21042:15;;;;;;;;;;;;;2907:17:18;1082:21042:15;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2907:17:18;1082:21042:15;;5355:69:1;1082:21042:15;;;;;;5355:69:1;;;:::i;:::-;1195:12:0;929:10:8;1195:12:0;:::i;:::-;5355:69:1;1082:21042:15;;;;;;5355:69:1;;;:::i;:::-;1082:21042:15;;;-1:-1:-1;;;;;;4764:36:15;-1:-1:-1;;;;;4764:36:15;1082:21042;;;;;;;;;-1:-1:-1;;;;;4810:16:15;1082:21042;;;;;;;;;-1:-1:-1;;;;;4836:45:15;1082:21042;;;;;;;;;-1:-1:-1;;;;;4891:33:15;1082:21042;;;;;;;;;-1:-1:-1;;;;;4934:46:15;1082:21042;;;;;;;;;-1:-1:-1;;;;;4990:42:15;1082:21042;;;;;;;;;;;5042:38;1082:21042;5090:67;1082:21042;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5180:9;5168:21;1082:21042;-1:-1:-1;;;;;5199:19:15;1082:21042;;;;;;;;;5228:21;1082:21042;;;;;;;;;3636:99:1;;1082:21042:15;;3636:99:1;1082:21042:15;;;;;;;3710:14:1;1082:21042:15;;;;;;3710:14:1;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;2907:17:18;1082:21042:15;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;2907:17:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2907:17:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;2884:13:18;1082:21042:15;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;2884:13:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2884:13:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;3551:65:1;-1:-1:-1;;1082:21042:15;;;;;3551:65:1;;;1082:21042:15;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;3335:108:1;3415:4;;1476:19:7;:23;3376:66:1;;3335:108;3376:66;1082:21042:15;;;;;3425:17:1;3335:108;;3336:34;1082:21042:15;;;;;3354:16:1;3336:34;;1082:21042:15;;;;;;;;;;;;;;-1:-1:-1;;;;;1513:6:0;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16641:18;;;:::i;:::-;16685:21;;;:::i;:::-;16731;;;;:::i;:::-;16780;;;;:::i;:::-;16823:18;;;;:::i;:::-;16901:13;17068:5;1082:21042;;16927:9;1082:21042;;16927:13;;;:44;;;1082:21042;16924:285;;;1082:21042;16998:53;16997:67;1082:21042;-1:-1:-1;;;;;1082:21042:15;;;;17010:13;1082:21042;;;;;;;;16998:53;;:::i;:::-;17055:9;1082:21042;;;16997:67;:::i;:::-;1082:21042;16924:285;;;;;17223:10;17235;;;;;;1082:21042;;17697:5;17644:49;1082:21042;;;;17652:41;1082:21042;;;17652:13;1082:21042;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;17652:41;1082:21042;17644:49;;:::i;:::-;1082:21042;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;17247:3::-;17280:31;;;;;17247:3;17280:31;;;:::i;:::-;1082:21042;;;17356:5;1082:21042;;;;;;;;;;;;17339:10;1082:21042;;17396:17;1082:21042;;;;;;;;;;;;;;;;17393:146;;17247:3;17552:28;;;;:::i;:::-;1082:21042;17594:22;;;;:::i;:::-;1082:21042;17247:3;:::i;:::-;17223:10;;;;;;17393:146;17482:5;17459:19;;;;:::i;:::-;1082:21042;17438:49;;;;:::i;:::-;1082:21042;17520:4;17506:18;;;;:::i;:::-;1082:21042;17393:146;;16924:285;1082:21042;17116:59;17115:73;1082:21042;-1:-1:-1;;;;;1082:21042:15;;;;17134:13;1082:21042;;;;;;;17116:15;:59;:::i;17115:73::-;1082:21042;16924:285;;;;;;16927:44;16944:15;;;:27;16927:44;;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;2551:41:16;1082:21042:15;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;4017:16;1082:21042;;;-1:-1:-1;;;;;1082:21042:15;;;;4003:10;:30;1082:21042;;8823:42;1082:21042;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;;;;8823:42;1082:21042;;;;;;;;;;;;;;;1303:62:0;;:::i;:::-;1082:21042:15;-1:-1:-1;;;;;2765:6:0;1082:21042:15;-1:-1:-1;;;;;;1082:21042:15;;2765:6:0;1082:21042:15;;2813:40:0;;;;1082:21042:15;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;2009:48:16;1082:21042:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;13032:54;1303:62:0;1082:21042:15;1303:62:0;;;:::i;:::-;1082:21042:15;12884:18;1082:21042;12912:27;1082:21042;;;;12949:27;;1082:21042;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;13070:15;1082:21042;;;;13032:54;1082:21042;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;:::i;:::-;1303:62:0;;:::i;:::-;1082:21042:15;13339:28;1082:21042;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1515:29:15;1082:21042;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;1303:62:0;;;:::i;:::-;1082:21042:15;;;13923:15;1082:21042;;13923:36;1082:21042;;;13923:36;1082:21042;13909:50;;1082:21042;;;13923:36;1082:21042;;;13970:36;1082:21042;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;3307:49;1082:21042;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;4724:23:16;4720:51;;1082:21042:15;4810:9:16;4798:10;;4810:9;:::i;4720:51::-;-1:-1:-1;4761:10:16;4720:51;;1082:21042:15;;;;;;;-1:-1:-1;;1082:21042:15;;;;8484:43;1082:21042;;;8407:60;8415:16;;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;8979:31:18;;8891:126;;8407:60:15;-1:-1:-1;;;;;8484:10:15;1082:21042;;;;;8512:5;1082:21042;;;;;;;;8484:43;;;;;;1082:21042;8484:43;;1082:21042;8484:43;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2471:103:2;;;:::i;:::-;18670:10:15;;;:::i;:::-;1082:21042;;;;;18736:19;;18770:12;18796:3;1082:21042;;;18784:10;;;;;;;18841:7;;;;;;;:::i;:::-;1082:21042;;;18823:17;1082:21042;;;;;;;;;;;;;;19120:7;19006:59;18796:3;18921:7;;;1082:21042;18921:7;;;19021:10;18921:7;;;;;;;;;19120;18921;18891:52;-1:-1:-1;;;;;18913:16:15;18921:7;;;19044;18921;;;19044;18921;;:::i;18891:52::-;18976:7;;;;;;;:::i;:::-;1082:21042;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;19044:7;:::i;:::-;1082:21042;;;19038:5;1082:21042;;;;;;;;;;;;;19006:59;;:::i;:::-;19120:7;;;;:::i;:::-;1082:21042;19097:48;1082:21042;;;19129:15;1082:21042;;19097:48;18796:3;:::i;:::-;18770:12;;1082:21042;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;18784:10;;19432:34;;18784:10;;;;;18670;1082:21042;;19166:13;1082:21042;;;;19166:59;:44;1082:21042;;;19166:44;1082:21042;;;19166:59;:::i;:::-;1082:21042;;19235:26;;1082:21042;;;19235:26;:::i;:::-;1082:21042;;18670:10;1082:21042;;19271:18;1082:21042;;;;19271:40;1082:21042;;;;;;19271:40;:::i;:::-;1082:21042;;18670:10;1082:21042;;;;;;;;19324:35;19321:97;;18765:391;1082:21042;;;;18670:10;;;;19432:34;;;:::i;19321:97::-;1082:21042;;19166:44;1082:21042;;;;;;;;19321:97;;;;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;2188:10:17;1082:21042:15;2386:49:17;;1082:21042:15;;;2501:17:17;1082:21042:15;2501:17:17;;:::i;:::-;1082:21042:15;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7483:10:15;1082:21042;;;;;;7483:32;;;;;1082:21042;7483:32;;7504:10;1082:21042;7483:32;;1082:21042;7483:32;1082:21042;;;;7483:32;;;;;;;;;;;;;;1082:21042;7525:9;;7547:6;7551:2;7547:6;;7544:46;;1082:21042;7615:5;;;;;1082:21042;;;7603:10;1082:21042;;;;;;;;;;;;;;;;7657:49;;7504:10;1082:21042;7657:49;;1082:21042;;;;;;;;;;;;;;;;7657:49;;;;;;;;;;7603:10;7748:9;7504:10;;;7748:9;:::i;:::-;7603:10;;7657:49;;;;;;;;;;;;;;;:::i;:::-;;;1082:21042;;;;7748:9;1082:21042;;7657:49;;;;;;;;1082:21042;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;7544:46;1082:21042;-1:-1:-1;;;1082:21042:15;;;;;;;7544:46;;;1082:21042;;;-1:-1:-1;;;1082:21042:15;;;;;;7483:32;;;;;;;;;;;;;;;;;:::i;:::-;;;1082:21042;;;;;7483:32;;;;;;;;;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;1303:62:0;;:::i;:::-;1082:21042:15;-1:-1:-1;;;;;6848:10:15;1082:21042;;;;6848:29;;;;-1:-1:-1;;;6848:29:15;;;1082:21042;6848:29;;1082:21042;6848:29;;;;;;6879:9;6848:29;;;;;1082:21042;6879:9;;:::i;6848:29::-;;;;1082:21042;6848:29;;;;;;;;;:::i;:::-;;;;;1082:21042;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;3015:58;1082:21042;;;;;3015:58;;1082:21042;3015:58;;;1082:21042;;3015:58;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;4182:6;1082:21042;;4168:10;:20;1082:21042;;12137:34:18;;;:::i;:::-;1082:21042:15;;;;3111:18:17;;;1082:21042:15;4304:10:17;1082:21042:15;;;;4277:15:17;1082:21042:15;;;;;;;;;;;;;;;;12231:1:18;1082:21042:15;;;4304:10:17;1082:21042:15;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;6522:10:17;1082:21042:15;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;6574:15:17;1082:21042:15;;6942:26:17;1082:21042:15;;;;6942:26:17;;:::i;:::-;1082:21042:15;;;;;;6979:36:17;:22;;;;:::i;:36::-;1082:21042:15;;6574:15:17;1082:21042:15;;;;;;;;;;;;;;6522:10:17;1082:21042:15;;;;;;;4482:17:16;4450:15;1082:21042:15;;;12710:7:18;1082:21042:15;;;;;:::i;:::-;;;;;;;;;;;;6522:10:17;1082:21042:15;4450:15:16;:::i;:::-;4467:13;;:::i;:::-;4482:17;;:::i;:::-;12343:34:18;;;:::i;:::-;1082:21042:15;;;;12422:15:18;1082:21042:15;;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;;12662:9:18;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;12742:36:18;;;;6622:24:15;;;;1082:21042;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;3107:183:17;5266:33;;;:::i;:::-;-1:-1:-1;;1082:21042:15;;;;;;;;;;;5334:17:17;1082:21042:15;;;;;;5464:28:17;;;5460:323;;3107:183;1082:21042:15;;;;;;;;;;;5919:12:17;1082:21042:15;;;;;;;;;;;;;;;3107:183:17;;5460:323;1082:21042:15;;;5530:12:17;1082:21042:15;;;;;;;;;;;;;;;;;5530:12:17;1082:21042:15;;;;;;;;;;;;;;;;;5334:17:17;1082:21042:15;;;;;;5460:323:17;;;1082:21042:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6696:39:18;1082:21042:15;;;;;;6696:39:18;:::i;1082:21042:15:-;;;;;;;;;;;;;;-1:-1:-1;;;;;1276:31:15;1082:21042;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;2342:42;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;3465:34;1082:21042;;;;;;;;;;;;;;;;;21519:20;1082:21042;;;;;;;;21592:10;1082:21042;;21576:15;1082:21042;;21555:89;21576:39;1082:21042;;;21576:39;1082:21042;21563:9;:52;21555:89;:::i;:::-;21833:10;1082:21042;;21817:15;1082:21042;;;;;;;;-1:-1:-1;;;;;1082:21042:15;21863:4;1082:21042;;21863:27;;;;;1082:21042;;-1:-1:-1;;;21863:27:15;;21833:10;1082:21042;21863:27;;1082:21042;;;;;;;;;;;;;;;;;;21863:27;;;;;;;;21516:277;1082:21042;;;;;;21915:15;1082:21042;;21943:9;21915:42;;;;;:::i;:::-;;1082:21042;;;21833:10;1082:21042;;21990:17;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22086:29;1082:21042;21833:10;22086:29;;1082:21042;;21863:27;;;;;;;:::i;:::-;;;;;;1082:21042;;;;;;;;;21516:277;21712:10;1082:21042;;21696:15;1082:21042;;21675:107;21696:57;1082:21042;21696:47;1082:21042;;;21696:47;1082:21042;;21746:7;1082:21042;21696:57;;:::i;:::-;21683:9;:70;21675:107;:::i;:::-;21516:277;;1082:21042;;;;;;;-1:-1:-1;;1082:21042:15;;;;11851:25;1082:21042;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;1303:62:0;;;:::i;:::-;1082:21042:15;;;11851:7;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:62:0;;;;;;:::i;:::-;12122:10:15;12153:3;1082:21042;;12134:17;;;;;1082:21042;12191:9;;;;;:::i;:::-;1082:21042;;;;12180:10;1082:21042;;;;;;;;;;;;12271:8;;;;;12153:3;12271:8;;;:::i;:::-;1082:21042;;12258:9;;;;;:::i;:::-;1082:21042;;;;;;;;;;;;;;;;;;12153:3;:::i;:::-;12122:10;;1082:21042;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;12134:17;;1082:21042;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1438:37:15;1082:21042;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;3833:32;1082:21042;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;1303:62:0;;:::i;:::-;1082:21042:15;;11355:22;1082:21042;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;2449:50;1082:21042;;;;;;;;;2449:50;;;;1082:21042;;;;;;;;;;;;;;;;;;;;6482:7:18;1082:21042:15;;;:::i;:::-;929:10:8;6276:99:18;6284:41;929:10:8;;6284:41:18;:::i;:::-;6276:99;:::i;:::-;1082:21042:15;;;6394:17:18;1082:21042:15;;6385:66:18;1082:21042:15;;;;;;6393:27:18;6385:66;:::i;:::-;6482:7;:::i;1082:21042:15:-;;;;;;;;;;;;;;;;2177:80:16;1082:21042:15;;;;;;;;;;;;;;;;;2188:10:17;1082:21042:15;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1580:34:15;1082:21042;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;4182:6;1082:21042;;4168:10;;;:20;1082:21042;;6441:19;1082:21042;;;6441:19;;;;:::i;:::-;1082:21042;;;9912:6;1082:21042;;9912:42;1082:21042;9943:10;1082:21042;;;;;9912:42;;;;1082:21042;9912:42;;;1082:21042;9912:42;;1082:21042;;;;;9912:42;;;;;;;;;;;1082:21042;;;;9984:9;1082:21042;10009:31;1082:21042;;10009:31;1082:21042;;;;;;;9893:5;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;9912:42;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1513:6:0;1082:21042:15;;9984:9;:::i;:::-;1082:21042;;10009:31;;;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10009:31;;;;1082:21042;;;;;;9912:42;;;;;;;;;;;;;;;;;:::i;:::-;;;1082:21042;;;;;;9984:9;1082:21042;10009:31;1082:21042;;;;;10009:31;1082:21042;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;9912:42;;;;;;;;;;;;;;;;-1:-1:-1;9912:42:15;;1082:21042;;;;;;;;;;;;;;3580:22;1082:21042;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;1303:62:0;;:::i;:::-;-1:-1:-1;;;;;11570:19:15;1082:21042;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;:::i;:::-;;;;3171:46;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;3726:28;1082:21042;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;:::i;:::-;;;5036:34:18;;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;;;;;;5088:11:18;;;;1082:21042:15;;929:10:8;5169:21:18;:62;;;;;1082:21042:15;;;;;;;;14611:15:18;1082:21042:15;;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;14664:34:18;;;:::i;:::-;1082:21042:15;14655:57:18;;;;1082:21042:15;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;5169:62:18;5194:37;929:10:8;;;5194:37:18;;:::i;:::-;5169:62;;;1082:21042:15;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1369:21:15;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;4029:5:18;1082:21042:15;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4029:5:18;1082:21042:15;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2247:31;1082:21042;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;;;;;;;;1579:61:17;1594:46;1082:21042:15;1579:61:17;;:101;;;;;1082:21042:15;;;;;;;;;;1579:101:17;3172:36:18;3157:51;;;-1:-1:-1;3157:126:18;;;;1579:101:17;3157:178:18;;;;1579:101:17;;;;;3157:178:18;1183:36:10;1168:51;;;3157:178:18;;;:126;3239:44;3224:59;;;-1:-1:-1;3157:126:18;;1082:21042:15;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;9379:30;1303:62:0;;;:::i;:::-;9339:24:15;1082:21042;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;9379:30;1082:21042;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;1082:21042:15;;;;:::o;:::-;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;9912:42;1082:21042;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1082:21042:15;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1082:21042:15;;;;;;:::o;1599:130:0:-;-1:-1:-1;;;;;1513:6:0;1082:21042:15;;929:10:8;1662:23:0;1082:21042:15;;1599:130:0:o;1082:21042:15:-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;2673:187:0;2765:6;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;;;;;-1:-1:-1;;;;;;1082:21042:15;;;2765:6:0;1082:21042:15;;2813:40:0;-1:-1:-1;2813:40:0;;2673:187::o;1082:21042:15:-;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;:::o;5880:350::-;-1:-1:-1;;;;;1082:21042:15;;6090:28;1082:21042;6090:13;1082:21042;;;;;;6090:28;;;;1082:21042;6090:28;;1082:21042;6090:28;;;;;1082:21042;6090:28;;;;;;;;;-1:-1:-1;6090:28:15;;;5880:350;-1:-1:-1;1082:21042:15;;;6090:40;;6086:82;;-1:-1:-1;1082:21042:15;5991:18:18;6090:28:15;1082:21042;;-1:-1:-1;1082:21042:15;;-1:-1:-1;1082:21042:15;6090:28;1082:21042;;;-1:-1:-1;1082:21042:15;;;5880:350;:::o;6086:82::-;6146:11;;6153:4;6146:11;:::o;6090:28::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;1082:21042;;;-1:-1:-1;1082:21042:15;;;;;;-1:-1:-1;;1082:21042:15;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10173:606::-;-1:-1:-1;;;;;1082:21042:15;;10388:10;1082:21042;;;;10388:27;1082:21042;;;;10388:27;;;;1082:21042;10388:27;;;;;;1082:21042;10388:27;;;;;;;;;;-1:-1:-1;;;;;;;;10388:27:15;;;10173:606;1082:21042;;;;;;;10715:9;1082:21042;;10740:32;1082:21042;;;10740:32;1082:21042;;;;;;:::i;:::-;;;;;;;10479:206;1082:21042;10479:206;;1082:21042;;;;10479:206;;;;1082:21042;;;;10479:206;;;;1082:21042;;;;10479:206;;;;1082:21042;;;;10479:206;;;;1082:21042;;;;;-1:-1:-1;1082:21042:15;10460:5;1082:21042;;;;-1:-1:-1;1082:21042:15;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;;10479:206;1082:21042;;;;;;;;;10388:27;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1513:6:0;1082:21042:15;;10715:9;:::i;:::-;1082:21042;10740:32;;;;1082:21042;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10740:32;;;;10173:606::o;10388:27::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1082:21042;;;;;;10715:9;1082:21042;10740:32;1082:21042;;;;;10740:32;1082:21042;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;10388:27;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10388:27:15;;;1082:21042;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2580:287:2;2712:7;1830:1;1082:21042:15;;2712:19:2;1830:1;;;1082:21042:15;;2580:287:2:o;1830:1::-;;1082:21042:15;;-1:-1:-1;;;1830:1:2;;;;;;;;;;;1082:21042:15;1830:1:2;1082:21042:15;;;1830:1:2;;1082:21042:15;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;15444:745::-;-1:-1:-1;1082:21042:15;;15525:9;;1082:21042;;;;;15525:13;;;:44;;;;15444:745;-1:-1:-1;15522:539:15;;;1082:21042;;-1:-1:-1;;;;;1082:21042:15;;;;;;;-1:-1:-1;1082:21042:15;15720:5;15593:123;15666:5;15595:67;15608:13;1082:21042;;;;15596:53;1082:21042;;-1:-1:-1;1082:21042:15;;;15596:53;;:::i;15595:67::-;1082:21042;;-1:-1:-1;1082:21042:15;;;;15675:41;1082:21042;-1:-1:-1;1082:21042:15;15675:41;1082:21042;15593:123;;:::i;:::-;1082:21042;;-1:-1:-1;1082:21042:15;;;;-1:-1:-1;1082:21042:15;;;;;;;;;;15522:539;16073:8;16070:113;;15444:745;:::o;16070:113::-;-1:-1:-1;;;;;16097:4:15;1082:21042;;16097:27;;;;;1082:21042;;-1:-1:-1;;;16097:27:15;;16107:10;16097:27;;;1082:21042;;;;;;;;-1:-1:-1;;1082:21042:15;;;;;;-1:-1:-1;;16097:27:15;;;;;;;;16070:113;1082:21042;;;;;;16143:29;1082:21042;16107:10;16143:29;;15444:745::o;16097:27::-;;;;:::i;:::-;;;;15522:539;1082:21042;;-1:-1:-1;;;;;1082:21042:15;;;;;;;15964:5;15831:129;15852:13;1082:21042;;;;15919:41;1082:21042;15910:5;15833:73;15834:59;1082:21042;;;;;;15834:15;:59;:::i;15833:73::-;1082:21042;;;;;;;;;15919:41;1082:21042;15831:129;;:::i;:::-;1082:21042;;-1:-1:-1;1082:21042:15;;;;-1:-1:-1;1082:21042:15;15834:15;;1082:21042;;;;;;;;;15522:539;;15525:44;15542:15;;;:27;15525:44;;;1082:21042;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;17867:191::-;1082:21042;;-1:-1:-1;1082:21042:15;17949:17;1082:21042;;;;-1:-1:-1;1082:21042:15;;;17946:106;1082:21042;;;17994:4;17987:11;:::o;17946:106::-;-1:-1:-1;18029:12:15;:::o;1082:21042::-;;;;;-1:-1:-1;;1082:21042:15;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;1082:21042:15;;;;:::o;:::-;;;:::o;3148:185:16:-;3262:20;-1:-1:-1;;;;;3148:185:16;3262:20;:::i;:::-;10584:32;1082:21042:15;;;;;:::i;:::-;;;;;;;;;;;;;;10596:5:16;10592:9;;10584:32;:::i;:::-;1082:21042:15;3148:185:16;:::o;3544:201::-;1082:21042:15;;;3657:10:16;1082:21042:15;;;;-1:-1:-1;;;;;1082:21042:15;3695:21:16;1082:21042:15;;3695:43:16;1082:21042:15;3544:201:16;:::o;:::-;-1:-1:-1;;;;;1082:21042:15;;;-1:-1:-1;1082:21042:15;3657:10:16;1082:21042:15;;;-1:-1:-1;1082:21042:15;;;3695:21:16;;:43;1082:21042:15;;;3695:43:16;3544:201;:::o;3695:43::-;;;3544:201;:::o;1082:21042:15:-;;;;;-1:-1:-1;;1082:21042:15;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;6977:1200:16:-;7116:12;7102:26;;1082:21042:15;;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;;;;7199:14:16;1082:21042:15;;;;;;;;;;;;7236:17:16;;;7232:56;;7345:11;1082:21042:15;;;;;;;7366:16:16;;;;:::i;:::-;1082:21042:15;;;;;;;;;;;;7345:63:16;;7341:145;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;7544:47:16;7540:86;;7636:16;7677;7636;7677;;:::i;:::-;1082:21042:15;;;;;;7710:13:16;;;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;6977:1200:16;:::o;7703:418::-;7764:13;;;;;;;;7755:27;1082:21042:15;7764:13:16;;;;:::i;:::-;7381:1;1082:21042:15;;7755:27:16;;:::i;:::-;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;7739:43:16;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;7892:27:16;;;;;1082:21042:15;;;;;;;;;;;;;;7939:15:16;:::o;7888:223::-;7979:26;;;;;;;;;;;;;;;;;7975:136;7979:26;;;8025:14;;7975:136;;7703:418;;;;;7975:136;8086:10;;;;;;;:::i;:::-;7975:136;;1082:21042:15;;;-1:-1:-1;;;1082:21042:15;;;;;;7540:86:16;7607:8;;;;;;;;;:::o;7341:145::-;-1:-1:-1;;;;;1082:21042:15;;;;;;7452:16:16;1082:21042:15;;;7452:16:16;;:::i;:::-;1082:21042:15;;;;;;;;;;7424:51:16;:::o;7232:56::-;7269:8;;;;;;;;:::o;1082:21042:15:-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;8183:481:16;;;8409:20;;;:::i;:::-;1082:21042:15;-1:-1:-1;;;;;1082:21042:15;;;;-1:-1:-1;;1082:21042:15;;;;;;8440:10:16;1082:21042:15;;8570:26:16;1082:21042:15;;;;;;;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;8489:54:16;;;;;;8570:26;:::i;:::-;8794:16;;;;;:30;;;8183:481;8790:813;;8183:481;;;;;;;;;;:::o;8790:813::-;8844:20;8840:370;;8790:813;9228:20;;;9224:369;;8790:813;;;;;9224:369;1082:21042:15;;9287:14:16;1082:21042:15;;;;;;;;;;;;9346:13:16;;1082:21042:15;;9362:11:16;1082:21042:15;;;;;9382:13:16;;;;:::i;:::-;1082:21042:15;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;9346:60:16;;1082:21042:15;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;10815:29:16;1082:21042:15;9568:9:16;1082:21042:15;;;;10823:6:16;;10815:29;:::i;:::-;9568:9;:::i;:::-;9224:369;;;;;;;;1082:21042:15;;-1:-1:-1;;;1082:21042:15;;;;;;;9346:60:16;;1082:21042:15;9346:60:16;;;;8840:370;1082:21042:15;;8903:14:16;1082:21042:15;;;;;;;;;;;8962:13:16;;1082:21042:15;;8978:11:16;1082:21042:15;;;;;8998:13:16;;;;:::i;:::-;1082:21042:15;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;8962:60:16;;1082:21042:15;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;-1:-1:-1;;;;;1082:21042:15;;;;11009:29:16;1082:21042:15;;;11017:6:16;;;;;11009:29;:::i;:::-;1082:21042:15;;;;;;9185:9:16;;;;;;:::i;:::-;8840:370;;;;1082:21042:15;;;-1:-1:-1;;;1082:21042:15;;;;;;8962:60:16;;;;;;8794:30;1082:21042:15;-1:-1:-1;;;;;1082:21042:15;;8814:10:16;;8794:30;;8670:939;;-1:-1:-1;;;;;1082:21042:15;;;;;;8794:16:16;;;;;:30;;;8670:939;8790:813;;8670:939;;;;;:::o;8790:813::-;8844:20;;;;8840:370;;8790:813;9228:20;;;;;;9224:369;;8790:813;;;;;;9224:369;8862:1;1082:21042:15;;;;;9287:14:16;1082:21042:15;;;;;;;;;9346:60:16;:13;;;:60;1082:21042:15;;;9362:11:16;1082:21042:15;;;;;9382:13:16;;;;:::i;:::-;1082:21042:15;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;9346:60:16;;1082:21042:15;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;;12231:1:18;1082:21042:15;;;;;;;;;;10815:29:16;1082:21042:15;9568:9:16;1082:21042:15;;;;10823:6:16;;10815:29;:::i;9568:9::-;9224:369;;;;9346:60;;;;;;8840:370;8862:1;1082:21042:15;;;8903:14:16;1082:21042:15;;;;;;;;;;;8962:13:16;;1082:21042:15;;8978:11:16;1082:21042:15;;;;;8998:13:16;;;;:::i;:::-;1082:21042:15;;;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;8962:60:16;;1082:21042:15;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;-1:-1:-1;;;;;1082:21042:15;11009:29:16;1082:21042:15;;;11017:6:16;;12231:1:18;11017:6:16;;11009:29;:::i;:::-;-1:-1:-1;;1082:21042:15;;;;;;9185:9:16;;;;;;;:::i;:::-;8840:370;;;;;;1082:21042:15;;;-1:-1:-1;;;1082:21042:15;;;;;;8962:60:16;;;;;;8794:30;;12231:1:18;8794:30:16;;9615:700;;1082:21042:15;;;;;;;;:::i;:::-;;;;10417:32:16;1082:21042:15;;;;;;;;;;;;10429:5:16;9813:12;10425:9;10417:32;:::i;:::-;1082:21042:15;9813:12:16;;1082:21042:15;;;;9912:16:16;;;:85;;;9615:700;9908:334;;;1082:21042:15;;;-1:-1:-1;;;;;1082:21042:15;;;;;10257:51:16;1082:21042:15;;;-1:-1:-1;1082:21042:15;10013:11:16;1082:21042:15;;10036:16:16;1082:21042:15;-1:-1:-1;1082:21042:15;10036:16:16;;:::i;:::-;1082:21042:15;-1:-1:-1;1082:21042:15;;;10013:57:16;1082:21042:15;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;;;10013:57:16;1082:21042:15;;;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;10257:51:16;;9615:700::o;9908:334::-;1082:21042:15;;;-1:-1:-1;1082:21042:15;;;;;;;;;;;;;;;;;;10140:33:16;;;1082:21042:15;10230:1:16;-1:-1:-1;;;;;1082:21042:15;;;;;;;-1:-1:-1;;;;;1082:21042:15;;-1:-1:-1;;1082:21042:15;;;;10101:11:16;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1082:21042:15;;;10257:51:16;1082:21042:15;;;;;;10187:14:16;1082:21042:15;;;;;;;;;;;;9908:334:16;;1082:21042:15;;;-1:-1:-1;;;1082:21042:15;;;;;;9912:85:16;1082:21042:15;-1:-1:-1;;;;;1082:21042:15;;-1:-1:-1;1082:21042:15;9932:11:16;1082:21042:15;;;-1:-1:-1;1082:21042:15;9955:16:16;;;;:::i;:::-;1082:21042:15;-1:-1:-1;1082:21042:15;;;;;;-1:-1:-1;1082:21042:15;;;9932:65:16;9912:85;;1082:21042:15;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;:::i;:::-;;;;1766:264:17;1898:34;;;:::i;:::-;1890:42;;1082:21042:15;;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;1997:12:17;1082:21042:15;;;-1:-1:-1;1082:21042:15;;-1:-1:-1;1082:21042:15;;;;-1:-1:-1;1082:21042:15;;1766:264:17;:::o;1082:21042:15:-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;2188:10:17;1082:21042:15;;;;;;2188:10:17;-1:-1:-1;1082:21042:15;;;;-1:-1:-1;1082:21042:15;:::o;3401:204:18:-;-1:-1:-1;;;;;1082:21042:15;3500:19:18;;1082:21042:15;;3517:1:18;1082:21042:15;3582:9:18;1082:21042:15;;;3517:1:18;1082:21042:15;;3401:204:18;:::o;1082:21042:15:-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;3662:219:18;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;3796:56:18;3804:19;;;3796:56;:::i;5418:167::-;15319:53;15327:16;;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;8979:31:18;;8891:126;;15327:16;15319:53;:::i;:::-;-1:-1:-1;1082:21042:15;5554:15:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;5418:167:18;:::o;1082:21042:15:-;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;6808:390:18;;8255:47;6808:390;;;6968:99;6976:41;929:10:8;;6976:41:18;:::i;6968:99::-;1082:21042:15;-1:-1:-1;1082:21042:15;7086:17:18;1082:21042:15;;7077:66:18;1082:21042:15;;-1:-1:-1;1082:21042:15;;;7085:27:18;7077:66;:::i;:::-;8229:7;;;;;:::i;:::-;8255:47;:::i;:::-;1082:21042:15;;;6808:390:18:o;1082:21042:15:-;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;;;9175:272:18;9300:34;;;:::i;:::-;1082:21042:15;-1:-1:-1;;;;;1082:21042:15;;;;;;;;9352:16:18;;:52;;;;;9175:272;9352:87;;;;;;9175:272;9344:96;;;9175:272;:::o;9352:87::-;9408:20;;;;;;:::i;:::-;1082:21042:15;9408:31:18;9352:87;;;;;:52;9372:32;;;;;:::i;:::-;9352:52;;;;;1082:21042:15;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;10749:987:18;;-1:-1:-1;;;;;1082:21042:15;;;10845:16:18;;;1082:21042:15;;10908:58:18;10917:16;;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;8979:31:18;;8891:126;;10917:16;10916:17;10908:58;:::i;:::-;4304:10:17;1082:21042:15;;;;;;;;4277:15:17;1082:21042:15;;;;;;;;;;;;;;;11551:7:18;1082:21042:15;;;;;;11023:1:18;4482:17:16;1082:21042:15;;4304:10:17;1082:21042:15;;:::i;:::-;3879:31:17;;;:::i;:::-;1082:21042:15;;;3920:12:17;1082:21042:15;;;;;;;;;;;;;;;;;;3964:17:17;1082:21042:15;;;;;;4467:13:16;4450:15;;:::i;:::-;4467:13;;:::i;4482:17::-;11112:58:18;11121:16;;-1:-1:-1;1082:21042:15;8565:7:18;1082:21042:15;;-1:-1:-1;;;;;1082:21042:15;-1:-1:-1;1082:21042:15;;;8979:31:18;;8891:126;;11112:58;1082:21042:15;;;11512:9:18;1082:21042:15;;;;;11023:1:18;1082:21042:15;;;;;;;;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;11588:38:18;;;;;;;;;;11641:30;;10749:987::o;1082:21042:15:-;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;13170:1255:18;13289:92;13170:1255;13297:34;;;:::i;:::-;-1:-1:-1;;;;;1082:21042:15;;;;;;;;13297:42:18;;13289:92;:::i;:::-;1082:21042:15;;;13399:16:18;;;1082:21042:15;;3111:18:17;;;;1082:21042:15;4304:10:17;1082:21042:15;;17672:13:18;1082:21042:15;4277:15:17;1082:21042:15;;;;17672:13:18;1082:21042:15;;;;;;;;13601:92:18;1082:21042:15;4467:13:16;4450:15;1082:21042:15;;;;;;13507:1:18;4482:17:16;1082:21042:15;;4304:10:17;1082:21042:15;;:::i;:::-;3401:10:17;;;3397:81;;4450:15:16;:::i;4482:17::-;13609:34:18;;;:::i;:::-;1082:21042:15;13609:42:18;13601:92;:::i;:::-;14339:27;3299:179:17;1082:21042:15;;;13762:15:18;1082:21042:15;;;;;-1:-1:-1;;;;;;1082:21042:15;;;;;;;;;;14230:9:18;1082:21042:15;;;;;;;;;;;;;;;;;;13507:1:18;1082:21042:15;;;;;;;;14302:7:18;1082:21042:15;;;;;;;;;;;;;14339:27:18;;13170:1255::o;3397:81:17:-;3879:31;;;:::i;:::-;1082:21042:15;3299:179:17;1082:21042:15;;;3920:12:17;1082:21042:15;;;;;;;;;;;;;;;;;;3964:17:17;1082:21042:15;;;;4450:15:16;:::i;3107:183:17:-;3206:10;;;;3202:88;;3107:183;13601:92:18;3107:183:17;4467:13:16;4450:15;4482:17;3107:183:17;;;3202:88;5266:33;;;;;:::i;:::-;-1:-1:-1;;1082:21042:15;;;;;;;13601:92:18;1082:21042:15;4467:13:16;4450:15;1082:21042:15;;4482:17:16;1082:21042:15;;;;;;;;5334:17:17;1082:21042:15;;;;;;;;5464:28:17;;;5460:323;;3202:88;1082:21042:15;;;;;;;;;;;5919:12:17;1082:21042:15;;;;;;;;;;;;3202:88:17;;;;;;;;5460:323;1082:21042:15;;;5530:12:17;1082:21042:15;;;;;;;;;;;;;;;;;5530:12:17;1082:21042:15;;;;;;;;;;;;;;;;;5334:17:17;1082:21042:15;;;;;;5460:323:17;;;1082:21042:15;;;;-1:-1:-1;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;;;15931:853:18;;;1082:21042:15;;15931:853:18;;1476:19:7;;:23;:19;;16135:82:18;1082:21042:15;;;;;;;;;;;;-1:-1:-1;;;16135:82:18;;;;929:10:8;16135:82:18;;;1082:21042:15;-1:-1:-1;;;;;1082:21042:15;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16135:82:18;1082:21042:15;;16135:82:18;;;;;;;;16096:682;-1:-1:-1;;16131:595:18;;16345:381;;:::i;:::-;1082:21042:15;;;16395:18:18;;;1082:21042:15;;-1:-1:-1;;;16437:60:18;;1082:21042:15;16135:82:18;16437:60;;1082:21042:15;;;;;;;;;;;;;;;;;;;16391:321:18;16135:82;16599:95;;16131:595;1082:21042:15;;16267:62:18;16260:69;:::o;16135:82::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1082:21042:15;;;;;;;;;;;;;16135:82:18;;;;;;;;;-1:-1:-1;16135:82:18;;16096:682;16756:11;;;;;16763:4;16756:11;:::o
Swarm Source
ipfs://6e9f81b388d75d032901f5df225133312c32dd0b6a9720db66d963fc5a42230e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.