Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GangsterAllStarEvolutionV2_1
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-23 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.16; abstract contract Ownable { address public owner; /// @dev This emits when ownership of a contract changes. event OwnershipTransferred(address indexed _previousOwner, address indexed _newOwner); // constructor() { owner = msg.sender; } modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; } function transferOwnership(address new_) external onlyOwner { address oldOwner = owner; owner = new_; emit OwnershipTransferred(oldOwner, new_); } function mockTransferOwnership(address old_, address new_) external onlyOwner { // only a mock transfer event emit OwnershipTransferred(old_, new_); } } abstract contract ERC721G { // Standard ERC721 Events event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); // // ERC721G Events // event TokenStaked(uint256 indexed tokenId_, address indexed staker, // uint256 timestamp_); // event TokenUnstaked(uint256 indexed tokenid_, address indexed staker, // uint256 timestamp_, uint256 totalTimeStaked_); // Standard ERC721 Global Variables string public name; // Token Name string public symbol; // Token Symbol // ERC721G Global Variables uint256 public tokenIndex; // The running index for the next TokenId /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint256 public immutable startTokenId; // Bytes Storage for the starting TokenId /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint256 public immutable maxBatchSize; // Staking Address supports Proxy // address public immutable stakingAddress = address(this); // The staking address function stakingAddress() public view returns (address) { return address(this); } /** @dev instructions: * name_ sets the token name * symbol_ sets the token symbol * startId_ sets the starting tokenId (recommended 0-1) * maxBatchSize_ sets the maximum batch size for each mint (recommended 5-20) */ /// @custom:oz-upgrades-unsafe-allow constructor constructor( string memory name_, string memory symbol_, uint256 startId_, uint256 maxBatchSize_) { name = name_; symbol = symbol_; tokenIndex = startId_; startTokenId = startId_; maxBatchSize = maxBatchSize_; } // ERC721G Structs struct OwnerStruct { address owner; // stores owner address for OwnerOf uint32 lastTransfer; // stores the last transfer of the token uint32 stakeTimestamp; // stores the stake timestamp in _setStakeTimestamp() uint32 totalTimeStaked; // stores the total time staked accumulated } struct BalanceStruct { uint32 balance; // stores the token balance of the address uint32 mintedAmount; // stores the minted amount of the address on mint // 24 Free Bytes } // ERC721G Mappings mapping(uint256 => OwnerStruct) public _tokenData; // ownerOf replacement mapping(address => BalanceStruct) public _balanceData; // balanceOf replacement mapping(uint256 => OwnerStruct) public mintIndex; // uninitialized ownerOf pointer // ERC721 Mappings mapping(uint256 => address) public getApproved; // for single token approvals mapping(address => mapping(address => bool)) public isApprovedForAll; // approveall // TIME by 0xInuarashi function _getBlockTimestampCompressed() public virtual view returns (uint32) { return uint32(block.timestamp / 10); } function _compressTimestamp(uint256 timestamp_) public virtual view returns (uint32) { return uint32(timestamp_ / 10); } function _expandTimestamp(uint32 timestamp_) public virtual view returns (uint256) { return uint256(timestamp_) * 10; } function getLastTransfer(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).lastTransfer); } function getStakeTimestamp(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).stakeTimestamp); } function getTotalTimeStaked(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).totalTimeStaked); } ///// ERC721G: ERC721-Like Simple Read Outputs ///// function totalSupply() public virtual view returns (uint256) { return tokenIndex - startTokenId; } function balanceOf(address address_) public virtual view returns (uint256) { return _balanceData[address_].balance; } ///// ERC721G: Range-Based Logic ///// /** @dev explanation: * _getTokenDataOf() finds and returns either the (and in priority) * - the initialized storage pointer from _tokenData * - the uninitialized storage pointer from mintIndex * * if the _tokenData storage slot is populated, return it * otherwise, do a reverse-lookup to find the uninitialized pointer from mintIndex */ function _getTokenDataOf(uint256 tokenId_) public virtual view returns (OwnerStruct memory) { // The tokenId must be above startTokenId only require(tokenId_ >= startTokenId, "TokenId below starting Id!"); // If the _tokenData is initialized (not 0x0), return the _tokenData if (_tokenData[tokenId_].owner != address(0) || tokenId_ >= tokenIndex) { return _tokenData[tokenId_]; } // Else, do a reverse-lookup to find the corresponding uninitialized pointer else { unchecked { uint256 _lowerRange = tokenId_; while (mintIndex[_lowerRange].owner == address(0)) { _lowerRange--; } return mintIndex[_lowerRange]; }} } /** @dev explanation: * ownerOf calls _getTokenDataOf() which returns either the initialized or * uninitialized pointer. * Then, it checks if the token is staked or not through stakeTimestamp. * If the token is staked, return the stakingAddress, otherwise, return the owner. */ function ownerOf(uint256 tokenId_) public virtual view returns (address) { OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); return _OwnerStruct.stakeTimestamp == 0 ? _OwnerStruct.owner : stakingAddress(); } /** @dev explanation: * _trueOwnerOf() calls _getTokenDataOf() which returns either the initialized or * uninitialized pointer. * It returns the owner directly without any checks. * Used internally for proving the staker address on unstake. */ function _trueOwnerOf(uint256 tokenId_) public virtual view returns (address) { return _getTokenDataOf(tokenId_).owner; } ///// ERC721G: Internal Single-Contract Staking Logic ///// /** @dev explanation: * _initializeTokenIf() is used as a beginning-hook to functions that require * that the token is explicitly INITIALIZED before the function is able to be used. * It will check if the _tokenData slot is initialized or not. * If it is not, it will initialize it. * Used internally for staking logic. */ function _initializeTokenIf(uint256 tokenId_, OwnerStruct memory _OwnerStruct) internal virtual { // If the target _tokenData is not initialized, initialize it. if (_tokenData[tokenId_].owner == address(0)) { _tokenData[tokenId_] = _OwnerStruct; } } /** @dev explanation: * _setStakeTimestamp() is our staking / unstaking logic. * If timestamp_ is > 0, the action is "stake" * If timestamp_ is == 0, the action is "unstake" * * We grab the tokenData using _getTokenDataOf and then read its values. * As this function requires INITIALIZED tokens only, we call _initializeTokenIf() * to initialize any token using this function first. * * Processing of the function is explained in in-line comments. */ function _setStakeTimestamp(uint256 tokenId_, uint256 timestamp_) internal virtual returns (address) { // First, call _getTokenDataOf and grab the relevant tokenData OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); address _owner = _OwnerStruct.owner; uint32 _stakeTimestamp = _OwnerStruct.stakeTimestamp; // _setStakeTimestamp requires initialization _initializeTokenIf(tokenId_, _OwnerStruct); // Clear any token approvals delete getApproved[tokenId_]; // if timestamp_ > 0, the action is "stake" if (timestamp_ > 0) { // Make sure that the token is not staked already require(_stakeTimestamp == 0, "ERC721G: _setStakeTimestamp() already staked"); // Callbrate balances between staker and stakingAddress unchecked { _balanceData[_owner].balance--; _balanceData[stakingAddress()].balance++; } // Emit Transfer event from trueOwner emit Transfer(_owner, stakingAddress(), tokenId_); } // if timestamp_ == 0, the action is "unstake" else { // Make sure the token is not staked require(_stakeTimestamp != 0, "ERC721G: _setStakeTimestamp() already unstaked"); // Callibrate balances between stakingAddress and staker unchecked { _balanceData[_owner].balance++; _balanceData[stakingAddress()].balance--; } // we add total time staked to the token on unstake uint32 _timeStaked = _getBlockTimestampCompressed() - _stakeTimestamp; _tokenData[tokenId_].totalTimeStaked += _timeStaked; // Emit Transfer event to trueOwner emit Transfer(stakingAddress(), _owner, tokenId_); } // Set the stakeTimestamp to timestamp_ _tokenData[tokenId_].stakeTimestamp = _compressTimestamp(timestamp_); // We save internal gas by returning the owner for a follow-up function return _owner; } /** @dev explanation: * _stake() works like an extended function of _setStakeTimestamp() * where the logic of _setStakeTimestamp() runs and returns the _owner address * afterwards, we do the post-hook required processing to finish the staking logic * in this function. * * Processing logic explained in in-line comments. */ function _stake(uint256 tokenId_) internal virtual returns (address) { // set the stakeTimestamp to block.timestamp and return the owner return _setStakeTimestamp(tokenId_, block.timestamp); } /** @dev explanation: * _unstake() works like an extended unction of _setStakeTimestamp() * where the logic of _setStakeTimestamp() runs and returns the _owner address * afterwards, we do the post-hook required processing to finish the unstaking logic * in this function. * * Processing logic explained in in-line comments. */ function _unstake(uint256 tokenId_) internal virtual returns(address) { // set the stakeTimestamp to 0 and return the owner return _setStakeTimestamp(tokenId_, 0); } /** @dev explanation: * _mintAndStakeInternal() is the internal mintAndStake function that is called * to mintAndStake tokens to users. * * It populates mintIndex with the phantom-mint data (owner, lastTransferTime) * as well as the phantom-stake data (stakeTimestamp) * * Then, it emits the necessary phantom events to replicate the behavior as canon. * * Further logic explained in in-line comments. */ function _mintAndStakeInternal(address to_, uint256 amount_) internal virtual { // we cannot mint to 0x0 require(to_ != address(0), "ERC721G: _mintAndStakeInternal to 0x0"); // we limit max mints per SSTORE to prevent expensive gas lookup require(amount_ <= maxBatchSize, "ERC721G: _mintAndStakeInternal over maxBatchSize"); // process the required variables to write to mintIndex uint256 _startId = tokenIndex; uint256 _endId = _startId + amount_; uint32 _currentTime = _getBlockTimestampCompressed(); // write to the mintIndex to store the OwnerStruct for uninitialized tokenData mintIndex[_startId] = OwnerStruct( to_, // the address the token is minted to _currentTime, // the last transfer time _currentTime, // the curent time of staking 0 // the accumulated time staked ); unchecked { // we add the balance to the stakingAddress through our staking logic _balanceData[stakingAddress()].balance += uint32(amount_); // we add the mintedAmount to the to_ through our minting logic _balanceData[to_].mintedAmount += uint32(amount_); // emit phantom mint to to_, then emit a staking transfer do { emit Transfer(address(0), to_, _startId); emit Transfer(to_, stakingAddress(), _startId); // /** @dev testing: // * emitting a TokenStaked event for testing // */ // emit TokenStaked(_startId, to_, _currentTime); } while (++_startId < _endId); } // set the new tokenIndex to the _endId tokenIndex = _endId; } /** @dev explanation: * _mintAndStake() calls _mintAndStakeInternal() but calls it using a while-loop * based on the required minting amount to stay within the bounds of * max mints per batch (maxBatchSize) */ function _mintAndStake(address to_, uint256 amount_) internal virtual { uint256 _amountToMint = amount_; while (_amountToMint > maxBatchSize) { _amountToMint -= maxBatchSize; _mintAndStakeInternal(to_, maxBatchSize); } _mintAndStakeInternal(to_, _amountToMint); } ///// ERC721G Range-Based Internal Minting Logic ///// /** @dev explanation: * _mintInternal() is our internal batch minting logic. * First, we store the uninitialized pointer at mintIndex of _startId * Then, we process the balances changes * Finally, we phantom-mint the tokens using Transfer events loop. */ function _mintInternal(address to_, uint256 amount_) internal virtual { // cannot mint to 0x0 require(to_ != address(0), "ERC721G: _mintInternal to 0x0"); // we limit max mints to prevent expensive gas lookup require(amount_ <= maxBatchSize, "ERC721G: _mintInternal over maxBatchSize"); // process the token id data uint256 _startId = tokenIndex; uint256 _endId = _startId + amount_; // push the required phantom mint data to mintIndex mintIndex[_startId].owner = to_; mintIndex[_startId].lastTransfer = _getBlockTimestampCompressed(); // process the balance changes and do a loop to phantom-mint the tokens to to_ unchecked { _balanceData[to_].balance += uint32(amount_); _balanceData[to_].mintedAmount += uint32(amount_); do { emit Transfer(address(0), to_, _startId); } while (++_startId < _endId); } // set the new token index tokenIndex = _endId; } /** @dev explanation: * _mint() is the function that calls _mintInternal() using a while-loop * based on the maximum batch size (maxBatchSize) */ function _mint(address to_, uint256 amount_) internal virtual { uint256 _amountToMint = amount_; while (_amountToMint > maxBatchSize) { _amountToMint -= maxBatchSize; _mintInternal(to_, maxBatchSize); } _mintInternal(to_, _amountToMint); } /** @dev explanation: * _transfer() is the internal function that transfers the token from_ to to_ * it has ERC721-standard require checks * and then uses solmate-style approval clearing * * afterwards, it sets the _tokenData to the data of the to_ (transferee) as well as * set the balanceData. * * this results in INITIALIZATION of the token, if it has not been initialized yet. */ function _transfer(address from_, address to_, uint256 tokenId_) internal virtual { // the from_ address must be the ownerOf require(from_ == ownerOf(tokenId_), "ERC721G: _transfer != ownerOf"); // cannot transfer to 0x0 require(to_ != address(0), "ERC721G: _transfer to 0x0"); // delete any approvals delete getApproved[tokenId_]; // set _tokenData to to_ _tokenData[tokenId_].owner = to_; _tokenData[tokenId_].lastTransfer = _getBlockTimestampCompressed(); // update the balance data unchecked { _balanceData[from_].balance--; _balanceData[to_].balance++; } // emit a standard Transfer emit Transfer(from_, to_, tokenId_); } ///// ERC721G: User-Enabled Out-of-the-box Staking Functionality ///// /** @dev clarification: * As a developer, you DO NOT have to enable these functions, or use them * in the way defined in this section. * * The functions in this section are just out-of-the-box plug-and-play staking * which is enabled IMMEDIATELY. * (As well as some useful view-functions) * * You can choose to call the internal staking functions yourself, to create * custom staking logic based on the section (n-2) above. */ /** @dev explanation: * this is a staking function that receives calldata tokenIds_ array * and loops to call internal _stake in a gas-efficient way * written in a shorthand-style syntax */ function stake(uint256[] calldata tokenIds_) public virtual { uint256 i; uint256 l = tokenIds_.length; while (i < l) { // stake and return the owner's address address _owner = _stake(tokenIds_[i]); // make sure the msg.sender is the owner require(msg.sender == _owner, "You are not the owner!"); unchecked {++i;} } } /** @dev explanation: * this is an unstaking function that receives calldata tokenIds_ array * and loops to call internal _unstake in a gas-efficient way * written in a shorthand-style syntax */ function unstake(uint256[] calldata tokenIds_) public virtual { uint256 i; uint256 l = tokenIds_.length; while (i < l) { // unstake and return the owner's address address _owner = _unstake(tokenIds_[i]); // make sure the msg.sender is the owner require(msg.sender == _owner, "You are not the owner!"); unchecked {++i;} } } ///// ERC721G: User-Enabled Out-of-the-box Staking View Functions ///// /** @dev explanation: * balanceOfStaked loops through the entire tokens using * startTokenId as the start pointer, and * tokenIndex (current-next tokenId) as the end pointer * * it checks if the _trueOwnerOf() is the address_ or not * and if the owner() is not the address, indicating the * state that the token is staked. * * if so, it increases the balance. after the loop, it returns the balance. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function balanceOfStaked(address address_) public virtual view returns (uint256) { uint256 _balance; uint256 i = startTokenId; uint256 max = tokenIndex; while (i < max) { if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) { _balance++; } unchecked { ++i; } } return _balance; } /** @dev explanation: * walletOfOwnerStaked calls balanceOfStaked to get the staked * balance of a user. Afterwards, it runs staked-checking logic * to figure out the tokenIds that the user has staked * and then returns it in walletOfOwner fashion. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function walletOfOwnerStaked(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOfStaked(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _currentIndex; uint256 i = startTokenId; while (_currentIndex < _balance) { if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) { _tokens[_currentIndex++] = i; } unchecked { ++i; } } return _tokens; } /** @dev explanation: * balanceOf of the address returns UNSTAKED tokens only. * to get the total balance of the user containing both STAKED and UNSTAKED tokens, * we use this function. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function totalBalanceOf(address address_) public virtual view returns (uint256) { return balanceOf(address_) + balanceOfStaked(address_); } /** @dev explanation: * totalTimeStakedOfToken returns the accumulative total time staked of a tokenId * it reads from the totalTimeStaked of the tokenId_ and adds it with * a calculation of pending time staked and returns the sum of both values. * * this is mainly for external view / use only. * this function can be interfaced with contract writes. */ function totalTimeStakedOfToken(uint256 tokenId_) public virtual view returns (uint256) { OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); uint256 _totalTimeStakedOnToken = _expandTimestamp(_OwnerStruct.totalTimeStaked); uint256 _totalTimeStakedPending = _OwnerStruct.stakeTimestamp > 0 ? _expandTimestamp( _getBlockTimestampCompressed() - _OwnerStruct.stakeTimestamp) : 0; return _totalTimeStakedOnToken + _totalTimeStakedPending; } /** @dev explanation: * totalTimeStakedOfTokens just returns an array of totalTimeStakedOfToken * based on tokenIds_ calldata. * * this is mainly for external view / use only. * this function can be interfaced with contract writes... however * BE CAREFUL and USE IT CORRECTLY. * (dont pass in 5000 tokenIds_ in a write function) */ function totalTimeStakedOfTokens(uint256[] calldata tokenIds_) public virtual view returns (uint256[] memory) { uint256 i; uint256 l = tokenIds_.length; uint256[] memory _totalTimeStakeds = new uint256[] (l); while (i < l) { _totalTimeStakeds[i] = totalTimeStakedOfToken(tokenIds_[i]); unchecked { ++i; } } return _totalTimeStakeds; } ///// ERC721G: ERC721 Standard Logic ///// /** @dev clarification: * no explanations here as these are standard ERC721 logics. * the reason that we can use standard ERC721 logics is because * the ERC721G logic is compartmentalized and supports internally * these ERC721 logics without any need of modification. */ function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal view virtual returns (bool) { address _owner = ownerOf(tokenId_); return ( // "i am the owner of the token, and i am transferring it" _owner == spender_ // "the token's approved spender is me" || getApproved[tokenId_] == spender_ // "the owner has approved me to spend all his tokens" || isApprovedForAll[_owner][spender_]); } /** @dev clarification: * sets a specific address to be able to spend a specific token. */ function _approve(address to_, uint256 tokenId_) internal virtual { getApproved[tokenId_] = to_; emit Approval(ownerOf(tokenId_), to_, tokenId_); } function approve(address to_, uint256 tokenId_) public virtual { address _owner = ownerOf(tokenId_); require( // "i am the owner, and i am approving this token." _owner == msg.sender // "i am isApprovedForAll, so i can approve this token too." || isApprovedForAll[_owner][msg.sender], "ERC721G: approve not authorized"); _approve(to_, tokenId_); } function _setApprovalForAll(address owner_, address operator_, bool approved_) internal virtual { isApprovedForAll[owner_][operator_] = approved_; emit ApprovalForAll(owner_, operator_, approved_); } function setApprovalForAll(address operator_, bool approved_) public virtual { // this function can only be used as self-approvalforall for others. _setApprovalForAll(msg.sender, operator_, approved_); } function _exists(uint256 tokenId_) internal virtual view returns (bool) { return ownerOf(tokenId_) != address(0); } function transferFrom(address from_, address to_, uint256 tokenId_) public virtual { require(_isApprovedOrOwner(msg.sender, tokenId_), "ERC721G: transferFrom unauthorized"); _transfer(from_, to_, tokenId_); } function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public virtual { transferFrom(from_, to_, tokenId_); if (to_.code.length != 0) { (, bytes memory _returned) = to_.call(abi.encodeWithSelector( 0x150b7a02, msg.sender, from_, tokenId_, data_)); bytes4 _selector = abi.decode(_returned, (bytes4)); require(_selector == 0x150b7a02, "ERC721G: safeTransferFrom to_ non-ERC721Receivable!"); } } function safeTransferFrom(address from_, address to_, uint256 tokenId_) public virtual { safeTransferFrom(from_, to_, tokenId_, ""); } function supportsInterface(bytes4 iid_) public virtual view returns (bool) { return iid_ == 0x01ffc9a7 || iid_ == 0x80ac58cd || iid_ == 0x5b5e139f || iid_ == 0x7f5828d0; } function walletOfOwner(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOf(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _currentIndex; uint256 i = startTokenId; while (_currentIndex < _balance) { if (ownerOf(i) == address_) { _tokens[_currentIndex++] = i; } unchecked { ++i; } } return _tokens; } function tokenURI(uint256 tokenId_) public virtual view returns (string memory) {} // Proxy Padding bytes32[50] private proxyPadding; } abstract contract Minterable is Ownable { mapping(address => bool) public minters; modifier onlyMinter { require(minters[msg.sender], "Not Minter!"); _; } event MinterSet(address newMinter, bool status); function setMinter(address address_, bool bool_) external onlyOwner { minters[address_] = bool_; emit MinterSet(address_, bool_); } } contract GangsterAllStarEvolutionV2_1 is ERC721G, Ownable, Minterable { // Set the base ERC721G Constructor /// @custom:oz-upgrades-unsafe-allow constructor constructor() ERC721G("Gangster All Star: Evolution", "GAS:EVO", 1, 20) {} // Proxy Initializer Logic bool proxyIsInitialized; function proxyInitialize(address newOwner) external { require(!proxyIsInitialized); proxyIsInitialized = true; // Hardcode owner = newOwner; name = "Gangster All Star: Evolution"; symbol = "GAS:EVO"; tokenIndex = 1; } // On-Chain Generation Seed for Generative Art Generation bytes32 public generationSeed; function pullGenerationSeed() external onlyOwner { generationSeed = keccak256(abi.encodePacked( block.timestamp, block.number, block.difficulty, block.coinbase, block.gaslimit, blockhash(block.number) )); } // Define the NFT Constant Params uint256 public constant maxSupply = 7777; // Define NFT Global Params bool public stakingIsEnabled; bool public unstakingIsEnabled; function O_setStakingIsEnabled(bool bool_) external onlyOwner { stakingIsEnabled = bool_; } function O_setUnstakingIsEnabled(bool bool_) external onlyOwner { unstakingIsEnabled = bool_; } // Internal Overrides function _mint(address address_, uint256 amount_) internal override { require(maxSupply >= (totalSupply() + amount_), "ERC721G: _mint(): exceeds maxSupply"); ERC721G._mint(address_, amount_); } // Stake / Unstake Overrides for Future Compatibility function stake(uint256[] calldata tokenIds_) public override { require(stakingIsEnabled, "Staking functionality not enabled yet!"); ERC721G.stake(tokenIds_); } function unstake(uint256[] calldata tokenIds_) public override { require(unstakingIsEnabled, "Unstaking functionality not enabled yet!"); ERC721G.unstake(tokenIds_); } // Internal Functions function _mintMany(address[] memory addresses_, uint256[] memory amounts_) internal { require(addresses_.length == amounts_.length, "Array lengths mismatch!"); for (uint256 i = 0; i < addresses_.length;) { _mint(addresses_[i], amounts_[i]); unchecked { ++i; } } } // Controllerable Minting function mintAsController(address to_, uint256 amount_) external onlyMinter { _mint(to_, amount_); } function mintAsControllerMany(address[] calldata tos_, uint256[] calldata amounts_) external onlyMinter { _mintMany(tos_, amounts_); } // Token URI Configurations string internal baseURI; string internal baseURI_EXT; function O_setBaseURI(string calldata uri_) external onlyOwner { baseURI = uri_; } function O_setBaseURI_EXT(string calldata ext_) external onlyOwner { baseURI_EXT = ext_; } function _toString(uint256 value_) internal pure returns (string memory) { if (value_ == 0) { return "0"; } uint256 _iterate = value_; uint256 _digits; while (_iterate != 0) { _digits++; _iterate /= 10; } bytes memory _buffer = new bytes(_digits); while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8( 48 + uint256(value_ % 10 ))); value_ /= 10; } return string(_buffer); } function tokenURI(uint256 tokenId_) public view override returns (string memory) { // PoS Merge-Safe if (block.chainid != 1) return ""; return string(abi.encodePacked(baseURI, _toString(tokenId_), baseURI_EXT)); } ///// Additional Helper Functions ///// function isOwnerOfAll(address owner, uint256[] calldata tokenIds_) external view returns (bool) { // Patch 2.1 uint256 i; uint256 l = tokenIds_.length; unchecked { do { if (ownerOf(tokenIds_[i]) != owner) return false; } while (++i < l); } return true; } function isTrueOwnerOfAll(address owner, uint256[] calldata tokenIds_) external view returns (bool) { // Patch 2.1 uint256 i; uint256 l = tokenIds_.length; unchecked { do { if (_trueOwnerOf(tokenIds_[i]) != owner) return false; } while (++i < l); } return true; } // Proxy Padding bytes32[50] private proxyPadding; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":false,"internalType":"address","name":"newMinter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MinterSet","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":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":[{"internalType":"string","name":"uri_","type":"string"}],"name":"O_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ext_","type":"string"}],"name":"O_setBaseURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setStakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setUnstakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp_","type":"uint256"}],"name":"_compressTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp_","type":"uint32"}],"name":"_expandTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getBlockTimestampCompressed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_getTokenDataOf","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"internalType":"struct ERC721G.OwnerStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_trueOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generationSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getStakeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTotalTimeStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isOwnerOfAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isTrueOwnerOfAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintAsController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"mintAsControllerMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintIndex","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"old_","type":"address"},{"internalType":"address","name":"new_","type":"address"}],"name":"mockTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"proxyInitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullGenerationSeed","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":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"iid_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIndex","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":[{"internalType":"address","name":"address_","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"totalTimeStakedOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"totalTimeStakedOfTokens","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":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwnerStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040518060400160405280601c81526020017f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000815250604051806040016040528060078152602001664741533a45564f60c81b8152506001601483600090816200007d919062000149565b5060016200008c848262000149565b50600282905560809190915260a05250620002159050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000cf57607f821691505b602082108103620000f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014457600081815260208120601f850160051c810160208610156200011f5750805b601f850160051c820191505b8181101562000140578281556001016200012b565b5050505b505050565b81516001600160401b03811115620001655762000165620000a4565b6200017d81620001768454620000ba565b84620000f6565b602080601f831160018114620001b557600084156200019c5750858301515b600019600386901b1c1916600185901b17855562000140565b600085815260208120601f198616915b82811015620001e657888601518255948401946001909101908401620001c5565b5085821015620002055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612fc36200027a6000396000818161049d01528181612046015281816120710152818161209e01526124090152600081816108b401528181610c4801528181610d8a01528181610ec1015281816110d2015261148d0152612fc36000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806388895767116101d3578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d14610917578063f2fde38b1461091f578063f46eccc414610932578063f65982951461095557600080fd5b8063e6798baa146108af578063e985e9c5146108d6578063f0e56f0d1461090457600080fd5b8063d55f9273116100de578063d55f927314610884578063d5abeb011461088d578063d7b4be2414610896578063e449f3411461089c57600080fd5b8063c969a5ab1461084b578063ced74b501461085e578063cf456ae71461087157600080fd5b8063a713e45b11610171578063b88d4fde1161014b578063b88d4fde146107b5578063ba745f2e146107c8578063bd5404a814610825578063c87b56dd1461083857600080fd5b8063a713e45b14610743578063b0b50ed514610756578063b4bd7c32146107a357600080fd5b8063993568c1116101ad578063993568c1146106fd5780639b10b771146107105780639ee0bcbc1461071d578063a22cb4651461073057600080fd5b806388895767146106ba5780638da5cb5b146106e257806395d89b41146106f557600080fd5b80633455f41e116102ad5780635266069d1161024b5780636352211e116102255780636352211e1461065c57806370a082311461066f5780637b2cbd2d1461069e57806384023454146106a757600080fd5b80635266069d146105e75780635aea7ec1146106365780635e7676e11461064957600080fd5b8063438b630011610287578063438b63001461058e578063470f2c1f146105ae5780634749900a146105c15780634b0ee02a146105d457600080fd5b80633455f41e14610555578063403082f21461056857806342842e0e1461057b57600080fd5b8063153db98a1161031a57806323b872dd116102f457806323b872dd146104855780632913daa0146104985780632c2cdd60146104bf57806332e30f511461054257600080fd5b8063153db98a1461044957806318160ddd1461045c5780631c08c6b71461047257600080fd5b8063081812fc11610356578063081812fc146103cf578063095ea7b3146104105780630fbf0a93146104235780630ffdf2681461043657600080fd5b806301ffc9a71461037d578063021bcdcf146103a557806306fdde03146103ba575b600080fd5b61039061038b366004612638565b61095d565b60405190151581526020015b60405180910390f35b6103b86103b3366004612655565b6109ca565b005b6103c2610a0f565b60405161039c9190612717565b6103f86103dd36600461272a565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b6103b861041e36600461275a565b610a9d565b6103b86104313660046127d0565b610b3a565b6103b8610444366004612822565b610ba9565b6103b861045736600461275a565b610bed565b610464610c44565b60405190815260200161039c565b6103b8610480366004612655565b610c79565b6103b861049336600461283d565b610cb0565b6104647f000000000000000000000000000000000000000000000000000000000000000081565b61050c6104cd36600461272a565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff93841660208601529183169184019190915216606082015260800161039c565b610390610550366004612879565b610d1c565b6104646105633660046128cc565b610d80565b6104646105763660046128e7565b610e1d565b6103b861058936600461283d565b610e30565b6105a161059c3660046128cc565b610e4b565b60405161039c919061290d565b6103b86105bc366004612951565b610f47565b6103b86105cf366004612822565b611007565b6104646105e23660046128cc565b611044565b6106196105f53660046128cc565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff93841681529290911660208301520161039c565b6105a16106443660046128cc565b611078565b6103f861065736600461272a565b611175565b6103f861066a36600461272a565b611187565b61046461067d3660046128cc565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b610464603d5481565b6105a16106b53660046127d0565b6111ad565b6106cd6106c836600461272a565b611254565b60405163ffffffff909116815260200161039c565b603a546103f8906001600160a01b031681565b6103c2611261565b61046461070b36600461272a565b61126e565b603e546103909060ff1681565b61046461072b36600461272a565b611285565b6103b861073e3660046129bd565b61129c565b610390610751366004612879565b6112a7565b61050c61076436600461272a565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461039090610100900460ff1681565b6103b86107c3366004612a06565b611309565b6107db6107d636600461272a565b611467565b60405161039c919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103b86108333660046128cc565b611613565b6103c261084636600461272a565b6116c3565b6103b8610859366004612ae2565b611715565b61046461086c36600461272a565b611783565b6103b861087f3660046129bd565b6117e2565b61046460025481565b610464611e6181565b306103f8565b6103b86108aa3660046127d0565b61186f565b6104647f000000000000000000000000000000000000000000000000000000000000000081565b6103906108e4366004612ae2565b600760209081526000928352604080842090915290825290205460ff1681565b61046461091236600461272a565b6118e1565b6106cd6118f8565b6103b861092d3660046128cc565b611905565b6103906109403660046128cc565b603b6020526000908152604090205460ff1681565b6103b8611981565b60006301ffc9a760e01b6001600160e01b03198316148061098e57506380ac58cd60e01b6001600160e01b03198316145b806109a95750635b5e139f60e01b6001600160e01b03198316145b806109c457506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109fd5760405162461bcd60e51b81526004016109f490612b0c565b60405180910390fd5b603f610a0a828483612bb0565b505050565b60008054610a1c90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890612b30565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b505050505081565b6000610aa882611187565b90506001600160a01b038116331480610ae457506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610b305760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a65640060448201526064016109f4565b610a0a8383611a0a565b603e5460ff16610b9b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b60648201526084016109f4565b610ba58282611a78565b5050565b603a546001600160a01b03163314610bd35760405162461bcd60e51b81526004016109f490612b0c565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610c3a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b610ba58282611b06565b60007f0000000000000000000000000000000000000000000000000000000000000000600254610c749190612c87565b905090565b603a546001600160a01b03163314610ca35760405162461bcd60e51b81526004016109f490612b0c565b6040610a0a828483612bb0565b610cba3382611b80565b610d115760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b60648201526084016109f4565b610a0a838383611bff565b600080825b856001600160a01b0316610d4c868685818110610d4057610d40612c9a565b90506020020135611175565b6001600160a01b031614610d6557600092505050610d79565b808260010192508210610d21576001925050505b9392505050565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000000905b80821015610e1457846001600160a01b0316610dc683611187565b6001600160a01b031614158015610df65750846001600160a01b0316610deb83611175565b6001600160a01b0316145b15610e095782610e0581612cb0565b9350505b816001019150610dab565b50909392505050565b60006109c463ffffffff8316600a612cc9565b610a0a83838360405180602001604052806000815250611309565b60606000610e74836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610e9157610e916129f0565b604051908082528060200260200182016040528015610eba578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610f3d57856001600160a01b0316610efc82611187565b6001600160a01b031603610f3557808383610f1681612cb0565b945081518110610f2857610f28612c9a565b6020026020010181815250505b600101610ee1565b5090949350505050565b336000908152603b602052604090205460ff16610f945760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b61100184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d9892505050565b50505050565b603a546001600160a01b031633146110315760405162461bcd60e51b81526004016109f490612b0c565b603e805460ff1916911515919091179055565b600061104f82610d80565b6001600160a01b03831660009081526004602052604090205463ffffffff166109c49190612ce8565b6060600061108583610d80565b905060008167ffffffffffffffff8111156110a2576110a26129f0565b6040519080825280602002602001820160405280156110cb578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610f3d57856001600160a01b031661110d82611187565b6001600160a01b03161415801561113d5750856001600160a01b031661113282611175565b6001600160a01b0316145b1561116d5780838361114e81612cb0565b94508151811061116057611160612c9a565b6020026020010181815250505b6001016110f2565b600061118082611467565b5192915050565b60008061119383611467565b9050806040015163ffffffff166000146111805730610d79565b6060600082818167ffffffffffffffff8111156111cc576111cc6129f0565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505b8183101561124b5761122286868581811061121657611216612c9a565b90506020020135611783565b81848151811061123457611234612c9a565b6020026020010181815250508260010192506111f9565b95945050505050565b60006109c4600a83612d11565b60018054610a1c90612b30565b60006109c461127c83611467565b60600151610e1d565b60006109c461129383611467565b60400151610e1d565b610ba5338383611e39565b600080825b856001600160a01b03166112d78686858181106112cb576112cb612c9a565b90506020020135611187565b6001600160a01b0316146112f057600092505050610d79565b8082600101925082106112ac5750600195945050505050565b611314848484610cb0565b6001600160a01b0383163b15611001576000836001600160a01b031663150b7a023387868660405160240161134c9493929190612d25565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516113859190612d62565b6000604051808303816000865af19150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b509150506000818060200190518101906113e19190612d7e565b9050630a85bd0160e11b6001600160e01b031982161461145f5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b60648201526084016109f4565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000008210156114fb5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e672049642100000000000060448201526064016109f4565b6000828152600360205260409020546001600160a01b031615158061152257506002548210155b156115865750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166115ad5760001901611588565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561162357600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000602082015260009061168e9082612d9b565b506040805180820190915260078152664741533a45564f60c81b60208201526001906116ba9082612d9b565b50506001600255565b6060466001146116e157505060408051602081019091526000815290565b603f6116ec83611ea6565b604080516020016116ff93929190612ece565b6040516020818303038152906040529050919050565b603a546001600160a01b0316331461173f5760405162461bcd60e51b81526004016109f490612b0c565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061178f83611467565b905060006117a08260600151610e1d565b9050600080836040015163ffffffff16116117bc5760006117d6565b6117d683604001516117cc6118f8565b6105769190612f01565b905061124b8183612ce8565b603a546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109f490612b0c565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166118d75760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b60648201526084016109f4565b610ba58282611fa8565b60006109c46118ef83611467565b60200151610e1d565b6000610c74600a42612d11565b603a546001600160a01b0316331461192f5760405162461bcd60e51b81526004016109f490612b0c565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146119ab5760405162461bcd60e51b81526004016109f490612b0c565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a3f82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015611001576000611aa7858585818110611a9b57611a9b612c9a565b90506020020135612036565b9050336001600160a01b03821614611afa5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611a7c565b80611b0f610c44565b611b199190612ce8565b611e611015611b765760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b60648201526084016109f4565b610ba58282612042565b600080611b8c83611187565b9050836001600160a01b0316816001600160a01b03161480611bc757506000838152600660205260409020546001600160a01b038581169116145b80611bf757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611c0881611187565b6001600160a01b0316836001600160a01b031614611c685760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f6600000060448201526064016109f4565b6001600160a01b038216611cbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f203078300000000000000060448201526064016109f4565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611d026118f8565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612f6e83398151915291a4505050565b8051825114611de95760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d617463682100000000000000000060448201526064016109f4565b60005b8251811015610a0a57611e31838281518110611e0a57611e0a612c9a565b6020026020010151838381518110611e2457611e24612c9a565b6020026020010151611b06565b600101611dec565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611ecd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef75780611ee181612cb0565b9150611ef09050600a83612d11565b9150611ed1565b60008167ffffffffffffffff811115611f1257611f126129f0565b6040519080825280601f01601f191660200182016040528015611f3c576020820181803683370190505b5090505b8415611bf75781611f5081612f25565b9250611f5f9050600a86612f3c565b611f6a906030612ce8565b60f81b818381518110611f7f57611f7f612c9a565b60200101906001600160f81b031916908160001a905350611fa1600a86612d11565b9450611f40565b6000815b80821015611001576000611fd7858585818110611fcb57611fcb612c9a565b905060200201356120d1565b9050336001600160a01b0382161461202a5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611fac565b60006109c482426120da565b805b7f00000000000000000000000000000000000000000000000000000000000000008111156120c7576120967f000000000000000000000000000000000000000000000000000000000000000082612c87565b90506120c2837f00000000000000000000000000000000000000000000000000000000000000006123b1565b612044565b610a0a83826123b1565b60006109c48260005b6000806120e684611467565b80516040820151919250906120fb8684612580565b600086815260066020526040902080546001600160a01b031916905584156121f55763ffffffff8116156121865760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b60648201526084016109f4565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612f6e83398151915291a461236d565b8063ffffffff166000036122625760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b60648201526084016109f4565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff199091161790559061229e3090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816122de6118f8565b6122e89190612f01565b600088815260036020526040902080549192508291601c90612318908490600160e01b900463ffffffff16612f50565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166123483090565b6001600160a01b0316600080516020612f6e83398151915260405160405180910390a4505b61237685611254565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f2030783000000060448201526064016109f4565b7f00000000000000000000000000000000000000000000000000000000000000008111156124885760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b60648201526084016109f4565b60025460006124978383612ce8565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506124c86118f8565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612f6e833981519152908290a480826001019250821061254557600255505050565b6000828152600360205260409020546001600160a01b0316610ba557600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461263557600080fd5b50565b60006020828403121561264a57600080fd5b8135610d798161261f565b6000806020838503121561266857600080fd5b823567ffffffffffffffff8082111561268057600080fd5b818501915085601f83011261269457600080fd5b8135818111156126a357600080fd5b8660208285010111156126b557600080fd5b60209290920196919550909350505050565b60005b838110156126e25781810151838201526020016126ca565b50506000910152565b600081518084526127038160208601602086016126c7565b601f01601f19169290920160200192915050565b602081526000610d7960208301846126eb565b60006020828403121561273c57600080fd5b5035919050565b80356001600160a01b038116811461160e57600080fd5b6000806040838503121561276d57600080fd5b61277683612743565b946020939093013593505050565b60008083601f84011261279657600080fd5b50813567ffffffffffffffff8111156127ae57600080fd5b6020830191508360208260051b85010111156127c957600080fd5b9250929050565b600080602083850312156127e357600080fd5b823567ffffffffffffffff8111156127fa57600080fd5b61280685828601612784565b90969095509350505050565b8035801515811461160e57600080fd5b60006020828403121561283457600080fd5b610d7982612812565b60008060006060848603121561285257600080fd5b61285b84612743565b925061286960208501612743565b9150604084013590509250925092565b60008060006040848603121561288e57600080fd5b61289784612743565b9250602084013567ffffffffffffffff8111156128b357600080fd5b6128bf86828701612784565b9497909650939450505050565b6000602082840312156128de57600080fd5b610d7982612743565b6000602082840312156128f957600080fd5b813563ffffffff81168114610d7957600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561294557835183529284019291840191600101612929565b50909695505050505050565b6000806000806040858703121561296757600080fd5b843567ffffffffffffffff8082111561297f57600080fd5b61298b88838901612784565b909650945060208701359150808211156129a457600080fd5b506129b187828801612784565b95989497509550505050565b600080604083850312156129d057600080fd5b6129d983612743565b91506129e760208401612812565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a1c57600080fd5b612a2585612743565b9350612a3360208601612743565b925060408501359150606085013567ffffffffffffffff80821115612a5757600080fd5b818701915087601f830112612a6b57600080fd5b813581811115612a7d57612a7d6129f0565b604051601f8201601f19908116603f01168101908382118183101715612aa557612aa56129f0565b816040528281528a6020848701011115612abe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612af557600080fd5b612afe83612743565b91506129e760208401612743565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c90821680612b4457607f821691505b602082108103612b6457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0a57600081815260208120601f850160051c81016020861015612b915750805b601f850160051c820191505b8181101561145f57828155600101612b9d565b67ffffffffffffffff831115612bc857612bc86129f0565b612bdc83612bd68354612b30565b83612b6a565b6000601f841160018114612c105760008515612bf85750838201355b600019600387901b1c1916600186901b178355612c6a565b600083815260209020601f19861690835b82811015612c415786850135825560209485019460019092019101612c21565b5086821015612c5e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109c4576109c4612c71565b634e487b7160e01b600052603260045260246000fd5b600060018201612cc257612cc2612c71565b5060010190565b6000816000190483118215151615612ce357612ce3612c71565b500290565b808201808211156109c4576109c4612c71565b634e487b7160e01b600052601260045260246000fd5b600082612d2057612d20612cfb565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d58908301846126eb565b9695505050505050565b60008251612d748184602087016126c7565b9190910192915050565b600060208284031215612d9057600080fd5b8151610d798161261f565b815167ffffffffffffffff811115612db557612db56129f0565b612dc981612dc38454612b30565b84612b6a565b602080601f831160018114612dfe5760008415612de65750858301515b600019600386901b1c1916600185901b17855561145f565b600085815260208120601f198616915b82811015612e2d57888601518255948401946001909101908401612e0e565b5085821015612e4b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612e6881612b30565b60018281168015612e805760018114612e9557612ec4565b60ff1984168752821515830287019450612ec4565b8560005260208060002060005b85811015612ebb5781548a820152908401908201612ea2565b50505082870194505b5050505092915050565b6000612eda8286612e5b565b8451612eea8183602089016126c7565b612ef681830186612e5b565b979650505050505050565b63ffffffff828116828216039080821115612f1e57612f1e612c71565b5092915050565b600081612f3457612f34612c71565b506000190190565b600082612f4b57612f4b612cfb565b500690565b63ffffffff818116838216019080821115612f1e57612f1e612c7156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec64736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103785760003560e01c806388895767116101d3578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d14610917578063f2fde38b1461091f578063f46eccc414610932578063f65982951461095557600080fd5b8063e6798baa146108af578063e985e9c5146108d6578063f0e56f0d1461090457600080fd5b8063d55f9273116100de578063d55f927314610884578063d5abeb011461088d578063d7b4be2414610896578063e449f3411461089c57600080fd5b8063c969a5ab1461084b578063ced74b501461085e578063cf456ae71461087157600080fd5b8063a713e45b11610171578063b88d4fde1161014b578063b88d4fde146107b5578063ba745f2e146107c8578063bd5404a814610825578063c87b56dd1461083857600080fd5b8063a713e45b14610743578063b0b50ed514610756578063b4bd7c32146107a357600080fd5b8063993568c1116101ad578063993568c1146106fd5780639b10b771146107105780639ee0bcbc1461071d578063a22cb4651461073057600080fd5b806388895767146106ba5780638da5cb5b146106e257806395d89b41146106f557600080fd5b80633455f41e116102ad5780635266069d1161024b5780636352211e116102255780636352211e1461065c57806370a082311461066f5780637b2cbd2d1461069e57806384023454146106a757600080fd5b80635266069d146105e75780635aea7ec1146106365780635e7676e11461064957600080fd5b8063438b630011610287578063438b63001461058e578063470f2c1f146105ae5780634749900a146105c15780634b0ee02a146105d457600080fd5b80633455f41e14610555578063403082f21461056857806342842e0e1461057b57600080fd5b8063153db98a1161031a57806323b872dd116102f457806323b872dd146104855780632913daa0146104985780632c2cdd60146104bf57806332e30f511461054257600080fd5b8063153db98a1461044957806318160ddd1461045c5780631c08c6b71461047257600080fd5b8063081812fc11610356578063081812fc146103cf578063095ea7b3146104105780630fbf0a93146104235780630ffdf2681461043657600080fd5b806301ffc9a71461037d578063021bcdcf146103a557806306fdde03146103ba575b600080fd5b61039061038b366004612638565b61095d565b60405190151581526020015b60405180910390f35b6103b86103b3366004612655565b6109ca565b005b6103c2610a0f565b60405161039c9190612717565b6103f86103dd36600461272a565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161039c565b6103b861041e36600461275a565b610a9d565b6103b86104313660046127d0565b610b3a565b6103b8610444366004612822565b610ba9565b6103b861045736600461275a565b610bed565b610464610c44565b60405190815260200161039c565b6103b8610480366004612655565b610c79565b6103b861049336600461283d565b610cb0565b6104647f000000000000000000000000000000000000000000000000000000000000001481565b61050c6104cd36600461272a565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff93841660208601529183169184019190915216606082015260800161039c565b610390610550366004612879565b610d1c565b6104646105633660046128cc565b610d80565b6104646105763660046128e7565b610e1d565b6103b861058936600461283d565b610e30565b6105a161059c3660046128cc565b610e4b565b60405161039c919061290d565b6103b86105bc366004612951565b610f47565b6103b86105cf366004612822565b611007565b6104646105e23660046128cc565b611044565b6106196105f53660046128cc565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff93841681529290911660208301520161039c565b6105a16106443660046128cc565b611078565b6103f861065736600461272a565b611175565b6103f861066a36600461272a565b611187565b61046461067d3660046128cc565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b610464603d5481565b6105a16106b53660046127d0565b6111ad565b6106cd6106c836600461272a565b611254565b60405163ffffffff909116815260200161039c565b603a546103f8906001600160a01b031681565b6103c2611261565b61046461070b36600461272a565b61126e565b603e546103909060ff1681565b61046461072b36600461272a565b611285565b6103b861073e3660046129bd565b61129c565b610390610751366004612879565b6112a7565b61050c61076436600461272a565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461039090610100900460ff1681565b6103b86107c3366004612a06565b611309565b6107db6107d636600461272a565b611467565b60405161039c919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103b86108333660046128cc565b611613565b6103c261084636600461272a565b6116c3565b6103b8610859366004612ae2565b611715565b61046461086c36600461272a565b611783565b6103b861087f3660046129bd565b6117e2565b61046460025481565b610464611e6181565b306103f8565b6103b86108aa3660046127d0565b61186f565b6104647f000000000000000000000000000000000000000000000000000000000000000181565b6103906108e4366004612ae2565b600760209081526000928352604080842090915290825290205460ff1681565b61046461091236600461272a565b6118e1565b6106cd6118f8565b6103b861092d3660046128cc565b611905565b6103906109403660046128cc565b603b6020526000908152604090205460ff1681565b6103b8611981565b60006301ffc9a760e01b6001600160e01b03198316148061098e57506380ac58cd60e01b6001600160e01b03198316145b806109a95750635b5e139f60e01b6001600160e01b03198316145b806109c457506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109fd5760405162461bcd60e51b81526004016109f490612b0c565b60405180910390fd5b603f610a0a828483612bb0565b505050565b60008054610a1c90612b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4890612b30565b8015610a955780601f10610a6a57610100808354040283529160200191610a95565b820191906000526020600020905b815481529060010190602001808311610a7857829003601f168201915b505050505081565b6000610aa882611187565b90506001600160a01b038116331480610ae457506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610b305760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a65640060448201526064016109f4565b610a0a8383611a0a565b603e5460ff16610b9b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b60648201526084016109f4565b610ba58282611a78565b5050565b603a546001600160a01b03163314610bd35760405162461bcd60e51b81526004016109f490612b0c565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610c3a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b610ba58282611b06565b60007f0000000000000000000000000000000000000000000000000000000000000001600254610c749190612c87565b905090565b603a546001600160a01b03163314610ca35760405162461bcd60e51b81526004016109f490612b0c565b6040610a0a828483612bb0565b610cba3382611b80565b610d115760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b60648201526084016109f4565b610a0a838383611bff565b600080825b856001600160a01b0316610d4c868685818110610d4057610d40612c9a565b90506020020135611175565b6001600160a01b031614610d6557600092505050610d79565b808260010192508210610d21576001925050505b9392505050565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000001905b80821015610e1457846001600160a01b0316610dc683611187565b6001600160a01b031614158015610df65750846001600160a01b0316610deb83611175565b6001600160a01b0316145b15610e095782610e0581612cb0565b9350505b816001019150610dab565b50909392505050565b60006109c463ffffffff8316600a612cc9565b610a0a83838360405180602001604052806000815250611309565b60606000610e74836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610e9157610e916129f0565b604051908082528060200260200182016040528015610eba578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610f3d57856001600160a01b0316610efc82611187565b6001600160a01b031603610f3557808383610f1681612cb0565b945081518110610f2857610f28612c9a565b6020026020010181815250505b600101610ee1565b5090949350505050565b336000908152603b602052604090205460ff16610f945760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b60448201526064016109f4565b61100184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d9892505050565b50505050565b603a546001600160a01b031633146110315760405162461bcd60e51b81526004016109f490612b0c565b603e805460ff1916911515919091179055565b600061104f82610d80565b6001600160a01b03831660009081526004602052604090205463ffffffff166109c49190612ce8565b6060600061108583610d80565b905060008167ffffffffffffffff8111156110a2576110a26129f0565b6040519080825280602002602001820160405280156110cb578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610f3d57856001600160a01b031661110d82611187565b6001600160a01b03161415801561113d5750856001600160a01b031661113282611175565b6001600160a01b0316145b1561116d5780838361114e81612cb0565b94508151811061116057611160612c9a565b6020026020010181815250505b6001016110f2565b600061118082611467565b5192915050565b60008061119383611467565b9050806040015163ffffffff166000146111805730610d79565b6060600082818167ffffffffffffffff8111156111cc576111cc6129f0565b6040519080825280602002602001820160405280156111f5578160200160208202803683370190505b5090505b8183101561124b5761122286868581811061121657611216612c9a565b90506020020135611783565b81848151811061123457611234612c9a565b6020026020010181815250508260010192506111f9565b95945050505050565b60006109c4600a83612d11565b60018054610a1c90612b30565b60006109c461127c83611467565b60600151610e1d565b60006109c461129383611467565b60400151610e1d565b610ba5338383611e39565b600080825b856001600160a01b03166112d78686858181106112cb576112cb612c9a565b90506020020135611187565b6001600160a01b0316146112f057600092505050610d79565b8082600101925082106112ac5750600195945050505050565b611314848484610cb0565b6001600160a01b0383163b15611001576000836001600160a01b031663150b7a023387868660405160240161134c9493929190612d25565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516113859190612d62565b6000604051808303816000865af19150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b509150506000818060200190518101906113e19190612d7e565b9050630a85bd0160e11b6001600160e01b031982161461145f5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b60648201526084016109f4565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000018210156114fb5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e672049642100000000000060448201526064016109f4565b6000828152600360205260409020546001600160a01b031615158061152257506002548210155b156115865750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166115ad5760001901611588565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561162357600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000602082015260009061168e9082612d9b565b506040805180820190915260078152664741533a45564f60c81b60208201526001906116ba9082612d9b565b50506001600255565b6060466001146116e157505060408051602081019091526000815290565b603f6116ec83611ea6565b604080516020016116ff93929190612ece565b6040516020818303038152906040529050919050565b603a546001600160a01b0316331461173f5760405162461bcd60e51b81526004016109f490612b0c565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061178f83611467565b905060006117a08260600151610e1d565b9050600080836040015163ffffffff16116117bc5760006117d6565b6117d683604001516117cc6118f8565b6105769190612f01565b905061124b8183612ce8565b603a546001600160a01b0316331461180c5760405162461bcd60e51b81526004016109f490612b0c565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166118d75760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b60648201526084016109f4565b610ba58282611fa8565b60006109c46118ef83611467565b60200151610e1d565b6000610c74600a42612d11565b603a546001600160a01b0316331461192f5760405162461bcd60e51b81526004016109f490612b0c565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146119ab5760405162461bcd60e51b81526004016109f490612b0c565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a3f82611187565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015611001576000611aa7858585818110611a9b57611a9b612c9a565b90506020020135612036565b9050336001600160a01b03821614611afa5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611a7c565b80611b0f610c44565b611b199190612ce8565b611e611015611b765760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b60648201526084016109f4565b610ba58282612042565b600080611b8c83611187565b9050836001600160a01b0316816001600160a01b03161480611bc757506000838152600660205260409020546001600160a01b038581169116145b80611bf757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611c0881611187565b6001600160a01b0316836001600160a01b031614611c685760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f6600000060448201526064016109f4565b6001600160a01b038216611cbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f203078300000000000000060448201526064016109f4565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611d026118f8565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612f6e83398151915291a4505050565b8051825114611de95760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d617463682100000000000000000060448201526064016109f4565b60005b8251811015610a0a57611e31838281518110611e0a57611e0a612c9a565b6020026020010151838381518110611e2457611e24612c9a565b6020026020010151611b06565b600101611dec565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611ecd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ef75780611ee181612cb0565b9150611ef09050600a83612d11565b9150611ed1565b60008167ffffffffffffffff811115611f1257611f126129f0565b6040519080825280601f01601f191660200182016040528015611f3c576020820181803683370190505b5090505b8415611bf75781611f5081612f25565b9250611f5f9050600a86612f3c565b611f6a906030612ce8565b60f81b818381518110611f7f57611f7f612c9a565b60200101906001600160f81b031916908160001a905350611fa1600a86612d11565b9450611f40565b6000815b80821015611001576000611fd7858585818110611fcb57611fcb612c9a565b905060200201356120d1565b9050336001600160a01b0382161461202a5760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064016109f4565b82600101925050611fac565b60006109c482426120da565b805b7f00000000000000000000000000000000000000000000000000000000000000148111156120c7576120967f000000000000000000000000000000000000000000000000000000000000001482612c87565b90506120c2837f00000000000000000000000000000000000000000000000000000000000000146123b1565b612044565b610a0a83826123b1565b60006109c48260005b6000806120e684611467565b80516040820151919250906120fb8684612580565b600086815260066020526040902080546001600160a01b031916905584156121f55763ffffffff8116156121865760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b60648201526084016109f4565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612f6e83398151915291a461236d565b8063ffffffff166000036122625760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b60648201526084016109f4565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff199091161790559061229e3090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816122de6118f8565b6122e89190612f01565b600088815260036020526040902080549192508291601c90612318908490600160e01b900463ffffffff16612f50565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166123483090565b6001600160a01b0316600080516020612f6e83398151915260405160405180910390a4505b61237685611254565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f2030783000000060448201526064016109f4565b7f00000000000000000000000000000000000000000000000000000000000000148111156124885760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b60648201526084016109f4565b60025460006124978383612ce8565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506124c86118f8565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612f6e833981519152908290a480826001019250821061254557600255505050565b6000828152600360205260409020546001600160a01b0316610ba557600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461263557600080fd5b50565b60006020828403121561264a57600080fd5b8135610d798161261f565b6000806020838503121561266857600080fd5b823567ffffffffffffffff8082111561268057600080fd5b818501915085601f83011261269457600080fd5b8135818111156126a357600080fd5b8660208285010111156126b557600080fd5b60209290920196919550909350505050565b60005b838110156126e25781810151838201526020016126ca565b50506000910152565b600081518084526127038160208601602086016126c7565b601f01601f19169290920160200192915050565b602081526000610d7960208301846126eb565b60006020828403121561273c57600080fd5b5035919050565b80356001600160a01b038116811461160e57600080fd5b6000806040838503121561276d57600080fd5b61277683612743565b946020939093013593505050565b60008083601f84011261279657600080fd5b50813567ffffffffffffffff8111156127ae57600080fd5b6020830191508360208260051b85010111156127c957600080fd5b9250929050565b600080602083850312156127e357600080fd5b823567ffffffffffffffff8111156127fa57600080fd5b61280685828601612784565b90969095509350505050565b8035801515811461160e57600080fd5b60006020828403121561283457600080fd5b610d7982612812565b60008060006060848603121561285257600080fd5b61285b84612743565b925061286960208501612743565b9150604084013590509250925092565b60008060006040848603121561288e57600080fd5b61289784612743565b9250602084013567ffffffffffffffff8111156128b357600080fd5b6128bf86828701612784565b9497909650939450505050565b6000602082840312156128de57600080fd5b610d7982612743565b6000602082840312156128f957600080fd5b813563ffffffff81168114610d7957600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561294557835183529284019291840191600101612929565b50909695505050505050565b6000806000806040858703121561296757600080fd5b843567ffffffffffffffff8082111561297f57600080fd5b61298b88838901612784565b909650945060208701359150808211156129a457600080fd5b506129b187828801612784565b95989497509550505050565b600080604083850312156129d057600080fd5b6129d983612743565b91506129e760208401612812565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612a1c57600080fd5b612a2585612743565b9350612a3360208601612743565b925060408501359150606085013567ffffffffffffffff80821115612a5757600080fd5b818701915087601f830112612a6b57600080fd5b813581811115612a7d57612a7d6129f0565b604051601f8201601f19908116603f01168101908382118183101715612aa557612aa56129f0565b816040528281528a6020848701011115612abe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612af557600080fd5b612afe83612743565b91506129e760208401612743565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c90821680612b4457607f821691505b602082108103612b6457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0a57600081815260208120601f850160051c81016020861015612b915750805b601f850160051c820191505b8181101561145f57828155600101612b9d565b67ffffffffffffffff831115612bc857612bc86129f0565b612bdc83612bd68354612b30565b83612b6a565b6000601f841160018114612c105760008515612bf85750838201355b600019600387901b1c1916600186901b178355612c6a565b600083815260209020601f19861690835b82811015612c415786850135825560209485019460019092019101612c21565b5086821015612c5e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109c4576109c4612c71565b634e487b7160e01b600052603260045260246000fd5b600060018201612cc257612cc2612c71565b5060010190565b6000816000190483118215151615612ce357612ce3612c71565b500290565b808201808211156109c4576109c4612c71565b634e487b7160e01b600052601260045260246000fd5b600082612d2057612d20612cfb565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d58908301846126eb565b9695505050505050565b60008251612d748184602087016126c7565b9190910192915050565b600060208284031215612d9057600080fd5b8151610d798161261f565b815167ffffffffffffffff811115612db557612db56129f0565b612dc981612dc38454612b30565b84612b6a565b602080601f831160018114612dfe5760008415612de65750858301515b600019600386901b1c1916600185901b17855561145f565b600085815260208120601f198616915b82811015612e2d57888601518255948401946001909101908401612e0e565b5085821015612e4b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612e6881612b30565b60018281168015612e805760018114612e9557612ec4565b60ff1984168752821515830287019450612ec4565b8560005260208060002060005b85811015612ebb5781548a820152908401908201612ea2565b50505082870194505b5050505092915050565b6000612eda8286612e5b565b8451612eea8183602089016126c7565b612ef681830186612e5b565b979650505050505050565b63ffffffff828116828216039080821115612f1e57612f1e612c71565b5092915050565b600081612f3457612f34612c71565b506000190190565b600082612f4b57612f4b612cfb565b500690565b63ffffffff818116838216019080821115612f1e57612f1e612c7156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec64736f6c63430008100033
Deployed Bytecode Sourcemap
28714:4599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27506:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27506:186:0;;;;;;;;31590:97;;;;;;:::i;:::-;;:::i;:::-;;1442:18;;;:::i;:::-;;;;;;;:::i;3588:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3588:46:0;;;;;;-1:-1:-1;;;;;2294:32:1;;;2276:51;;2264:2;2249:18;3588:46:0;2130:203:1;25487:447:0;;;;;;:::i;:::-;;:::i;30431:182::-;;;;;;:::i;:::-;;:::i;29996:104::-;;;;;;:::i;:::-;;:::i;31209:114::-;;;;;;:::i;:::-;;:::i;4815:112::-;;;:::i;:::-;;;4085:25:1;;;4073:2;4058:18;4815:112:0;3939:177:1;31693:105:0;;;;;;:::i;:::-;;:::i;26548:244::-;;;;;;:::i;:::-;;:::i;1853:37::-;;;;;3310:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3310:49:0;;;;-1:-1:-1;;;3310:49:0;;;;;-1:-1:-1;;;3310:49:0;;;;;-1:-1:-1;;;3310:49:0;;;;;;;;;;-1:-1:-1;;;;;4697:32:1;;;4679:51;;4749:10;4795:15;;;4790:2;4775:18;;4768:43;4847:15;;;4827:18;;;4820:43;;;;4899:15;4894:2;4879:18;;4872:43;4666:3;4651:19;3310:49:0;4454:467:1;32904:341:0;;;;;;:::i;:::-;;:::i;20636:406::-;;;;;;:::i;:::-;;:::i;4073:138::-;;;;;;:::i;:::-;;:::i;27344:154::-;;;;;;:::i;:::-;;:::i;27700:467::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31329:153::-;;;;;;:::i;:::-;;:::i;29890:100::-;;;;;;:::i;:::-;;:::i;22363:153::-;;;;;;:::i;:::-;;:::i;3389:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;7509:10:1;7546:15;;;7528:34;;7598:15;;;;7593:2;7578:18;;7571:43;7472:18;3389:53:0;7329:291:1;21468:539:0;;;;;;:::i;:::-;;:::i;7155:135::-;;;;;;:::i;:::-;;:::i;6622:241::-;;;;;;:::i;:::-;;:::i;4933:131::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5026:22:0;4999:7;5026:22;;;:12;:22;;;;;:30;;;;4933:131;29398:29;;;;;;23891:424;;;;;;:::i;:::-;;:::i;3928:139::-;;;;;;:::i;:::-;;:::i;:::-;;;7981:10:1;7969:23;;;7951:42;;7939:2;7924:18;3928:139:0;7807:192:1;94:20:0;;;;;-1:-1:-1;;;;;94:20:0;;;1481;;;:::i;4575:174::-;;;;;;:::i;:::-;;:::i;29818:28::-;;;;;;;;;4397:172;;;;;;:::i;:::-;;:::i;26176:227::-;;;;;;:::i;:::-;;:::i;32566:332::-;;;;;;:::i;:::-;;:::i;3474:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3474:48:0;;;;-1:-1:-1;;;3474:48:0;;;;;-1:-1:-1;;;3474:48:0;;;;;-1:-1:-1;;;3474:48:0;;;;;;29853:30;;;;;;;;;;;;26798:540;;;;;;:::i;:::-;;:::i;5521:773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;9763:13:1;;-1:-1:-1;;;;;9759:39:1;9741:58;;9846:4;9834:17;;;9828:24;9871:10;9919:21;;;9897:20;;;9890:51;;;;10001:4;9989:17;;;9983:24;9979:33;;9957:20;;;9950:63;10073:4;10061:17;;;10055:24;10051:33;10029:20;;;10022:63;;;;9728:3;9713:19;;9538:553;29032:295:0;;;;;;:::i;:::-;;:::i;32268:245::-;;;;;;:::i;:::-;;:::i;583:173::-;;;;;;:::i;:::-;;:::i;22933:556::-;;;;;;:::i;:::-;;:::i;28553:154::-;;;;;;:::i;:::-;;:::i;1559:25::-;;;;;;29736:40;;29772:4;29736:40;;2026:95;2108:4;2026:95;;30619:190;;;;;;:::i;:::-;;:::i;1700:37::-;;;;;3671:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4223:168;;;;;;:::i;:::-;;:::i;3791:131::-;;;:::i;398:179::-;;;;;;:::i;:::-;;:::i;28376:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29434:255;;;:::i;27506:186::-;27575:4;-1:-1:-1;;;;;;;;;27599:18:0;;;;:40;;-1:-1:-1;;;;;;;;;;27621:18:0;;;27599:40;:62;;;-1:-1:-1;;;;;;;;;;27643:18:0;;;27599:62;:84;;;-1:-1:-1;;;;;;;;;;27665:18:0;;;27599:84;27592:91;27506:186;-1:-1:-1;;27506:186:0:o;31590:97::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;;;;;;;;;31664:7:::1;:14;31674:4:::0;;31664:7;:14:::1;:::i;:::-;;31590:97:::0;;:::o;1442:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25487:447::-;25561:14;25578:17;25586:8;25578:7;:17::i;:::-;25561:34;-1:-1:-1;;;;;;25693:20:0;;25703:10;25693:20;;:148;;-1:-1:-1;;;;;;25805:24:0;;;;;;:16;:24;;;;;;;;25830:10;25805:36;;;;;;;;;;25693:148;25606:284;;;;-1:-1:-1;;;25606:284:0;;13345:2:1;25606:284:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:33;13403:18;;;13396:61;13474:18;;25606:284:0;13143:355:1;25606:284:0;25903:23;25912:3;25917:8;25903;:23::i;30431:182::-;30511:16;;;;30503:67;;;;-1:-1:-1;;;30503:67:0;;13705:2:1;30503:67:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:36;13880:19;;30503:67:0;13503:402:1;30503:67:0;30581:24;30595:9;;30581:13;:24::i;:::-;30431:182;;:::o;29996:104::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;30071:18:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;30071:26:0;;::::1;::::0;;;::::1;::::0;;29996:104::o;31209:114::-;28460:10;28452:19;;;;:7;:19;;;;;;;;28444:43;;;;-1:-1:-1;;;28444:43:0;;14112:2:1;28444:43:0;;;14094:21:1;14151:2;14131:18;;;14124:30;-1:-1:-1;;;14170:18:1;;;14163:41;14221:18;;28444:43:0;13910:335:1;28444:43:0;31296:19:::1;31302:3;31307:7;31296:5;:19::i;4815:112::-:0;4867:7;4907:12;4894:10;;:25;;;;:::i;:::-;4887:32;;4815:112;:::o;31693:105::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;31771:11:::1;:18;31785:4:::0;;31771:11;:18:::1;:::i;26548:244::-:0;26650:40;26669:10;26681:8;26650:18;:40::i;:::-;26642:100;;;;-1:-1:-1;;;26642:100:0;;14717:2:1;26642:100:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:34;14775:18;;;14768:62;-1:-1:-1;;;14846:18:1;;;14839:32;14888:19;;26642:100:0;14515:398:1;26642:100:0;26753:31;26763:5;26770:3;26775:8;26753:9;:31::i;32904:341::-;33004:4;;33075:9;33114:100;33166:5;-1:-1:-1;;;;;33136:35:0;:26;33149:9;;33159:1;33149:12;;;;;;;:::i;:::-;;;;;;;33136;:26::i;:::-;-1:-1:-1;;;;;33136:35:0;;33132:53;;33180:5;33173:12;;;;;;33132:53;33211:1;33205:3;;;;;;:7;33114:100;;33233:4;33226:11;;;;32904:341;;;;;;:::o;20636:406::-;20810:10;;20714:7;;;;20773:12;;20831:178;20842:3;20838:1;:7;20831:178;;;20880:8;-1:-1:-1;;;;;20866:22:0;:10;20874:1;20866:7;:10::i;:::-;-1:-1:-1;;;;;20866:22:0;;;:53;;;;;20911:8;-1:-1:-1;;;;;20892:27:0;:15;20905:1;20892:12;:15::i;:::-;-1:-1:-1;;;;;20892:27:0;;20866:53;20862:104;;;20940:10;;;;:::i;:::-;;;;20862:104;20992:3;;;;;20831:178;;;-1:-1:-1;21026:8:0;;20636:406;-1:-1:-1;;;20636:406:0:o;4073:138::-;4152:7;4179:24;:19;;;4201:2;4179:24;:::i;27344:154::-;27448:42;27465:5;27472:3;27477:8;27448:42;;;;;;;;;;;;:16;:42::i;27700:467::-;27776:16;27805;27824:19;27834:8;-1:-1:-1;;;;;5026:22:0;4999:7;5026:22;;;:12;:22;;;;;:30;;;;4933:131;27824:19;27805:38;;27854:24;27896:8;27881:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27881:24:0;-1:-1:-1;27854:51:0;-1:-1:-1;27916:21:0;27960:12;27983:152;28006:8;27990:13;:24;27983:152;;;28049:8;-1:-1:-1;;;;;28035:22:0;:10;28043:1;28035:7;:10::i;:::-;-1:-1:-1;;;;;28035:22:0;;28031:61;;28088:1;28061:7;28069:15;;;;:::i;:::-;;;28061:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;28031:61;28118:3;;27983:152;;;-1:-1:-1;28152:7:0;;27700:467;-1:-1:-1;;;;27700:467:0:o;31329:153::-;28460:10;28452:19;;;;:7;:19;;;;;;;;28444:43;;;;-1:-1:-1;;;28444:43:0;;14112:2:1;28444:43:0;;;14094:21:1;14151:2;14131:18;;;14124:30;-1:-1:-1;;;14170:18:1;;;14163:41;14221:18;;28444:43:0;13910:335:1;28444:43:0;31449:25:::1;31459:4;;31449:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;31449:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;31465:8:0;;-1:-1:-1;31465:8:0;;;;31449:25;::::1;::::0;31465:8;;31449:25;31465:8;31449:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31449:9:0::1;::::0;-1:-1:-1;;;31449:25:0:i:1;:::-;31329:153:::0;;;;:::o;29890:100::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;29963:16:::1;:24:::0;;-1:-1:-1;;29963:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29890:100::o;22363:153::-;22434:7;22483:25;22499:8;22483:15;:25::i;:::-;-1:-1:-1;;;;;5026:22:0;;4999:7;5026:22;;;:12;:22;;;;;:30;;;22461:47;;;;:::i;21468:539::-;21549:16;21578;21597:25;21613:8;21597:15;:25::i;:::-;21578:44;;21633:24;21675:8;21660:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21660:24:0;-1:-1:-1;21633:51:0;-1:-1:-1;21695:21:0;21739:12;21762:213;21785:8;21769:13;:24;21762:213;;;21828:8;-1:-1:-1;;;;;21814:22:0;:10;21822:1;21814:7;:10::i;:::-;-1:-1:-1;;;;;21814:22:0;;;:53;;;;;21859:8;-1:-1:-1;;;;;21840:27:0;:15;21853:1;21840:12;:15::i;:::-;-1:-1:-1;;;;;21840:27:0;;21814:53;21810:122;;;21915:1;21888:7;21896:15;;;;:::i;:::-;;;21888:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;21810:122;21958:3;;21762:213;;7155:135;7224:7;7251:25;7267:8;7251:15;:25::i;:::-;:31;;7155:135;-1:-1:-1;;7155:135:0:o;6622:241::-;6686:7;6706:31;6740:25;6756:8;6740:15;:25::i;:::-;6706:59;;6783:12;:27;;;:32;;6814:1;6783:32;:72;;2108:4;6783:72;;23891:424;23988:16;24017:9;24049;24017;24049;24113:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24113:17:0;;24076:54;;24141:132;24152:1;24148;:5;24141:132;;;24193:36;24216:9;;24226:1;24216:12;;;;;;;:::i;:::-;;;;;;;24193:22;:36::i;:::-;24170:17;24188:1;24170:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;24256:3;;;;;24141:132;;;24290:17;23891:424;-1:-1:-1;;;;;23891:424:0:o;3928:139::-;4010:6;4043:15;4056:2;4043:10;:15;:::i;1481:20::-;;;;;;;:::i;4575:174::-;4655:7;4682:59;4699:25;4715:8;4699:15;:25::i;:::-;:41;;;4682:16;:59::i;4397:172::-;4476:7;4503:58;4520:25;4536:8;4520:15;:25::i;:::-;:40;;;4503:16;:58::i;26176:227::-;26343:52;26362:10;26374:9;26385;26343:18;:52::i;32566:332::-;32662:4;;32733:9;32772:95;32819:5;-1:-1:-1;;;;;32794:30:0;:21;32802:9;;32812:1;32802:12;;;;;;;:::i;:::-;;;;;;;32794:7;:21::i;:::-;-1:-1:-1;;;;;32794:30:0;;32790:48;;32833:5;32826:12;;;;;;32790:48;32864:1;32858:3;;;;;;:7;32772:95;;-1:-1:-1;32886:4:0;;32566:332;-1:-1:-1;;;;;32566:332:0:o;26798:540::-;26921:34;26934:5;26941:3;26946:8;26921:12;:34::i;:::-;-1:-1:-1;;;;;26970:15:0;;;:20;26966:365;;27010:22;27036:3;-1:-1:-1;;;;;27036:8:0;27086:10;27098;27110:5;27117:8;27127:5;27045:88;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27045:88:0;;;;;;;;;;;27036:98;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27007:127;;;27149:16;27179:9;27168:31;;;;;;;;;;;;:::i;:::-;27149:50;-1:-1:-1;;;;;;;;;;27222:23:0;;;27214:105;;;;-1:-1:-1;;;27214:105:0;;16992:2:1;27214:105:0;;;16974:21:1;17031:2;17011:18;;;17004:30;17070:34;17050:18;;;17043:62;-1:-1:-1;;;17121:18:1;;;17114:49;17180:19;;27214:105:0;16790:415:1;27214:105:0;26992:339;;26798:540;;;;:::o;5521:773::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5705:12:0;5693:8;:24;;5685:63;;;;-1:-1:-1;;;5685:63:0;;17412:2:1;5685:63:0;;;17394:21:1;17451:2;17431:18;;;17424:30;17490:28;17470:18;;;17463:56;17536:18;;5685:63:0;17210:350:1;5685:63:0;5889:1;5851:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;5851:26:0;:40;;;:79;;;5920:10;;5908:8;:22;;5851:79;5847:440;;;-1:-1:-1;5954:20:0;;;;:10;:20;;;;;;;;;5947:27;;;;;;;;;-1:-1:-1;;;;;5947:27:0;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;;;-1:-1:-1;;;5947:27:0;;;;;;;;;5521:773::o;5847:440::-;6139:8;6162:69;6209:1;6169:22;;;:9;:22;;;;;:28;-1:-1:-1;;;;;6169:28:0;6162:69;;-1:-1:-1;;6215:13:0;6162:69;;;6252:22;;;;:9;:22;;;;;;;;;6245:29;;;;;;;;;-1:-1:-1;;;;;6245:29:0;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;;;-1:-1:-1;;;6245:29:0;;;;;;;;;5521:773;-1:-1:-1;;5521:773:0:o;5847:440::-;5521:773;;;:::o;29032:295::-;29104:18;;;;29103:19;29095:28;;;;;;29134:18;:25;;-1:-1:-1;;29134:25:0;29155:4;29134:25;;;29201:5;:16;;-1:-1:-1;;;;;29201:16:0;;-1:-1:-1;;;;;;29201:16:0;;;;;;29228:37;;;;;;;;;;;;;;;;;29134:18;;29228:37;;29134:18;29228:37;:::i;:::-;-1:-1:-1;29276:18:0;;;;;;;;;;;;-1:-1:-1;;;29276:18:0;;;;:6;;:18;;:6;:18;:::i;:::-;-1:-1:-1;;29318:1:0;29305:10;:14;29032:295::o;32268:245::-;32334:13;32391;32408:1;32391:18;32387:33;;-1:-1:-1;;32411:9:0;;;;;;;;;-1:-1:-1;32411:9:0;;;32268:245::o;32387:33::-;32462:7;32471:19;32481:8;32471:9;:19::i;:::-;32492:11;32445:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32431:74;;32268:245;;;:::o;583:173::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;743:4:::1;-1:-1:-1::0;;;;;716:32:0::1;737:4;-1:-1:-1::0;;;;;716:32:0::1;;;;;;;;;;;583:173:::0;;:::o;22933:556::-;23018:7;23038:31;23072:25;23088:8;23072:15;:25::i;:::-;23038:59;;23108:31;23142:46;23159:12;:28;;;23142:16;:46::i;:::-;23108:80;;23199:31;23277:1;23247:12;:27;;;:31;;;:165;;23411:1;23247:165;;;23294:96;23362:12;:27;;;23329:30;:28;:30::i;:::-;:60;;;;:::i;23294:96::-;23199:213;-1:-1:-1;23432:49:0;23199:213;23432:23;:49;:::i;28553:154::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28632:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;28632:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;28673:26;;20471:51:1;;;20538:18;;;20531:50;28673:26:0::1;::::0;20444:18:1;28673:26:0::1;;;;;;;28553:154:::0;;:::o;30619:190::-;30701:18;;;;;;;30693:71;;;;-1:-1:-1;;;30693:71:0;;20794:2:1;30693:71:0;;;20776:21:1;20833:2;20813:18;;;20806:30;20872:34;20852:18;;;20845:62;-1:-1:-1;;;20923:18:1;;;20916:38;20971:19;;30693:71:0;20592:404:1;30693:71:0;30775:26;30791:9;;30775:15;:26::i;4223:168::-;4300:7;4327:56;4344:25;4360:8;4344:15;:25::i;:::-;:38;;;4327:16;:56::i;3791:131::-;3860:6;3893:20;3911:2;3893:15;:20;:::i;398:179::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;489:5:::1;::::0;;-1:-1:-1;;;;;505:12:0;;::::1;-1:-1:-1::0;;;;;;505:12:0;::::1;::::0;::::1;::::0;;;533:36:::1;::::0;489:5;::::1;::::0;505:12;489:5;;533:36:::1;::::0;470:16:::1;::::0;533:36:::1;458:119;398:179:::0;:::o;29434:255::-;352:5;;-1:-1:-1;;;;;352:5:0;361:10;352:19;344:42;;;;-1:-1:-1;;;344:42:0;;;;;;;:::i;:::-;29521:159:::1;::::0;;29552:15:::1;29521:159;::::0;::::1;21286:19:1::0;29569:12:0::1;21321::1::0;;;21314:28;;;29583:16:0::1;21358:12:1::0;;;;21351:28;;;;29614:14:0::1;21413:15:1::0;;-1:-1:-1;;21409:53:1;21395:12;;;21388:75;29630:14:0::1;21479:13:1::0;;;21472:29;29646:23:0;::::1;21517:13:1::0;;;21510:29;21555:13;;29521:159:0::1;::::0;;-1:-1:-1;;29521:159:0;;::::1;::::0;;;;;;29511:170;;29521:159:::1;29511:170:::0;;::::1;::::0;29494:14:::1;:187:::0;29434:255::o;25309:170::-;25386:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;25386:27:0;-1:-1:-1;;;;;25386:27:0;;;;;;;;:21;;25438:17;25386:21;25438:7;:17::i;:::-;-1:-1:-1;;;;;25429:42:0;;;;;;;;;;;25309:170;;:::o;18856:424::-;18927:9;18959;18986:287;18997:1;18993;:5;18986:287;;;19069:14;19086:20;19093:9;;19103:1;19093:12;;;;;;;:::i;:::-;;;;;;;19086:6;:20::i;:::-;19069:37;-1:-1:-1;19184:10:0;-1:-1:-1;;;;;19184:20:0;;;19176:55;;;;-1:-1:-1;;;19176:55:0;;21781:2:1;19176:55:0;;;21763:21:1;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:52;21901:18;;19176:55:0;21579:346:1;19176:55:0;19257:3;;;;;19000:273;18986:287;;30135:229;30252:7;30236:13;:11;:13::i;:::-;:23;;;;:::i;:::-;29772:4;30222:38;;30214:99;;;;-1:-1:-1;;;30214:99:0;;22132:2:1;30214:99:0;;;22114:21:1;22171:2;22151:18;;;22144:30;22210:34;22190:18;;;22183:62;-1:-1:-1;;;22261:18:1;;;22254:33;22304:19;;30214:99:0;21930:399:1;30214:99:0;30324:32;30338:8;30348:7;30324:13;:32::i;24682:506::-;24783:4;24800:14;24817:17;24825:8;24817:7;:17::i;:::-;24800:34;;24949:8;-1:-1:-1;;;;;24939:18:0;:6;-1:-1:-1;;;;;24939:18:0;;:121;;;-1:-1:-1;25027:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;25027:33:0;;;:21;;:33;24939:121;:240;;;-1:-1:-1;;;;;;25145:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;24939:240;24845:335;24682:506;-1:-1:-1;;;;24682:506:0:o;17252:792::-;17412:17;17420:8;17412:7;:17::i;:::-;-1:-1:-1;;;;;17403:26:0;:5;-1:-1:-1;;;;;17403:26:0;;17395:68;;;;-1:-1:-1;;;17395:68:0;;22536:2:1;17395:68:0;;;22518:21:1;22575:2;22555:18;;;22548:30;22614:31;22594:18;;;22587:59;22663:18;;17395:68:0;22334:353:1;17395:68:0;-1:-1:-1;;;;;17517:17:0;;17509:55;;;;-1:-1:-1;;;17509:55:0;;22894:2:1;17509:55:0;;;22876:21:1;22933:2;22913:18;;;22906:30;22972:27;22952:18;;;22945:55;23017:18;;17509:55:0;22692:349:1;17509:55:0;17617:21;;;;:11;:21;;;;;;;;17610:28;;-1:-1:-1;;;;;;17610:28:0;;;;;;17685:10;:20;;;;;;:32;;;;;-1:-1:-1;;;;;17685:32:0;;;;;17764:30;:28;:30::i;:::-;17728:20;;;;:10;:20;;;;;;;;:66;;;;;;-1:-1:-1;;;17728:66:0;-1:-1:-1;;;;17728:66:0;;;;;;-1:-1:-1;;;;;17869:19:0;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;17869:29:0;;;;;;-1:-1:-1;;17869:29:0;;;;;;;17913:17;;;;;;;;;:27;;;;;-1:-1:-1;17913:27:0;;;;;;;;;;;;;;18006:30;17739:8;;17913:17;-1:-1:-1;;;;;;;;;;;18006:30:0;;17252:792;;;:::o;30844:326::-;30973:8;:15;30952:10;:17;:36;30944:72;;;;-1:-1:-1;;;30944:72:0;;23248:2:1;30944:72:0;;;23230:21:1;23287:2;23267:18;;;23260:30;23326:25;23306:18;;;23299:53;23369:18;;30944:72:0;23046:347:1;30944:72:0;31032:9;31027:136;31051:10;:17;31047:1;:21;31027:136;;;31086:33;31092:10;31103:1;31092:13;;;;;;;;:::i;:::-;;;;;;;31107:8;31116:1;31107:11;;;;;;;;:::i;:::-;;;;;;;31086:5;:33::i;:::-;31146:3;;31027:136;;25942:228;-1:-1:-1;;;;;26055:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;26055:47:0;;;;;;;;;;26118:44;;540:41:1;;;26118:44:0;;513:18:1;26118:44:0;;;;;;;25942:228;;;:::o;31804:458::-;31862:13;31892:6;31902:1;31892:11;31888:32;;-1:-1:-1;;31907:10:0;;;;;;;;;;;;-1:-1:-1;;;31907:10:0;;;;;31804:458::o;31888:32::-;31949:6;31930:16;31983:52;31990:13;;31983:52;;32007:9;;;;:::i;:::-;;-1:-1:-1;32018:14:0;;-1:-1:-1;32030:2:0;32018:14;;:::i;:::-;;;31983:52;;;32045:20;32078:7;32068:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32068:18:0;;32045:41;;32097:124;32104:11;;32097:124;;32119:9;;;;:::i;:::-;;-1:-1:-1;32189:11:0;;-1:-1:-1;32198:2:0;32189:6;:11;:::i;:::-;32176:26;;:2;:26;:::i;:::-;32149:55;;32130:7;32138;32130:16;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;32130:74:0;;;;;;;;-1:-1:-1;32206:12:0;32216:2;32206:12;;:::i;:::-;;;32097:124;;19514:430;19587:9;19619;19646:291;19657:1;19653;:5;19646:291;;;19731:14;19748:22;19757:9;;19767:1;19757:12;;;;;;;:::i;:::-;;;;;;;19748:8;:22::i;:::-;19731:39;-1:-1:-1;19848:10:0;-1:-1:-1;;;;;19848:20:0;;;19840:55;;;;-1:-1:-1;;;19840:55:0;;21781:2:1;19840:55:0;;;21763:21:1;21820:2;21800:18;;;21793:30;-1:-1:-1;;;21839:18:1;;;21832:52;21901:18;;19840:55:0;21579:346:1;19840:55:0;19921:3;;;;;19660:277;19646:291;;11189:215;11249:7;11351:45;11370:8;11380:15;11351:18;:45::i;16485:306::-;16582:7;16600:140;16623:12;16607:13;:28;16600:140;;;16652:29;16669:12;16652:29;;:::i;:::-;;;16696:32;16710:3;16715:12;16696:13;:32::i;:::-;16600:140;;;16750:33;16764:3;16769:13;16750;:33::i;11792:188::-;11853:7;11941:31;11960:8;11970:1;8572:2231;8669:7;8761:31;8795:25;8811:8;8795:15;:25::i;:::-;8848:18;;8902:27;;;;8761:59;;-1:-1:-1;8848:18:0;8997:42;9016:8;8761:59;8997:18;:42::i;:::-;9097:21;;;;:11;:21;;;;;9090:28;;-1:-1:-1;;;;;;9090:28:0;;;9188:14;;9184:1375;;9290:20;;;;9282:94;;;;-1:-1:-1;;;9282:94:0;;23858:2:1;9282:94:0;;;23840:21:1;23897:2;23877:18;;;23870:30;23936:34;23916:18;;;23909:62;-1:-1:-1;;;23987:18:1;;;23980:42;24039:19;;9282:94:0;23656:408:1;9282:94:0;-1:-1:-1;;;;;9504:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;9504:30:0;;;;;;;-1:-1:-1;;9504:30:0;;;;;;;2108:4;9553:30;;;;;;:40;;;;;-1:-1:-1;9553:40:0;;;;;;;;;;;;;;;9681:44;;9716:8;;2108:4;;-1:-1:-1;;;;;;;;;;;9681:44:0;;9184:1375;;;9883:15;:20;;9902:1;9883:20;9875:96;;;;-1:-1:-1;;;9875:96:0;;24271:2:1;9875:96:0;;;24253:21:1;24310:2;24290:18;;;24283:30;24349:34;24329:18;;;24322:62;-1:-1:-1;;;24400:18:1;;;24393:44;24454:19;;9875:96:0;24069:410:1;9875:96:0;-1:-1:-1;;;;;10099:20:0;;;;;;:12;:20;;;;;;;:30;;;;;;;;;-1:-1:-1;;10099:30:0;;;;;;:12;10161:16;2108:4;;2026:95;10161:16;-1:-1:-1;;;;;10148:30:0;;;;;;;;;;;;-1:-1:-1;10148:30:0;;;:40;;-1:-1:-1;;10148:40:0;;;;;;-1:-1:-1;;10148:40:0;;;;;;;10351:15;10318:30;:28;:30::i;:::-;:48;;;;:::i;:::-;10381:20;;;;:10;:20;;;;;:51;;10297:69;;-1:-1:-1;10297:69:0;;10381:36;;:51;;10297:69;;-1:-1:-1;;;10381:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10538:8;10530:6;-1:-1:-1;;;;;10503:44:0;10512:16;2108:4;;2026:95;10512:16;-1:-1:-1;;;;;10503:44:0;-1:-1:-1;;;;;;;;;;;10503:44:0;;;;;;;;;9810:749;9184:1375;10658:30;10677:10;10658:18;:30::i;:::-;10620:20;;;;:10;:20;;;;;:68;;;;;;;-1:-1:-1;;;10620:68:0;-1:-1:-1;;;;10620:68:0;;;;;;;;;-1:-1:-1;10789:6:0;-1:-1:-1;;8572:2231:0;;;;:::o;15247:1059::-;-1:-1:-1;;;;;15367:17:0;;15359:59;;;;-1:-1:-1;;;15359:59:0;;24863:2:1;15359:59:0;;;24845:21:1;24902:2;24882:18;;;24875:30;24941:31;24921:18;;;24914:59;24990:18;;15359:59:0;24661:353:1;15359:59:0;15513:12;15502:7;:23;;15494:90;;;;-1:-1:-1;;;15494:90:0;;25221:2:1;15494:90:0;;;25203:21:1;25260:2;25240:18;;;25233:30;25299:34;25279:18;;;25272:62;-1:-1:-1;;;25350:18:1;;;25343:38;25398:19;;15494:90:0;25019:404:1;15494:90:0;15654:10;;15635:16;15692:18;15703:7;15654:10;15692:18;:::i;:::-;15784:19;;;;:9;:19;;;;;:31;;-1:-1:-1;;;;;;15784:31:0;-1:-1:-1;;;;;15784:31:0;;;;;15675:35;-1:-1:-1;15861:30:0;:28;:30::i;:::-;15826:19;;;;:9;:19;;;;;;;;:65;;-1:-1:-1;;;;15826:65:0;-1:-1:-1;;;15826:65:0;;;;;;;;-1:-1:-1;;;;;16018:17:0;;;;:12;:17;;;;;:44;;-1:-1:-1;;16077:49:0;;16018:44;;;;;;;16077:49;;;;-1:-1:-1;;16018:44:0;;;;;;16077:49;;;;;;;;;;;;;;;;;16143:77;16153:35;;16179:8;;-1:-1:-1;;;;;16153:35:0;;;16170:1;;-1:-1:-1;;;;;;;;;;;16153:35:0;16170:1;;16153:35;16212:6;16199:10;;;;;;:19;16143:77;;16279:10;:19;-1:-1:-1;;;15247:1059:0:o;7739:300::-;7966:1;7928:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;7928:26:0;7924:108;;7985:20;;;;:10;:20;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7985:35:0;-1:-1:-1;;;;;7985:35:0;;;-1:-1:-1;;;7985:35:0;;;;;-1:-1:-1;;;;;7985:35:0;;;;-1:-1:-1;;;7985:35:0;-1:-1:-1;;;;;;7985:35:0;;;-1:-1:-1;;;;;7985:35:0;;;;;;;;;;;;;;;;;;;7739:300;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:592::-;663:6;671;724:2;712:9;703:7;699:23;695:32;692:52;;;740:1;737;730:12;692:52;780:9;767:23;809:18;850:2;842:6;839:14;836:34;;;866:1;863;856:12;836:34;904:6;893:9;889:22;879:32;;949:7;942:4;938:2;934:13;930:27;920:55;;971:1;968;961:12;920:55;1011:2;998:16;1037:2;1029:6;1026:14;1023:34;;;1053:1;1050;1043:12;1023:34;1098:7;1093:2;1084:6;1080:2;1076:15;1072:24;1069:37;1066:57;;;1119:1;1116;1109:12;1066:57;1150:2;1142:11;;;;;1172:6;;-1:-1:-1;592:592:1;;-1:-1:-1;;;;592:592:1:o;1189:250::-;1274:1;1284:113;1298:6;1295:1;1292:13;1284:113;;;1374:11;;;1368:18;1355:11;;;1348:39;1320:2;1313:10;1284:113;;;-1:-1:-1;;1431:1:1;1413:16;;1406:27;1189:250::o;1444:271::-;1486:3;1524:5;1518:12;1551:6;1546:3;1539:19;1567:76;1636:6;1629:4;1624:3;1620:14;1613:4;1606:5;1602:16;1567:76;:::i;:::-;1697:2;1676:15;-1:-1:-1;;1672:29:1;1663:39;;;;1704:4;1659:50;;1444:271;-1:-1:-1;;1444:271:1:o;1720:220::-;1869:2;1858:9;1851:21;1832:4;1889:45;1930:2;1919:9;1915:18;1907:6;1889:45;:::i;1945:180::-;2004:6;2057:2;2045:9;2036:7;2032:23;2028:32;2025:52;;;2073:1;2070;2063:12;2025:52;-1:-1:-1;2096:23:1;;1945:180;-1:-1:-1;1945:180:1:o;2338:173::-;2406:20;;-1:-1:-1;;;;;2455:31:1;;2445:42;;2435:70;;2501:1;2498;2491:12;2516:254;2584:6;2592;2645:2;2633:9;2624:7;2620:23;2616:32;2613:52;;;2661:1;2658;2651:12;2613:52;2684:29;2703:9;2684:29;:::i;:::-;2674:39;2760:2;2745:18;;;;2732:32;;-1:-1:-1;;;2516:254:1:o;2775:367::-;2838:8;2848:6;2902:3;2895:4;2887:6;2883:17;2879:27;2869:55;;2920:1;2917;2910:12;2869:55;-1:-1:-1;2943:20:1;;2986:18;2975:30;;2972:50;;;3018:1;3015;3008:12;2972:50;3055:4;3047:6;3043:17;3031:29;;3115:3;3108:4;3098:6;3095:1;3091:14;3083:6;3079:27;3075:38;3072:47;3069:67;;;3132:1;3129;3122:12;3069:67;2775:367;;;;;:::o;3147:437::-;3233:6;3241;3294:2;3282:9;3273:7;3269:23;3265:32;3262:52;;;3310:1;3307;3300:12;3262:52;3350:9;3337:23;3383:18;3375:6;3372:30;3369:50;;;3415:1;3412;3405:12;3369:50;3454:70;3516:7;3507:6;3496:9;3492:22;3454:70;:::i;:::-;3543:8;;3428:96;;-1:-1:-1;3147:437:1;-1:-1:-1;;;;3147:437:1:o;3589:160::-;3654:20;;3710:13;;3703:21;3693:32;;3683:60;;3739:1;3736;3729:12;3754:180;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3902:26;3918:9;3902:26;:::i;4121:328::-;4198:6;4206;4214;4267:2;4255:9;4246:7;4242:23;4238:32;4235:52;;;4283:1;4280;4273:12;4235:52;4306:29;4325:9;4306:29;:::i;:::-;4296:39;;4354:38;4388:2;4377:9;4373:18;4354:38;:::i;:::-;4344:48;;4439:2;4428:9;4424:18;4411:32;4401:42;;4121:328;;;;;:::o;4926:511::-;5021:6;5029;5037;5090:2;5078:9;5069:7;5065:23;5061:32;5058:52;;;5106:1;5103;5096:12;5058:52;5129:29;5148:9;5129:29;:::i;:::-;5119:39;;5209:2;5198:9;5194:18;5181:32;5236:18;5228:6;5225:30;5222:50;;;5268:1;5265;5258:12;5222:50;5307:70;5369:7;5360:6;5349:9;5345:22;5307:70;:::i;:::-;4926:511;;5396:8;;-1:-1:-1;5281:96:1;;-1:-1:-1;;;;4926:511:1:o;5442:186::-;5501:6;5554:2;5542:9;5533:7;5529:23;5525:32;5522:52;;;5570:1;5567;5560:12;5522:52;5593:29;5612:9;5593:29;:::i;5633:276::-;5691:6;5744:2;5732:9;5723:7;5719:23;5715:32;5712:52;;;5760:1;5757;5750:12;5712:52;5799:9;5786:23;5849:10;5842:5;5838:22;5831:5;5828:33;5818:61;;5875:1;5872;5865:12;5914:632;6085:2;6137:21;;;6207:13;;6110:18;;;6229:22;;;6056:4;;6085:2;6308:15;;;;6282:2;6267:18;;;6056:4;6351:169;6365:6;6362:1;6359:13;6351:169;;;6426:13;;6414:26;;6495:15;;;;6460:12;;;;6387:1;6380:9;6351:169;;;-1:-1:-1;6537:3:1;;5914:632;-1:-1:-1;;;;;;5914:632:1:o;6551:773::-;6673:6;6681;6689;6697;6750:2;6738:9;6729:7;6725:23;6721:32;6718:52;;;6766:1;6763;6756:12;6718:52;6806:9;6793:23;6835:18;6876:2;6868:6;6865:14;6862:34;;;6892:1;6889;6882:12;6862:34;6931:70;6993:7;6984:6;6973:9;6969:22;6931:70;:::i;:::-;7020:8;;-1:-1:-1;6905:96:1;-1:-1:-1;7108:2:1;7093:18;;7080:32;;-1:-1:-1;7124:16:1;;;7121:36;;;7153:1;7150;7143:12;7121:36;;7192:72;7256:7;7245:8;7234:9;7230:24;7192:72;:::i;:::-;6551:773;;;;-1:-1:-1;7283:8:1;-1:-1:-1;;;;6551:773:1:o;8004:254::-;8069:6;8077;8130:2;8118:9;8109:7;8105:23;8101:32;8098:52;;;8146:1;8143;8136:12;8098:52;8169:29;8188:9;8169:29;:::i;:::-;8159:39;;8217:35;8248:2;8237:9;8233:18;8217:35;:::i;:::-;8207:45;;8004:254;;;;;:::o;8263:127::-;8324:10;8319:3;8315:20;8312:1;8305:31;8355:4;8352:1;8345:15;8379:4;8376:1;8369:15;8395:1138;8490:6;8498;8506;8514;8567:3;8555:9;8546:7;8542:23;8538:33;8535:53;;;8584:1;8581;8574:12;8535:53;8607:29;8626:9;8607:29;:::i;:::-;8597:39;;8655:38;8689:2;8678:9;8674:18;8655:38;:::i;:::-;8645:48;;8740:2;8729:9;8725:18;8712:32;8702:42;;8795:2;8784:9;8780:18;8767:32;8818:18;8859:2;8851:6;8848:14;8845:34;;;8875:1;8872;8865:12;8845:34;8913:6;8902:9;8898:22;8888:32;;8958:7;8951:4;8947:2;8943:13;8939:27;8929:55;;8980:1;8977;8970:12;8929:55;9016:2;9003:16;9038:2;9034;9031:10;9028:36;;;9044:18;;:::i;:::-;9119:2;9113:9;9087:2;9173:13;;-1:-1:-1;;9169:22:1;;;9193:2;9165:31;9161:40;9149:53;;;9217:18;;;9237:22;;;9214:46;9211:72;;;9263:18;;:::i;:::-;9303:10;9299:2;9292:22;9338:2;9330:6;9323:18;9378:7;9373:2;9368;9364;9360:11;9356:20;9353:33;9350:53;;;9399:1;9396;9389:12;9350:53;9455:2;9450;9446;9442:11;9437:2;9429:6;9425:15;9412:46;9500:1;9495:2;9490;9482:6;9478:15;9474:24;9467:35;9521:6;9511:16;;;;;;;8395:1138;;;;;;;:::o;10096:260::-;10164:6;10172;10225:2;10213:9;10204:7;10200:23;10196:32;10193:52;;;10241:1;10238;10231:12;10193:52;10264:29;10283:9;10264:29;:::i;:::-;10254:39;;10312:38;10346:2;10335:9;10331:18;10312:38;:::i;10361:334::-;10563:2;10545:21;;;10602:2;10582:18;;;10575:30;-1:-1:-1;;;10636:2:1;10621:18;;10614:40;10686:2;10671:18;;10361:334::o;10700:380::-;10779:1;10775:12;;;;10822;;;10843:61;;10897:4;10889:6;10885:17;10875:27;;10843:61;10950:2;10942:6;10939:14;10919:18;10916:38;10913:161;;10996:10;10991:3;10987:20;10984:1;10977:31;11031:4;11028:1;11021:15;11059:4;11056:1;11049:15;10913:161;;10700:380;;;:::o;11211:545::-;11313:2;11308:3;11305:11;11302:448;;;11349:1;11374:5;11370:2;11363:17;11419:4;11415:2;11405:19;11489:2;11477:10;11473:19;11470:1;11466:27;11460:4;11456:38;11525:4;11513:10;11510:20;11507:47;;;-1:-1:-1;11548:4:1;11507:47;11603:2;11598:3;11594:12;11591:1;11587:20;11581:4;11577:31;11567:41;;11658:82;11676:2;11669:5;11666:13;11658:82;;;11721:17;;;11702:1;11691:13;11658:82;;11932:1206;12056:18;12051:3;12048:27;12045:53;;;12078:18;;:::i;:::-;12107:94;12197:3;12157:38;12189:4;12183:11;12157:38;:::i;:::-;12151:4;12107:94;:::i;:::-;12227:1;12252:2;12247:3;12244:11;12269:1;12264:616;;;;12924:1;12941:3;12938:93;;;-1:-1:-1;12997:19:1;;;12984:33;12938:93;-1:-1:-1;;11889:1:1;11885:11;;;11881:24;11877:29;11867:40;11913:1;11909:11;;;11864:57;13044:78;;12237:895;;12264:616;11158:1;11151:14;;;11195:4;11182:18;;-1:-1:-1;;12300:17:1;;;12401:9;12423:229;12437:7;12434:1;12431:14;12423:229;;;12526:19;;;12513:33;12498:49;;12633:4;12618:20;;;;12586:1;12574:14;;;;12453:12;12423:229;;;12427:3;12680;12671:7;12668:16;12665:159;;;12804:1;12800:6;12794:3;12788;12785:1;12781:11;12777:21;12773:34;12769:39;12756:9;12751:3;12747:19;12734:33;12730:79;12722:6;12715:95;12665:159;;;12867:1;12861:3;12858:1;12854:11;12850:19;12844:4;12837:33;12237:895;;;11932:1206;;;:::o;14250:127::-;14311:10;14306:3;14302:20;14299:1;14292:31;14342:4;14339:1;14332:15;14366:4;14363:1;14356:15;14382:128;14449:9;;;14470:11;;;14467:37;;;14484:18;;:::i;14918:127::-;14979:10;14974:3;14970:20;14967:1;14960:31;15010:4;15007:1;15000:15;15034:4;15031:1;15024:15;15050:135;15089:3;15110:17;;;15107:43;;15130:18;;:::i;:::-;-1:-1:-1;15177:1:1;15166:13;;15050:135::o;15190:168::-;15230:7;15296:1;15292;15288:6;15284:14;15281:1;15278:21;15273:1;15266:9;15259:17;15255:45;15252:71;;;15303:18;;:::i;:::-;-1:-1:-1;15343:9:1;;15190:168::o;15363:125::-;15428:9;;;15449:10;;;15446:36;;;15462:18;;:::i;15493:127::-;15554:10;15549:3;15545:20;15542:1;15535:31;15585:4;15582:1;15575:15;15609:4;15606:1;15599:15;15625:120;15665:1;15691;15681:35;;15696:18;;:::i;:::-;-1:-1:-1;15730:9:1;;15625:120::o;15750:489::-;-1:-1:-1;;;;;16019:15:1;;;16001:34;;16071:15;;16066:2;16051:18;;16044:43;16118:2;16103:18;;16096:34;;;16166:3;16161:2;16146:18;;16139:31;;;15944:4;;16187:46;;16213:19;;16205:6;16187:46;:::i;:::-;16179:54;15750:489;-1:-1:-1;;;;;;15750:489:1:o;16244:287::-;16373:3;16411:6;16405:13;16427:66;16486:6;16481:3;16474:4;16466:6;16462:17;16427:66;:::i;:::-;16509:16;;;;;16244:287;-1:-1:-1;;16244:287:1:o;16536:249::-;16605:6;16658:2;16646:9;16637:7;16633:23;16629:32;16626:52;;;16674:1;16671;16664:12;16626:52;16706:9;16700:16;16725:30;16749:5;16725:30;:::i;17565:1352::-;17691:3;17685:10;17718:18;17710:6;17707:30;17704:56;;;17740:18;;:::i;:::-;17769:97;17859:6;17819:38;17851:4;17845:11;17819:38;:::i;:::-;17813:4;17769:97;:::i;:::-;17921:4;;17985:2;17974:14;;18002:1;17997:663;;;;18704:1;18721:6;18718:89;;;-1:-1:-1;18773:19:1;;;18767:26;18718:89;-1:-1:-1;;11889:1:1;11885:11;;;11881:24;11877:29;11867:40;11913:1;11909:11;;;11864:57;18820:81;;17967:944;;17997:663;11158:1;11151:14;;;11195:4;11182:18;;-1:-1:-1;;18033:20:1;;;18151:236;18165:7;18162:1;18159:14;18151:236;;;18254:19;;;18248:26;18233:42;;18346:27;;;;18314:1;18302:14;;;;18181:19;;18151:236;;;18155:3;18415:6;18406:7;18403:19;18400:201;;;18476:19;;;18470:26;-1:-1:-1;;18559:1:1;18555:14;;;18571:3;18551:24;18547:37;18543:42;18528:58;18513:74;;18400:201;-1:-1:-1;;;;;18647:1:1;18631:14;;;18627:22;18614:36;;-1:-1:-1;17565:1352:1:o;18922:722::-;18972:3;19013:5;19007:12;19042:36;19068:9;19042:36;:::i;:::-;19097:1;19114:18;;;19141:133;;;;19288:1;19283:355;;;;19107:531;;19141:133;-1:-1:-1;;19174:24:1;;19162:37;;19247:14;;19240:22;19228:35;;19219:45;;;-1:-1:-1;19141:133:1;;19283:355;19314:5;19311:1;19304:16;19343:4;19388:2;19385:1;19375:16;19413:1;19427:165;19441:6;19438:1;19435:13;19427:165;;;19519:14;;19506:11;;;19499:35;19562:16;;;;19456:10;;19427:165;;;19431:3;;;19621:6;19616:3;19612:16;19605:23;;19107:531;;;;;18922:722;;;;:::o;19649:469::-;19870:3;19898:38;19932:3;19924:6;19898:38;:::i;:::-;19965:6;19959:13;19981:65;20039:6;20035:2;20028:4;20020:6;20016:17;19981:65;:::i;:::-;20062:50;20104:6;20100:2;20096:15;20088:6;20062:50;:::i;:::-;20055:57;19649:469;-1:-1:-1;;;;;;;19649:469:1:o;20123:175::-;20191:10;20234;;;20222;;;20218:27;;20257:12;;;20254:38;;;20272:18;;:::i;:::-;20254:38;20123:175;;;;:::o;23398:136::-;23437:3;23465:5;23455:39;;23474:18;;:::i;:::-;-1:-1:-1;;;23510:18:1;;23398:136::o;23539:112::-;23571:1;23597;23587:35;;23602:18;;:::i;:::-;-1:-1:-1;23636:9:1;;23539:112::o;24484:172::-;24551:10;24581;;;24593;;;24577:27;;24616:11;;;24613:37;;;24630:18;;:::i
Swarm Source
ipfs://4c1628d6160e2b92999a30d3a8edef811363fe11c3a9e67024315442cce1bbec
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.