Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60c06040 | 21072509 | 12 hrs ago | IN | 0 ETH | 0.05403038 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GAS2P2_20241029_1
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-29 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.16; interface IGASEVO { function transferFrom(address from_, address to_, uint256 id_) external; function balanceOf(address owner) external view returns (uint256); function ownerOf(uint256 id_) external view returns (address); function mintAsController(address to_, uint256 id_) external; } 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 // GAS2 Upgrade uint32 lastUnboxTimestamp; // stores the last unbox timestamp in compressed time // 160 free bits -- 20 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 GAS2P2_20241029_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; // GAS2P2_20241029_1 we no longer need to initialize // function proxyInitialize(address newOwner) external { // require(!proxyIsInitialized); // proxyIsInitialized = true; // // Hardcode // owner = newOwner; // name = "Gangster All Star: Evolution"; // symbol = "GAS:EVO"; // tokenIndex = 1; // } // GAS2P2_20241029_1 set new name and symbol for GAS2 function O_setNameAndSymbol(string calldata name_, string calldata symbol_) external onlyOwner { name = name_; symbol = symbol_; } // 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; } //////////////////////////////////////////////////////// ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 ///// ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 ///// ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 ///// //////////////////////////////////////////////////////// // For path 2, we are reusing the SSTORE for all early 1-7777 and repacking // them from box to GAS2 by using 0x...dead retransfer // For this, we have the issue of users able to unbox/reveal and accept bids immediately // For that, we will remedy it by locking user's transfers for 1h after revealing // Also, we need to figure out a way to indicate the packed-token is a box or a GAS2 // Initial ideas include checking the GASEVO contract if the EVO counterpart has been minted // Initialize the connection to GASEVO IGASEVO public constant GASEVO = IGASEVO(0x0f926Df0DDB33A1dB95088964E09Fa8Fb47E490E); // GAS EVO // Initialize a constant BURN_ADDRESS address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Packed ID claim function _claimGAS2Internal(address user_, uint256[] memory tokenIds_) internal { // All-or-nothing check uint256 _amount = tokenIds_.length; uint256 _balance = GASEVO.balanceOf(user_); require(_amount == _balance, "INVALID_UPGRADE_AMOUNT"); // Resurrection Claim on packed 1-7777 for (uint256 i; i < _amount;) { // Load current ID into memory uint256 _currId = tokenIds_[i]; // Make sure the current ID is owned by the user require(GASEVO.ownerOf(_currId) == user_, "NOT_OWNER_OF_TOKEN"); // Make sure that the token hasn't been claimed yet // Note: there is a edge case where the user can transfer "burn" and reclaim require(ownerOf(_currId) == BURN_ADDRESS, "TOKEN_EXISTS"); // If both conditions are met, packed-resurrect mint the GAS2 _transfer(BURN_ADDRESS, user_, _currId); // Increment the loop tracker unchecked { ++i; } } } // // Public msg.sender initiated claiming of GAS2 // function claimGAS2(uint256[] calldata tokenIds_) external { // _claimGAS2Internal(msg.sender, tokenIds_); // } // Priviledged claiming GAS2 for other users by onlyMinter function C_claimGAS2For(address user_, uint256[] calldata tokenIds_) external onlyMinter { _claimGAS2Internal(user_, tokenIds_); } // Now, we must create a function for the new reveal mechanic. // Here, we will reuse the SSTORE of GASEVO to indicate revealed / non revealed // The conditions are as following: // GAS2 - MINTED && GASEVO - NOT_MINTED => BOX / EQUIPMENT // GAS2 - MINTED && GASEVO - MINTED => CLAIMED & REVEALED // GAS2 - BURNED && GASEVO - MINTED => UNCLAIMED & UNREVEALED // GAS2 - BURNED && GASEVO - NOT_MINTED => EXCEPTION / ERROR // Additionally, after revealing, we lock the user's tokens transfer for 2H // This is the equivalent of an UNBOX function _unboxGAS2Internal(address user_, uint256[] memory tokenIds_) internal { for (uint256 i; i < tokenIds_.length;) { // Load current ID into memory uint256 _currId = tokenIds_[i]; // Make sure the user owns the token (BOX) require(ownerOf(_currId) == user_, "NOT_OWNER"); // Make sure the GASEVO counterpart hasn't been minted require(GASEVO.ownerOf(_currId) == address(0), "TOKEN_UNBOXED"); // Mint the GASEVO counterpart as a measure of unboxing GASEVO.mintAsController(user_, _currId); // Now, GAS2 will reveal through CDN. To prevent gaming the system // We lock the users tokens for 2H _balanceData[user_].lastUnboxTimestamp = _getBlockTimestampCompressed(); unchecked { ++i; } } } // // Public msg.sender GAS2 Unbox // function unbox(uint256[] calldata tokenIds_) external { // _unboxGAS2Internal(msg.sender, tokenIds_); // } // Priviledged GAS2 Unbox by onlyMinter function C_unboxFor(address user_, uint256[] calldata tokenIds_) external onlyMinter { _unboxGAS2Internal(user_, tokenIds_); } // The new _transfer which blocks transfers after unboxing uint32 public constant UNBOX_TRANSFER_DELAY = 720; // 720 * 10 (compressed); function _transfer(address from_, address to_, uint256 tokenId_) internal virtual override(ERC721G) { // Compare the unboxTimestamp to the current time uint32 _currTimeCompressed = _getBlockTimestampCompressed(); uint32 _lastUnboxTimestamp = _balanceData[from_].lastUnboxTimestamp; // UNBOX_TRANSFER_DELAY amount of delay require(_currTimeCompressed >= _lastUnboxTimestamp + UNBOX_TRANSFER_DELAY, "UNBOX_LOCKED_TEMPORARILY"); // Otherwise conduct normal transfer ERC721G._transfer(from_, to_, tokenId_); } // 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":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"C_claimGAS2For","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"C_unboxFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GASEVO","outputs":[{"internalType":"contract IGASEVO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"O_setNameAndSymbol","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":[],"name":"UNBOX_TRANSFER_DELAY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"},{"internalType":"uint32","name":"lastUnboxTimestamp","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":[],"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
60c060405234801561000f575f80fd5b506040518060400160405280601c81526020017f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000815250604051806040016040528060078152602001664741533a45564f60c81b81525060016014835f90816100789190610134565b5060016100858482610134565b50600282905560809190915260a052506101ee9050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806100c457607f821691505b6020821081036100e257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561012f57805f5260205f20601f840160051c8101602085101561010d5750805b601f840160051c820191505b8181101561012c575f8155600101610119565b50505b505050565b81516001600160401b0381111561014d5761014d61009c565b6101618161015b84546100b0565b846100e8565b6020601f821160018114610193575f831561017c5750848201515b5f19600385901b1c1916600184901b17845561012c565b5f84815260208120601f198516915b828110156101c257878501518255602094850194600190920191016101a2565b50848210156101df57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161345e61024e5f395f81816104c1015281816123e10152818161240c01528181612439015261292b01525f818161093301528181610ca801528181610de701528181610f170152818161116b01526115ca015261345e5ff3fe608060405234801561000f575f80fd5b506004361061039e575f3560e01c806384dd453c116101ea578063c87b56dd11610114578063e6798baa116100a9578063f2fde38b11610079578063f2fde38b1461099d578063f46eccc4146109b0578063f6598295146109d2578063fccc2813146109da575f80fd5b8063e6798baa1461092e578063e985e9c514610955578063f0e56f0d14610982578063f16dc57d14610995575f80fd5b8063d55f9273116100e4578063d55f927314610903578063d5abeb011461090c578063d7b4be2414610915578063e449f3411461091b575f80fd5b8063c87b56dd146108b7578063c969a5ab146108ca578063ced74b50146108dd578063cf456ae7146108f0575f80fd5b80639b10b7711161018a578063b0b50ed51161015a578063b0b50ed5146107e9578063b4bd7c3214610835578063b88d4fde14610847578063ba745f2e1461085a575f80fd5b80639b10b771146107a35780639ee0bcbc146107b0578063a22cb465146107c3578063a713e45b146107d6575f80fd5b80638da5cb5b116101c55780638da5cb5b1461076257806395d89b4114610775578063972bb0c01461077d578063993568c114610790575f80fd5b806384dd453c1461071e57806385a6c2141461073c578063888957671461074f575f80fd5b80633455f41e116102cb5780635266069d1161026b5780636352211e1161023b5780636352211e146106c157806370a08231146106d45780637b2cbd2d14610702578063840234541461070b575f80fd5b80635266069d146106255780635a17ef3f146106885780635aea7ec11461069b5780635e7676e1146106ae575f80fd5b8063438b6300116102a6578063438b6300146105cc578063470f2c1f146105ec5780634749900a146105ff5780634b0ee02a14610612575f80fd5b80633455f41e14610593578063403082f2146105a657806342842e0e146105b9575f80fd5b8063153db98a116103415780632913daa0116103115780632913daa0146104bc5780632c2cdd60146104e357806332e30f511461056557806332f89e5b14610578575f80fd5b8063153db98a1461046d57806318160ddd146104805780631c08c6b71461049657806323b872dd146104a9575f80fd5b8063081812fc1161037c578063081812fc146103f4578063095ea7b3146104345780630fbf0a93146104475780630ffdf2681461045a575f80fd5b806301ffc9a7146103a2578063021bcdcf146103ca57806306fdde03146103df575b5f80fd5b6103b56103b0366004612b52565b6109e3565b60405190151581526020015b60405180910390f35b6103dd6103d8366004612bb1565b610a4f565b005b6103e7610a94565b6040516103c19190612c1d565b61041c610402366004612c2f565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b6103dd610442366004612c5a565b610b1f565b6103dd610455366004612cc4565b610bba565b6103dd610468366004612d05565b610c29565b6103dd61047b366004612c5a565b610c6d565b610488610ca5565b6040519081526020016103c1565b6103dd6104a4366004612bb1565b610cd9565b6103dd6104b7366004612d1e565b610d10565b6104887f000000000000000000000000000000000000000000000000000000000000000081565b61052f6104f1366004612c2f565b60036020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff9384166020860152918316918401919091521660608201526080016103c1565b6103b5610573366004612d5c565b610d7c565b61041c730f926df0ddb33a1db95088964e09fa8fb47e490e81565b6104886105a1366004612dac565b610dde565b6104886105b4366004612dc7565b610e7a565b6103dd6105c7366004612d1e565b610e8c565b6105df6105da366004612dac565b610ea6565b6040516103c19190612dea565b6103dd6105fa366004612e2c565b610f9d565b6103dd61060d366004612d05565b61103c565b610488610620366004612dac565b611079565b610661610633366004612dac565b60046020525f908152604090205463ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff948516815292841660208401529216918101919091526060016103c1565b6103dd610696366004612d5c565b6110ab565b6105df6106a9366004612dac565b611115565b61041c6106bc366004612c2f565b61120e565b61041c6106cf366004612c2f565b61121f565b6104886106e2366004612dac565b6001600160a01b03165f9081526004602052604090205463ffffffff1690565b610488603d5481565b6105df610719366004612cc4565b611243565b6107276102d081565b60405163ffffffff90911681526020016103c1565b6103dd61074a366004612e96565b6112e8565b61072761075d366004612c2f565b611333565b603a5461041c906001600160a01b031681565b6103e761133f565b6103dd61078b366004612d5c565b61134c565b61048861079e366004612c2f565b6113b6565b603e546103b59060ff1681565b6104886107be366004612c2f565b6113cc565b6103dd6107d1366004612ef4565b6113e2565b6103b56107e4366004612d5c565b6113ed565b61052f6107f7366004612c2f565b60056020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e546103b590610100900460ff1681565b6103dd610855366004612f3b565b61144d565b61086d610868366004612c2f565b6115a5565b6040516103c1919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103e76108c5366004612c2f565b61174b565b6103dd6108d8366004613019565b61179c565b6104886108eb366004612c2f565b61180a565b6103dd6108fe366004612ef4565b611865565b61048860025481565b610488611e6181565b3061041c565b6103dd610929366004612cc4565b6118f1565b6104887f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610963366004613019565b600760209081525f928352604080842090915290825290205460ff1681565b610488610990366004612c2f565b611963565b610727611979565b6103dd6109ab366004612dac565b611985565b6103b56109be366004612dac565b603b6020525f908152604090205460ff1681565b6103dd611a00565b61041c61dead81565b5f6301ffc9a760e01b6001600160e01b031983161480610a1357506380ac58cd60e01b6001600160e01b03198316145b80610a2e5750635b5e139f60e01b6001600160e01b03198316145b80610a4957506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613050565b60405180910390fd5b603f610a8f8284836130f0565b505050565b5f8054610aa090613074565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90613074565b8015610b175780601f10610aee57610100808354040283529160200191610b17565b820191905f5260205f20905b815481529060010190602001808311610afa57829003601f168201915b505050505081565b5f610b298261121f565b90506001600160a01b038116331480610b6457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff165b610bb05760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610a79565b610a8f8383611a89565b603e5460ff16610c1b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610a79565b610c258282611af6565b5050565b603a546001600160a01b03163314610c535760405162461bcd60e51b8152600401610a7990613050565b603e80549115156101000261ff0019909216919091179055565b335f908152603b602052604090205460ff16610c9b5760405162461bcd60e51b8152600401610a79906131a9565b610c258282611b82565b5f7f0000000000000000000000000000000000000000000000000000000000000000600254610cd491906131e2565b905090565b603a546001600160a01b03163314610d035760405162461bcd60e51b8152600401610a7990613050565b6040610a8f8284836130f0565b610d1a3382611bfc565b610d715760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610a79565b610a8f838383611c78565b5f80825b856001600160a01b0316610dab868685818110610d9f57610d9f6131f5565b9050602002013561120e565b6001600160a01b031614610dc3575f92505050610dd7565b808260010192508210610d80576001925050505b9392505050565b6002545f9081907f0000000000000000000000000000000000000000000000000000000000000000905b80821015610e7157846001600160a01b0316610e238361121f565b6001600160a01b031614158015610e535750846001600160a01b0316610e488361120e565b6001600160a01b0316145b15610e665782610e6281613209565b9350505b816001019150610e08565b50909392505050565b5f610a4963ffffffff8316600a613221565b610a8f83838360405180602001604052805f81525061144d565b60605f610ecd836001600160a01b03165f9081526004602052604090205463ffffffff1690565b90505f816001600160401b03811115610ee857610ee8612f27565b604051908082528060200260200182016040528015610f11578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000005b83821015610f9357856001600160a01b0316610f528261121f565b6001600160a01b031603610f8b57808383610f6c81613209565b945081518110610f7e57610f7e6131f5565b6020026020010181815250505b600101610f37565b5090949350505050565b335f908152603b602052604090205460ff16610fcb5760405162461bcd60e51b8152600401610a79906131a9565b6110368484808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284375f92019190915250611d1b92505050565b50505050565b603a546001600160a01b031633146110665760405162461bcd60e51b8152600401610a7990613050565b603e805460ff1916911515919091179055565b5f61108382610dde565b6001600160a01b0383165f9081526004602052604090205463ffffffff16610a499190613238565b335f908152603b602052604090205460ff166110d95760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611dbb92505050565b60605f61112183610dde565b90505f816001600160401b0381111561113c5761113c612f27565b604051908082528060200260200182016040528015611165578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000005b83821015610f9357856001600160a01b03166111a68261121f565b6001600160a01b0316141580156111d65750856001600160a01b03166111cb8261120e565b6001600160a01b0316145b15611206578083836111e781613209565b9450815181106111f9576111f96131f5565b6020026020010181815250505b60010161118b565b5f611218826115a5565b5192915050565b5f8061122a836115a5565b9050806040015163ffffffff165f146112185730610dd7565b60605f8281816001600160401b0381111561126057611260612f27565b604051908082528060200260200182016040528015611289578160200160208202803683370190505b5090505b818310156112df576112b68686858181106112aa576112aa6131f5565b9050602002013561180a565b8184815181106112c8576112c86131f5565b60200260200101818152505082600101925061128d565b95945050505050565b603a546001600160a01b031633146113125760405162461bcd60e51b8152600401610a7990613050565b5f61131e8486836130f0565b50600161132c8284836130f0565b5050505050565b5f610a49600a8361325f565b60018054610aa090613074565b335f908152603b602052604090205460ff1661137a5760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611fe792505050565b5f610a496113c3836115a5565b60600151610e7a565b5f610a496113d9836115a5565b60400151610e7a565b610c253383836121dd565b5f80825b856001600160a01b031661141c868685818110611410576114106131f5565b9050602002013561121f565b6001600160a01b031614611434575f92505050610dd7565b8082600101925082106113f15750600195945050505050565b611458848484610d10565b6001600160a01b0383163b15611036575f836001600160a01b031663150b7a023387868660405160240161148f9493929190613272565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114c891906132c5565b5f604051808303815f865af19150503d805f8114611501576040519150601f19603f3d011682016040523d82523d5f602084013e611506565b606091505b509150505f8180602001905181019061151f91906132d0565b9050630a85bd0160e11b6001600160e01b031982161461159d5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610a79565b505050505050565b604080516080810182525f8082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000008210156116385760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610a79565b5f828152600360205260409020546001600160a01b031615158061165e57506002548210155b156116c157505f90815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b5f818152600560205260409020546001600160a01b03166116e6575f19016116c3565b5f90815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b60604660011461176857505060408051602081019091525f815290565b603f61177383612249565b6040805160200161178693929190613359565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146117c65760405162461bcd60e51b8152600401610a7990613050565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80611815836115a5565b90505f6118258260600151610e7a565b90505f80836040015163ffffffff161161183f575f611859565b611859836040015161184f611979565b6105b49190613376565b90506112df8183613238565b603a546001600160a01b0316331461188f5760405162461bcd60e51b8152600401610a7990613050565b6001600160a01b0382165f818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166119595760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610a79565b610c258282612346565b5f610a49611970836115a5565b60200151610e7a565b5f610cd4600a4261325f565b603a546001600160a01b031633146119af5760405162461bcd60e51b8152600401610a7990613050565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b603a546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610a7990613050565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b5f81815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611abd8261121f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815b80821015611036575f611b23858585818110611b1757611b176131f5565b905060200201356123d2565b9050336001600160a01b03821614611b765760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050611af9565b80611b8b610ca5565b611b959190613238565b611e611015611bf25760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610a79565b610c2582826123dd565b5f80611c078361121f565b9050836001600160a01b0316816001600160a01b03161480611c4157505f838152600660205260409020546001600160a01b038581169116145b80611c7057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b5f611c81611979565b6001600160a01b0385165f90815260046020526040902054909150600160401b900463ffffffff16611cb56102d082613392565b63ffffffff168263ffffffff161015611d105760405162461bcd60e51b815260206004820152601860248201527f554e424f585f4c4f434b45445f54454d504f524152494c5900000000000000006044820152606401610a79565b61132c85858561246c565b8051825114611d6c5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610a79565b5f5b8251811015610a8f57611db3838281518110611d8c57611d8c6131f5565b6020026020010151838381518110611da657611da66131f5565b6020026020010151611b82565b600101611d6e565b80516040516370a0823160e01b81526001600160a01b03841660048201525f90730f926df0ddb33a1db95088964e09fa8fb47e490e906370a0823190602401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3991906133ae565b9050808214611e835760405162461bcd60e51b81526020600482015260166024820152751253959053125117d55411d490511157d05353d5539560521b6044820152606401610a79565b5f5b8281101561132c575f848281518110611ea057611ea06131f5565b60200260200101519050856001600160a01b0316730f926df0ddb33a1db95088964e09fa8fb47e490e6001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611ef691815260200190565b602060405180830381865afa158015611f11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3591906133c5565b6001600160a01b031614611f805760405162461bcd60e51b81526020600482015260126024820152712727aa2fa7aba722a92fa7a32faa27a5a2a760711b6044820152606401610a79565b61dead611f8c8261121f565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152600c60248201526b544f4b454e5f45584953545360a01b6044820152606401610a79565b611fde61dead8783611c78565b50600101611e85565b5f5b8151811015610a8f575f828281518110612005576120056131f5565b60200260200101519050836001600160a01b03166120228261121f565b6001600160a01b0316146120645760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610a79565b6040516331a9108f60e11b8152600481018290525f90730f926df0ddb33a1db95088964e09fa8fb47e490e90636352211e90602401602060405180830381865afa1580156120b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d891906133c5565b6001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600d60248201526c1513d2d15397d5539093d61151609a1b6044820152606401610a79565b604051630a9edcc560e11b81526001600160a01b038516600482015260248101829052730f926df0ddb33a1db95088964e09fa8fb47e490e9063153db98a906044015f604051808303815f87803b158015612177575f80fd5b505af1158015612189573d5f803e3d5ffd5b50505050612195611979565b6001600160a01b0385165f908152600460205260409020805463ffffffff92909216600160401b026bffffffff00000000000000001990921691909117905550600101611fe9565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815f0361226f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612298578061228281613209565b91506122919050600a8361325f565b9150612272565b5f816001600160401b038111156122b1576122b1612f27565b6040519080825280601f01601f1916602001820160405280156122db576020820181803683370190505b5090505b8415611c7057816122ef816133e0565b92506122fe9050600a866133f5565b612309906030613238565b60f81b81838151811061231e5761231e6131f5565b60200101906001600160f81b03191690815f1a90535061233f600a8661325f565b94506122df565b5f815b80821015611036575f612373858585818110612367576123676131f5565b90506020020135612601565b9050336001600160a01b038216146123c65760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050612349565b5f610a498242612608565b805b7f0000000000000000000000000000000000000000000000000000000000000000811115612462576124317f0000000000000000000000000000000000000000000000000000000000000000826131e2565b905061245d837f00000000000000000000000000000000000000000000000000000000000000006128d3565b6123df565b610a8f83826128d3565b6124758161121f565b6001600160a01b0316836001600160a01b0316146124d55760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610a79565b6001600160a01b03821661252b5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610a79565b5f81815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b03841617905561256e611979565b5f828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b03808816808552600490935281842080545f1981881601871663ffffffff1991821617909155908716808552828520805480881660010190971696909216959095179055518493925f8051602061340983398151915291a4505050565b5f610a49825f5b5f80612613846115a5565b80516040820151919250906126288684612a9d565b5f86815260066020526040902080546001600160a01b0319169055841561271e5763ffffffff8116156126b25760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610a79565b6001600160a01b0382165f81815260046020526040808220805463ffffffff1980821663ffffffff9283165f190183161790925530808552838520805480841660010190931692909316919091179091559051899391925f8051602061340983398151915291a4612890565b8063ffffffff165f0361278a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610a79565b6001600160a01b0382165f9081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906127c53090565b6001600160a01b0316815260208101919091526040015f908120805463ffffffff19811663ffffffff9182165f190190911617905581612803611979565b61280d9190613376565b5f88815260036020526040902080549192508291601c9061283c908490600160e01b900463ffffffff16613392565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b031661286c3090565b6001600160a01b03165f8051602061340983398151915260405160405180910390a4505b61289985611333565b5f878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166129295760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610a79565b7f00000000000000000000000000000000000000000000000000000000000000008111156129aa5760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610a79565b6002545f6129b88383613238565b5f83815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506129e8611979565b5f838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b038616905f905f80516020613409833981519152908290a4808260010192508210612a6457600255505050565b5f828152600360205260409020546001600160a01b0316610c25575f82815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b031981168114612b4f575f80fd5b50565b5f60208284031215612b62575f80fd5b8135610dd781612b3a565b5f8083601f840112612b7d575f80fd5b5081356001600160401b03811115612b93575f80fd5b602083019150836020828501011115612baa575f80fd5b9250929050565b5f8060208385031215612bc2575f80fd5b82356001600160401b03811115612bd7575f80fd5b612be385828601612b6d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dd76020830184612bef565b5f60208284031215612c3f575f80fd5b5035919050565b6001600160a01b0381168114612b4f575f80fd5b5f8060408385031215612c6b575f80fd5b8235612c7681612c46565b946020939093013593505050565b5f8083601f840112612c94575f80fd5b5081356001600160401b03811115612caa575f80fd5b6020830191508360208260051b8501011115612baa575f80fd5b5f8060208385031215612cd5575f80fd5b82356001600160401b03811115612cea575f80fd5b612be385828601612c84565b80358015158114611746575f80fd5b5f60208284031215612d15575f80fd5b610dd782612cf6565b5f805f60608486031215612d30575f80fd5b8335612d3b81612c46565b92506020840135612d4b81612c46565b929592945050506040919091013590565b5f805f60408486031215612d6e575f80fd5b8335612d7981612c46565b925060208401356001600160401b03811115612d93575f80fd5b612d9f86828701612c84565b9497909650939450505050565b5f60208284031215612dbc575f80fd5b8135610dd781612c46565b5f60208284031215612dd7575f80fd5b813563ffffffff81168114610dd7575f80fd5b602080825282518282018190525f918401906040840190835b81811015612e21578351835260209384019390920191600101612e03565b509095945050505050565b5f805f8060408587031215612e3f575f80fd5b84356001600160401b03811115612e54575f80fd5b612e6087828801612c84565b90955093505060208501356001600160401b03811115612e7e575f80fd5b612e8a87828801612c84565b95989497509550505050565b5f805f8060408587031215612ea9575f80fd5b84356001600160401b03811115612ebe575f80fd5b612eca87828801612b6d565b90955093505060208501356001600160401b03811115612ee8575f80fd5b612e8a87828801612b6d565b5f8060408385031215612f05575f80fd5b8235612f1081612c46565b9150612f1e60208401612cf6565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612f4e575f80fd5b8435612f5981612c46565b93506020850135612f6981612c46565b92506040850135915060608501356001600160401b03811115612f8a575f80fd5b8501601f81018713612f9a575f80fd5b80356001600160401b03811115612fb357612fb3612f27565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612fe157612fe1612f27565b604052818152828201602001891015612ff8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561302a575f80fd5b823561303581612c46565b9150602083013561304581612c46565b809150509250929050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c9082168061308857607f821691505b6020821081036130a657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8f57805f5260205f20601f840160051c810160208510156130d15750805b601f840160051c820191505b8181101561132c575f81556001016130dd565b6001600160401b0383111561310757613107612f27565b61311b836131158354613074565b836130ac565b5f601f84116001811461314c575f85156131355750838201355b5f19600387901b1c1916600186901b17835561132c565b5f83815260208120601f198716915b8281101561317b578685013582556020948501946001909201910161315b565b5086821015613197575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600b908201526a4e6f74204d696e7465722160a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4957610a496131ce565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161321a5761321a6131ce565b5060010190565b8082028115828204841417610a4957610a496131ce565b80820180821115610a4957610a496131ce565b634e487b7160e01b5f52601260045260245ffd5b5f8261326d5761326d61324b565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906132a490830184612bef565b9695505050505050565b5f81518060208401855e5f93019283525090919050565b5f610dd782846132ae565b5f602082840312156132e0575f80fd5b8151610dd781612b3a565b5f81546132f781613074565b60018216801561330e576001811461332357613350565b60ff1983168652811515820286019350613350565b845f5260205f205f5b838110156133485781548882015260019091019060200161332c565b505081860193505b50505092915050565b5f6112df61337061336a84886132eb565b866132ae565b846132eb565b63ffffffff8281168282160390811115610a4957610a496131ce565b63ffffffff8181168382160190811115610a4957610a496131ce565b5f602082840312156133be575f80fd5b5051919050565b5f602082840312156133d5575f80fd5b8151610dd781612c46565b5f816133ee576133ee6131ce565b505f190190565b5f826134035761340361324b565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba064736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061039e575f3560e01c806384dd453c116101ea578063c87b56dd11610114578063e6798baa116100a9578063f2fde38b11610079578063f2fde38b1461099d578063f46eccc4146109b0578063f6598295146109d2578063fccc2813146109da575f80fd5b8063e6798baa1461092e578063e985e9c514610955578063f0e56f0d14610982578063f16dc57d14610995575f80fd5b8063d55f9273116100e4578063d55f927314610903578063d5abeb011461090c578063d7b4be2414610915578063e449f3411461091b575f80fd5b8063c87b56dd146108b7578063c969a5ab146108ca578063ced74b50146108dd578063cf456ae7146108f0575f80fd5b80639b10b7711161018a578063b0b50ed51161015a578063b0b50ed5146107e9578063b4bd7c3214610835578063b88d4fde14610847578063ba745f2e1461085a575f80fd5b80639b10b771146107a35780639ee0bcbc146107b0578063a22cb465146107c3578063a713e45b146107d6575f80fd5b80638da5cb5b116101c55780638da5cb5b1461076257806395d89b4114610775578063972bb0c01461077d578063993568c114610790575f80fd5b806384dd453c1461071e57806385a6c2141461073c578063888957671461074f575f80fd5b80633455f41e116102cb5780635266069d1161026b5780636352211e1161023b5780636352211e146106c157806370a08231146106d45780637b2cbd2d14610702578063840234541461070b575f80fd5b80635266069d146106255780635a17ef3f146106885780635aea7ec11461069b5780635e7676e1146106ae575f80fd5b8063438b6300116102a6578063438b6300146105cc578063470f2c1f146105ec5780634749900a146105ff5780634b0ee02a14610612575f80fd5b80633455f41e14610593578063403082f2146105a657806342842e0e146105b9575f80fd5b8063153db98a116103415780632913daa0116103115780632913daa0146104bc5780632c2cdd60146104e357806332e30f511461056557806332f89e5b14610578575f80fd5b8063153db98a1461046d57806318160ddd146104805780631c08c6b71461049657806323b872dd146104a9575f80fd5b8063081812fc1161037c578063081812fc146103f4578063095ea7b3146104345780630fbf0a93146104475780630ffdf2681461045a575f80fd5b806301ffc9a7146103a2578063021bcdcf146103ca57806306fdde03146103df575b5f80fd5b6103b56103b0366004612b52565b6109e3565b60405190151581526020015b60405180910390f35b6103dd6103d8366004612bb1565b610a4f565b005b6103e7610a94565b6040516103c19190612c1d565b61041c610402366004612c2f565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b6103dd610442366004612c5a565b610b1f565b6103dd610455366004612cc4565b610bba565b6103dd610468366004612d05565b610c29565b6103dd61047b366004612c5a565b610c6d565b610488610ca5565b6040519081526020016103c1565b6103dd6104a4366004612bb1565b610cd9565b6103dd6104b7366004612d1e565b610d10565b6104887f000000000000000000000000000000000000000000000000000000000000001481565b61052f6104f1366004612c2f565b60036020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff9384166020860152918316918401919091521660608201526080016103c1565b6103b5610573366004612d5c565b610d7c565b61041c730f926df0ddb33a1db95088964e09fa8fb47e490e81565b6104886105a1366004612dac565b610dde565b6104886105b4366004612dc7565b610e7a565b6103dd6105c7366004612d1e565b610e8c565b6105df6105da366004612dac565b610ea6565b6040516103c19190612dea565b6103dd6105fa366004612e2c565b610f9d565b6103dd61060d366004612d05565b61103c565b610488610620366004612dac565b611079565b610661610633366004612dac565b60046020525f908152604090205463ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff948516815292841660208401529216918101919091526060016103c1565b6103dd610696366004612d5c565b6110ab565b6105df6106a9366004612dac565b611115565b61041c6106bc366004612c2f565b61120e565b61041c6106cf366004612c2f565b61121f565b6104886106e2366004612dac565b6001600160a01b03165f9081526004602052604090205463ffffffff1690565b610488603d5481565b6105df610719366004612cc4565b611243565b6107276102d081565b60405163ffffffff90911681526020016103c1565b6103dd61074a366004612e96565b6112e8565b61072761075d366004612c2f565b611333565b603a5461041c906001600160a01b031681565b6103e761133f565b6103dd61078b366004612d5c565b61134c565b61048861079e366004612c2f565b6113b6565b603e546103b59060ff1681565b6104886107be366004612c2f565b6113cc565b6103dd6107d1366004612ef4565b6113e2565b6103b56107e4366004612d5c565b6113ed565b61052f6107f7366004612c2f565b60056020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e546103b590610100900460ff1681565b6103dd610855366004612f3b565b61144d565b61086d610868366004612c2f565b6115a5565b6040516103c1919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103e76108c5366004612c2f565b61174b565b6103dd6108d8366004613019565b61179c565b6104886108eb366004612c2f565b61180a565b6103dd6108fe366004612ef4565b611865565b61048860025481565b610488611e6181565b3061041c565b6103dd610929366004612cc4565b6118f1565b6104887f000000000000000000000000000000000000000000000000000000000000000181565b6103b5610963366004613019565b600760209081525f928352604080842090915290825290205460ff1681565b610488610990366004612c2f565b611963565b610727611979565b6103dd6109ab366004612dac565b611985565b6103b56109be366004612dac565b603b6020525f908152604090205460ff1681565b6103dd611a00565b61041c61dead81565b5f6301ffc9a760e01b6001600160e01b031983161480610a1357506380ac58cd60e01b6001600160e01b03198316145b80610a2e5750635b5e139f60e01b6001600160e01b03198316145b80610a4957506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613050565b60405180910390fd5b603f610a8f8284836130f0565b505050565b5f8054610aa090613074565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90613074565b8015610b175780601f10610aee57610100808354040283529160200191610b17565b820191905f5260205f20905b815481529060010190602001808311610afa57829003601f168201915b505050505081565b5f610b298261121f565b90506001600160a01b038116331480610b6457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff165b610bb05760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610a79565b610a8f8383611a89565b603e5460ff16610c1b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610a79565b610c258282611af6565b5050565b603a546001600160a01b03163314610c535760405162461bcd60e51b8152600401610a7990613050565b603e80549115156101000261ff0019909216919091179055565b335f908152603b602052604090205460ff16610c9b5760405162461bcd60e51b8152600401610a79906131a9565b610c258282611b82565b5f7f0000000000000000000000000000000000000000000000000000000000000001600254610cd491906131e2565b905090565b603a546001600160a01b03163314610d035760405162461bcd60e51b8152600401610a7990613050565b6040610a8f8284836130f0565b610d1a3382611bfc565b610d715760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610a79565b610a8f838383611c78565b5f80825b856001600160a01b0316610dab868685818110610d9f57610d9f6131f5565b9050602002013561120e565b6001600160a01b031614610dc3575f92505050610dd7565b808260010192508210610d80576001925050505b9392505050565b6002545f9081907f0000000000000000000000000000000000000000000000000000000000000001905b80821015610e7157846001600160a01b0316610e238361121f565b6001600160a01b031614158015610e535750846001600160a01b0316610e488361120e565b6001600160a01b0316145b15610e665782610e6281613209565b9350505b816001019150610e08565b50909392505050565b5f610a4963ffffffff8316600a613221565b610a8f83838360405180602001604052805f81525061144d565b60605f610ecd836001600160a01b03165f9081526004602052604090205463ffffffff1690565b90505f816001600160401b03811115610ee857610ee8612f27565b604051908082528060200260200182016040528015610f11578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000015b83821015610f9357856001600160a01b0316610f528261121f565b6001600160a01b031603610f8b57808383610f6c81613209565b945081518110610f7e57610f7e6131f5565b6020026020010181815250505b600101610f37565b5090949350505050565b335f908152603b602052604090205460ff16610fcb5760405162461bcd60e51b8152600401610a79906131a9565b6110368484808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284375f92019190915250611d1b92505050565b50505050565b603a546001600160a01b031633146110665760405162461bcd60e51b8152600401610a7990613050565b603e805460ff1916911515919091179055565b5f61108382610dde565b6001600160a01b0383165f9081526004602052604090205463ffffffff16610a499190613238565b335f908152603b602052604090205460ff166110d95760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611dbb92505050565b60605f61112183610dde565b90505f816001600160401b0381111561113c5761113c612f27565b604051908082528060200260200182016040528015611165578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000015b83821015610f9357856001600160a01b03166111a68261121f565b6001600160a01b0316141580156111d65750856001600160a01b03166111cb8261120e565b6001600160a01b0316145b15611206578083836111e781613209565b9450815181106111f9576111f96131f5565b6020026020010181815250505b60010161118b565b5f611218826115a5565b5192915050565b5f8061122a836115a5565b9050806040015163ffffffff165f146112185730610dd7565b60605f8281816001600160401b0381111561126057611260612f27565b604051908082528060200260200182016040528015611289578160200160208202803683370190505b5090505b818310156112df576112b68686858181106112aa576112aa6131f5565b9050602002013561180a565b8184815181106112c8576112c86131f5565b60200260200101818152505082600101925061128d565b95945050505050565b603a546001600160a01b031633146113125760405162461bcd60e51b8152600401610a7990613050565b5f61131e8486836130f0565b50600161132c8284836130f0565b5050505050565b5f610a49600a8361325f565b60018054610aa090613074565b335f908152603b602052604090205460ff1661137a5760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611fe792505050565b5f610a496113c3836115a5565b60600151610e7a565b5f610a496113d9836115a5565b60400151610e7a565b610c253383836121dd565b5f80825b856001600160a01b031661141c868685818110611410576114106131f5565b9050602002013561121f565b6001600160a01b031614611434575f92505050610dd7565b8082600101925082106113f15750600195945050505050565b611458848484610d10565b6001600160a01b0383163b15611036575f836001600160a01b031663150b7a023387868660405160240161148f9493929190613272565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114c891906132c5565b5f604051808303815f865af19150503d805f8114611501576040519150601f19603f3d011682016040523d82523d5f602084013e611506565b606091505b509150505f8180602001905181019061151f91906132d0565b9050630a85bd0160e11b6001600160e01b031982161461159d5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610a79565b505050505050565b604080516080810182525f8082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000018210156116385760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610a79565b5f828152600360205260409020546001600160a01b031615158061165e57506002548210155b156116c157505f90815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b5f818152600560205260409020546001600160a01b03166116e6575f19016116c3565b5f90815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b60604660011461176857505060408051602081019091525f815290565b603f61177383612249565b6040805160200161178693929190613359565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146117c65760405162461bcd60e51b8152600401610a7990613050565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80611815836115a5565b90505f6118258260600151610e7a565b90505f80836040015163ffffffff161161183f575f611859565b611859836040015161184f611979565b6105b49190613376565b90506112df8183613238565b603a546001600160a01b0316331461188f5760405162461bcd60e51b8152600401610a7990613050565b6001600160a01b0382165f818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166119595760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610a79565b610c258282612346565b5f610a49611970836115a5565b60200151610e7a565b5f610cd4600a4261325f565b603a546001600160a01b031633146119af5760405162461bcd60e51b8152600401610a7990613050565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b603a546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610a7990613050565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b5f81815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611abd8261121f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815b80821015611036575f611b23858585818110611b1757611b176131f5565b905060200201356123d2565b9050336001600160a01b03821614611b765760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050611af9565b80611b8b610ca5565b611b959190613238565b611e611015611bf25760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610a79565b610c2582826123dd565b5f80611c078361121f565b9050836001600160a01b0316816001600160a01b03161480611c4157505f838152600660205260409020546001600160a01b038581169116145b80611c7057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b5f611c81611979565b6001600160a01b0385165f90815260046020526040902054909150600160401b900463ffffffff16611cb56102d082613392565b63ffffffff168263ffffffff161015611d105760405162461bcd60e51b815260206004820152601860248201527f554e424f585f4c4f434b45445f54454d504f524152494c5900000000000000006044820152606401610a79565b61132c85858561246c565b8051825114611d6c5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610a79565b5f5b8251811015610a8f57611db3838281518110611d8c57611d8c6131f5565b6020026020010151838381518110611da657611da66131f5565b6020026020010151611b82565b600101611d6e565b80516040516370a0823160e01b81526001600160a01b03841660048201525f90730f926df0ddb33a1db95088964e09fa8fb47e490e906370a0823190602401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3991906133ae565b9050808214611e835760405162461bcd60e51b81526020600482015260166024820152751253959053125117d55411d490511157d05353d5539560521b6044820152606401610a79565b5f5b8281101561132c575f848281518110611ea057611ea06131f5565b60200260200101519050856001600160a01b0316730f926df0ddb33a1db95088964e09fa8fb47e490e6001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611ef691815260200190565b602060405180830381865afa158015611f11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3591906133c5565b6001600160a01b031614611f805760405162461bcd60e51b81526020600482015260126024820152712727aa2fa7aba722a92fa7a32faa27a5a2a760711b6044820152606401610a79565b61dead611f8c8261121f565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152600c60248201526b544f4b454e5f45584953545360a01b6044820152606401610a79565b611fde61dead8783611c78565b50600101611e85565b5f5b8151811015610a8f575f828281518110612005576120056131f5565b60200260200101519050836001600160a01b03166120228261121f565b6001600160a01b0316146120645760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610a79565b6040516331a9108f60e11b8152600481018290525f90730f926df0ddb33a1db95088964e09fa8fb47e490e90636352211e90602401602060405180830381865afa1580156120b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d891906133c5565b6001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600d60248201526c1513d2d15397d5539093d61151609a1b6044820152606401610a79565b604051630a9edcc560e11b81526001600160a01b038516600482015260248101829052730f926df0ddb33a1db95088964e09fa8fb47e490e9063153db98a906044015f604051808303815f87803b158015612177575f80fd5b505af1158015612189573d5f803e3d5ffd5b50505050612195611979565b6001600160a01b0385165f908152600460205260409020805463ffffffff92909216600160401b026bffffffff00000000000000001990921691909117905550600101611fe9565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815f0361226f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612298578061228281613209565b91506122919050600a8361325f565b9150612272565b5f816001600160401b038111156122b1576122b1612f27565b6040519080825280601f01601f1916602001820160405280156122db576020820181803683370190505b5090505b8415611c7057816122ef816133e0565b92506122fe9050600a866133f5565b612309906030613238565b60f81b81838151811061231e5761231e6131f5565b60200101906001600160f81b03191690815f1a90535061233f600a8661325f565b94506122df565b5f815b80821015611036575f612373858585818110612367576123676131f5565b90506020020135612601565b9050336001600160a01b038216146123c65760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050612349565b5f610a498242612608565b805b7f0000000000000000000000000000000000000000000000000000000000000014811115612462576124317f0000000000000000000000000000000000000000000000000000000000000014826131e2565b905061245d837f00000000000000000000000000000000000000000000000000000000000000146128d3565b6123df565b610a8f83826128d3565b6124758161121f565b6001600160a01b0316836001600160a01b0316146124d55760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610a79565b6001600160a01b03821661252b5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610a79565b5f81815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b03841617905561256e611979565b5f828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b03808816808552600490935281842080545f1981881601871663ffffffff1991821617909155908716808552828520805480881660010190971696909216959095179055518493925f8051602061340983398151915291a4505050565b5f610a49825f5b5f80612613846115a5565b80516040820151919250906126288684612a9d565b5f86815260066020526040902080546001600160a01b0319169055841561271e5763ffffffff8116156126b25760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610a79565b6001600160a01b0382165f81815260046020526040808220805463ffffffff1980821663ffffffff9283165f190183161790925530808552838520805480841660010190931692909316919091179091559051899391925f8051602061340983398151915291a4612890565b8063ffffffff165f0361278a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610a79565b6001600160a01b0382165f9081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906127c53090565b6001600160a01b0316815260208101919091526040015f908120805463ffffffff19811663ffffffff9182165f190190911617905581612803611979565b61280d9190613376565b5f88815260036020526040902080549192508291601c9061283c908490600160e01b900463ffffffff16613392565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b031661286c3090565b6001600160a01b03165f8051602061340983398151915260405160405180910390a4505b61289985611333565b5f878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166129295760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610a79565b7f00000000000000000000000000000000000000000000000000000000000000148111156129aa5760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610a79565b6002545f6129b88383613238565b5f83815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506129e8611979565b5f838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b038616905f905f80516020613409833981519152908290a4808260010192508210612a6457600255505050565b5f828152600360205260409020546001600160a01b0316610c25575f82815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b031981168114612b4f575f80fd5b50565b5f60208284031215612b62575f80fd5b8135610dd781612b3a565b5f8083601f840112612b7d575f80fd5b5081356001600160401b03811115612b93575f80fd5b602083019150836020828501011115612baa575f80fd5b9250929050565b5f8060208385031215612bc2575f80fd5b82356001600160401b03811115612bd7575f80fd5b612be385828601612b6d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dd76020830184612bef565b5f60208284031215612c3f575f80fd5b5035919050565b6001600160a01b0381168114612b4f575f80fd5b5f8060408385031215612c6b575f80fd5b8235612c7681612c46565b946020939093013593505050565b5f8083601f840112612c94575f80fd5b5081356001600160401b03811115612caa575f80fd5b6020830191508360208260051b8501011115612baa575f80fd5b5f8060208385031215612cd5575f80fd5b82356001600160401b03811115612cea575f80fd5b612be385828601612c84565b80358015158114611746575f80fd5b5f60208284031215612d15575f80fd5b610dd782612cf6565b5f805f60608486031215612d30575f80fd5b8335612d3b81612c46565b92506020840135612d4b81612c46565b929592945050506040919091013590565b5f805f60408486031215612d6e575f80fd5b8335612d7981612c46565b925060208401356001600160401b03811115612d93575f80fd5b612d9f86828701612c84565b9497909650939450505050565b5f60208284031215612dbc575f80fd5b8135610dd781612c46565b5f60208284031215612dd7575f80fd5b813563ffffffff81168114610dd7575f80fd5b602080825282518282018190525f918401906040840190835b81811015612e21578351835260209384019390920191600101612e03565b509095945050505050565b5f805f8060408587031215612e3f575f80fd5b84356001600160401b03811115612e54575f80fd5b612e6087828801612c84565b90955093505060208501356001600160401b03811115612e7e575f80fd5b612e8a87828801612c84565b95989497509550505050565b5f805f8060408587031215612ea9575f80fd5b84356001600160401b03811115612ebe575f80fd5b612eca87828801612b6d565b90955093505060208501356001600160401b03811115612ee8575f80fd5b612e8a87828801612b6d565b5f8060408385031215612f05575f80fd5b8235612f1081612c46565b9150612f1e60208401612cf6565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612f4e575f80fd5b8435612f5981612c46565b93506020850135612f6981612c46565b92506040850135915060608501356001600160401b03811115612f8a575f80fd5b8501601f81018713612f9a575f80fd5b80356001600160401b03811115612fb357612fb3612f27565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612fe157612fe1612f27565b604052818152828201602001891015612ff8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561302a575f80fd5b823561303581612c46565b9150602083013561304581612c46565b809150509250929050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c9082168061308857607f821691505b6020821081036130a657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8f57805f5260205f20601f840160051c810160208510156130d15750805b601f840160051c820191505b8181101561132c575f81556001016130dd565b6001600160401b0383111561310757613107612f27565b61311b836131158354613074565b836130ac565b5f601f84116001811461314c575f85156131355750838201355b5f19600387901b1c1916600186901b17835561132c565b5f83815260208120601f198716915b8281101561317b578685013582556020948501946001909201910161315b565b5086821015613197575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600b908201526a4e6f74204d696e7465722160a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4957610a496131ce565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161321a5761321a6131ce565b5060010190565b8082028115828204841417610a4957610a496131ce565b80820180821115610a4957610a496131ce565b634e487b7160e01b5f52601260045260245ffd5b5f8261326d5761326d61324b565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906132a490830184612bef565b9695505050505050565b5f81518060208401855e5f93019283525090919050565b5f610dd782846132ae565b5f602082840312156132e0575f80fd5b8151610dd781612b3a565b5f81546132f781613074565b60018216801561330e576001811461332357613350565b60ff1983168652811515820286019350613350565b845f5260205f205f5b838110156133485781548882015260019091019060200161332c565b505081860193505b50505092915050565b5f6112df61337061336a84886132eb565b866132ae565b846132eb565b63ffffffff8281168282160390811115610a4957610a496131ce565b63ffffffff8181168382160190811115610a4957610a496131ce565b5f602082840312156133be575f80fd5b5051919050565b5f602082840312156133d5575f80fd5b8151610dd781612c46565b5f816133ee576133ee6131ce565b505f190190565b5f826134035761340361324b565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba064736f6c634300081a0033
Deployed Bytecode Sourcemap
29161:10154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27953:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27953:186:0;;;;;;;;32339:97;;;;;;:::i;:::-;;:::i;:::-;;1753:18;;;:::i;:::-;;;;;;;:::i;4035:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;4035:46:0;;;;;;-1:-1:-1;;;;;2275:32:1;;;2257:51;;2245:2;2230:18;4035:46:0;2111:203:1;25934:447:0;;;;;;:::i;:::-;;:::i;31180:182::-;;;;;;:::i;:::-;;:::i;30745:104::-;;;;;;:::i;:::-;;:::i;31958:114::-;;;;;;:::i;:::-;;:::i;5262:112::-;;;:::i;:::-;;;4137:25:1;;;4125:2;4110:18;5262:112:0;3991:177:1;32442:105:0;;;;;;:::i;:::-;;:::i;26995:244::-;;;;;;:::i;:::-;;:::i;2164:37::-;;;;;3757:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3757:49:0;;;;-1:-1:-1;;;3757:49:0;;;;;-1:-1:-1;;;3757:49:0;;;;;-1:-1:-1;;;3757:49:0;;;;;;;;;;-1:-1:-1;;;;;4929:32:1;;;4911:51;;5010:10;4998:23;;;4993:2;4978:18;;4971:51;5058:23;;;5038:18;;;5031:51;;;;5118:23;5113:2;5098:18;;5091:51;4898:3;4883:19;3757:49:0;4686:462:1;33653:341:0;;;;;;:::i;:::-;;:::i;34870:84::-;;34911:42;34870:84;;21083:406;;;;;;:::i;:::-;;:::i;4520:138::-;;;;;;:::i;:::-;;:::i;27791:154::-;;;;;;:::i;:::-;;:::i;28147:467::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32078:153::-;;;;;;:::i;:::-;;:::i;30639:100::-;;;;;;:::i;:::-;;:::i;22810:153::-;;;;;;:::i;:::-;;:::i;3836:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3836:53:0;;;;;;;;;;8100:10:1;8088:23;;;8070:42;;8148:23;;;8143:2;8128:18;;8121:51;8208:23;;8188:18;;;8181:51;;;;8058:2;8043:18;3836:53:0;7874:364:1;36449:150:0;;;;;;:::i;:::-;;:::i;21915:539::-;;;;;;:::i;:::-;;:::i;7602:135::-;;;;;;:::i;:::-;;:::i;7069:241::-;;;;;;:::i;:::-;;:::i;5380:131::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5473:22:0;5446:7;5473:22;;;:12;:22;;;;;:30;;;;5380:131;30147:29;;;;;;24338:424;;;;;;:::i;:::-;;:::i;38554:49::-;;38600:3;38554:49;;;;;8599:10:1;8587:23;;;8569:42;;8557:2;8542:18;38554:49:0;8425:192:1;29917:159:0;;;;;;:::i;:::-;;:::i;4375:139::-;;;;;;:::i;:::-;;:::i;405:20::-;;;;;-1:-1:-1;;;;;405:20:0;;;1792;;;:::i;38342:140::-;;;;;;:::i;:::-;;:::i;5022:174::-;;;;;;:::i;:::-;;:::i;30567:28::-;;;;;;;;;4844:172;;;;;;:::i;:::-;;:::i;26623:227::-;;;;;;:::i;:::-;;:::i;33315:332::-;;;;;;:::i;:::-;;:::i;3921:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3921:48:0;;;;-1:-1:-1;;;3921:48:0;;;;;-1:-1:-1;;;3921:48:0;;;;;-1:-1:-1;;;3921:48:0;;;;;;30602:30;;;;;;;;;;;;27245:540;;;;;;:::i;:::-;;:::i;5968:773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;11366:13:1;;-1:-1:-1;;;;;11362:39:1;11344:58;;11462:4;11450:17;;;11444:24;11470:10;11440:41;;;11418:20;;;11411:71;;;;11542:4;11530:17;;;11524:24;11520:41;;11498:20;;;11491:71;11622:4;11610:17;;;11604:24;11600:41;11578:20;;;11571:71;;;;11331:3;11316:19;;11141:507;33017:245:0;;;;;;:::i;:::-;;:::i;894:173::-;;;;;;:::i;:::-;;:::i;23380:556::-;;;;;;:::i;:::-;;:::i;29000:154::-;;;;;;:::i;:::-;;:::i;1870:25::-;;;;;;30485:40;;30521:4;30485:40;;2337:95;2419:4;2337:95;;31368:190;;;;;;:::i;:::-;;:::i;2011:37::-;;;;;4118:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4670:168;;;;;;:::i;:::-;;:::i;4238:131::-;;;:::i;709:179::-;;;;;;:::i;:::-;;:::i;28823:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30183:255;;;:::i;35018:81::-;;35057:42;35018:81;;27953:186;28022:4;-1:-1:-1;;;;;;;;;28046:18:0;;;;:40;;-1:-1:-1;;;;;;;;;;28068:18:0;;;28046:40;:62;;;-1:-1:-1;;;;;;;;;;28090:18:0;;;28046:62;:84;;;-1:-1:-1;;;;;;;;;;28112:18:0;;;28046:84;28039:91;27953:186;-1:-1:-1;;27953:186:0:o;32339:97::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;;;;;;;;;32413:7:::1;:14;32423:4:::0;;32413:7;:14:::1;:::i;:::-;;32339:97:::0;;:::o;1753:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25934:447::-;26008:14;26025:17;26033:8;26025:7;:17::i;:::-;26008:34;-1:-1:-1;;;;;;26140:20:0;;26150:10;26140:20;;:148;;-1:-1:-1;;;;;;26252:24:0;;;;;;:16;:24;;;;;;;;26277:10;26252:36;;;;;;;;;;26140:148;26053:284;;;;-1:-1:-1;;;26053:284:0;;14995:2:1;26053:284:0;;;14977:21:1;15034:2;15014:18;;;15007:30;15073:33;15053:18;;;15046:61;15124:18;;26053:284:0;14793:355:1;26053:284:0;26350:23;26359:3;26364:8;26350;:23::i;31180:182::-;31260:16;;;;31252:67;;;;-1:-1:-1;;;31252:67:0;;15355:2:1;31252:67:0;;;15337:21:1;15394:2;15374:18;;;15367:30;15433:34;15413:18;;;15406:62;-1:-1:-1;;;15484:18:1;;;15477:36;15530:19;;31252:67:0;15153:402:1;31252:67:0;31330:24;31344:9;;31330:13;:24::i;:::-;31180:182;;:::o;30745:104::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30820:18:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;30820:26:0;;::::1;::::0;;;::::1;::::0;;30745:104::o;31958:114::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;32045:19:::1;32051:3;32056:7;32045:5;:19::i;5262:112::-:0;5314:7;5354:12;5341:10;;:25;;;;:::i;:::-;5334:32;;5262:112;:::o;32442:105::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;32520:11:::1;:18;32534:4:::0;;32520:11;:18:::1;:::i;26995:244::-:0;27097:40;27116:10;27128:8;27097:18;:40::i;:::-;27089:100;;;;-1:-1:-1;;;27089:100:0;;16367:2:1;27089:100:0;;;16349:21:1;16406:2;16386:18;;;16379:30;16445:34;16425:18;;;16418:62;-1:-1:-1;;;16496:18:1;;;16489:32;16538:19;;27089:100:0;16165:398:1;27089:100:0;27200:31;27210:5;27217:3;27222:8;27200:9;:31::i;33653:341::-;33753:4;;33824:9;33863:100;33915:5;-1:-1:-1;;;;;33885:35:0;:26;33898:9;;33908:1;33898:12;;;;;;;:::i;:::-;;;;;;;33885;:26::i;:::-;-1:-1:-1;;;;;33885:35:0;;33881:53;;33929:5;33922:12;;;;;;33881:53;33960:1;33954:3;;;;;;:7;33863:100;;33982:4;33975:11;;;;33653:341;;;;;;:::o;21083:406::-;21257:10;;21161:7;;;;21220:12;;21278:178;21289:3;21285:1;:7;21278:178;;;21327:8;-1:-1:-1;;;;;21313:22:0;:10;21321:1;21313:7;:10::i;:::-;-1:-1:-1;;;;;21313:22:0;;;:53;;;;;21358:8;-1:-1:-1;;;;;21339:27:0;:15;21352:1;21339:12;:15::i;:::-;-1:-1:-1;;;;;21339:27:0;;21313:53;21309:104;;;21387:10;;;;:::i;:::-;;;;21309:104;21439:3;;;;;21278:178;;;-1:-1:-1;21473:8:0;;21083:406;-1:-1:-1;;;21083:406:0:o;4520:138::-;4599:7;4626:24;:19;;;4648:2;4626:24;:::i;27791:154::-;27895:42;27912:5;27919:3;27924:8;27895:42;;;;;;;;;;;;:16;:42::i;28147:467::-;28223:16;28252;28271:19;28281:8;-1:-1:-1;;;;;5473:22:0;5446:7;5473:22;;;:12;:22;;;;;:30;;;;5380:131;28271:19;28252:38;;28301:24;28343:8;-1:-1:-1;;;;;28328:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28328:24:0;-1:-1:-1;28301:51:0;-1:-1:-1;28363:21:0;28407:12;28430:152;28453:8;28437:13;:24;28430:152;;;28496:8;-1:-1:-1;;;;;28482:22:0;:10;28490:1;28482:7;:10::i;:::-;-1:-1:-1;;;;;28482:22:0;;28478:61;;28535:1;28508:7;28516:15;;;;:::i;:::-;;;28508:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;28478:61;28565:3;;28430:152;;;-1:-1:-1;28599:7:0;;28147:467;-1:-1:-1;;;;28147:467:0:o;32078:153::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;32198:25:::1;32208:4;;32198:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;32198:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;32214:8:0;;-1:-1:-1;32214:8:0;;;;32198:25;::::1;::::0;32214:8;;32198:25;32214:8;32198:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32198:9:0::1;::::0;-1:-1:-1;;;32198:25:0:i:1;:::-;32078:153:::0;;;;:::o;30639:100::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30712:16:::1;:24:::0;;-1:-1:-1;;30712:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30639:100::o;22810:153::-;22881:7;22930:25;22946:8;22930:15;:25::i;:::-;-1:-1:-1;;;;;5473:22:0;;5446:7;5473:22;;;:12;:22;;;;;:30;;;22908:47;;;;:::i;36449:150::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;36555:36:::1;36574:5;36581:9;;36555:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36555:18:0::1;::::0;-1:-1:-1;;;36555:36:0:i:1;21915:539::-:0;21996:16;22025;22044:25;22060:8;22044:15;:25::i;:::-;22025:44;;22080:24;22122:8;-1:-1:-1;;;;;22107:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22107:24:0;-1:-1:-1;22080:51:0;-1:-1:-1;22142:21:0;22186:12;22209:213;22232:8;22216:13;:24;22209:213;;;22275:8;-1:-1:-1;;;;;22261:22:0;:10;22269:1;22261:7;:10::i;:::-;-1:-1:-1;;;;;22261:22:0;;;:53;;;;;22306:8;-1:-1:-1;;;;;22287:27:0;:15;22300:1;22287:12;:15::i;:::-;-1:-1:-1;;;;;22287:27:0;;22261:53;22257:122;;;22362:1;22335:7;22343:15;;;;:::i;:::-;;;22335:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;22257:122;22405:3;;22209:213;;7602:135;7671:7;7698:25;7714:8;7698:15;:25::i;:::-;:31;;7602:135;-1:-1:-1;;7602:135:0:o;7069:241::-;7133:7;7153:31;7187:25;7203:8;7187:15;:25::i;:::-;7153:59;;7230:12;:27;;;:32;;7261:1;7230:32;:72;;2419:4;7230:72;;24338:424;24435:16;24464:9;24496;24464;24496;-1:-1:-1;;;;;24560:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24560:17:0;;24523:54;;24588:132;24599:1;24595;:5;24588:132;;;24640:36;24663:9;;24673:1;24663:12;;;;;;;:::i;:::-;;;;;;;24640:22;:36::i;:::-;24617:17;24635:1;24617:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;24703:3;;;;;24588:132;;;24737:17;24338:424;-1:-1:-1;;;;;24338:424:0:o;29917:159::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30029:4:::1;:12;30036:5:::0;;30029:4;:12:::1;:::i;:::-;-1:-1:-1::0;30052:6:0::1;:16;30061:7:::0;;30052:6;:16:::1;:::i;:::-;;29917:159:::0;;;;:::o;4375:139::-;4457:6;4490:15;4503:2;4490:10;:15;:::i;1792:20::-;;;;;;;:::i;38342:140::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;38438:36:::1;38457:5;38464:9;;38438:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38438:18:0::1;::::0;-1:-1:-1;;;38438:36:0:i:1;5022:174::-:0;5102:7;5129:59;5146:25;5162:8;5146:15;:25::i;:::-;:41;;;5129:16;:59::i;4844:172::-;4923:7;4950:58;4967:25;4983:8;4967:15;:25::i;:::-;:40;;;4950:16;:58::i;26623:227::-;26790:52;26809:10;26821:9;26832;26790:18;:52::i;33315:332::-;33411:4;;33482:9;33521:95;33568:5;-1:-1:-1;;;;;33543:30:0;:21;33551:9;;33561:1;33551:12;;;;;;;:::i;:::-;;;;;;;33543:7;:21::i;:::-;-1:-1:-1;;;;;33543:30:0;;33539:48;;33582:5;33575:12;;;;;;33539:48;33613:1;33607:3;;;;;;:7;33521:95;;-1:-1:-1;33635:4:0;;33315:332;-1:-1:-1;;;;;33315:332:0:o;27245:540::-;27368:34;27381:5;27388:3;27393:8;27368:12;:34::i;:::-;-1:-1:-1;;;;;27417:15:0;;;:20;27413:365;;27457:22;27483:3;-1:-1:-1;;;;;27483:8:0;27533:10;27545;27557:5;27564:8;27574:5;27492:88;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27492:88:0;;;;;;;;;;;27483:98;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27454:127;;;27596:16;27626:9;27615:31;;;;;;;;;;;;:::i;:::-;27596:50;-1:-1:-1;;;;;;;;;;27669:23:0;;;27661:105;;;;-1:-1:-1;;;27661:105:0;;18756:2:1;27661:105:0;;;18738:21:1;18795:2;18775:18;;;18768:30;18834:34;18814:18;;;18807:62;-1:-1:-1;;;18885:18:1;;;18878:49;18944:19;;27661:105:0;18554:415:1;27661:105:0;27439:339;;27245:540;;;;:::o;5968:773::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6152:12:0;6140:8;:24;;6132:63;;;;-1:-1:-1;;;6132:63:0;;19176:2:1;6132:63:0;;;19158:21:1;19215:2;19195:18;;;19188:30;19254:28;19234:18;;;19227:56;19300:18;;6132:63:0;18974:350:1;6132:63:0;6336:1;6298:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;6298:26:0;:40;;;:79;;;6367:10;;6355:8;:22;;6298:79;6294:440;;;-1:-1:-1;6401:20:0;;;;:10;:20;;;;;;;;;6394:27;;;;;;;;;-1:-1:-1;;;;;6394:27:0;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;5968:773::o;6294:440::-;6586:8;6609:69;6656:1;6616:22;;;:9;:22;;;;;:28;-1:-1:-1;;;;;6616:28:0;6609:69;;-1:-1:-1;;6662:13:0;6609:69;;;6699:22;;;;:9;:22;;;;;;;;;6692:29;;;;;;;;;-1:-1:-1;;;;;6692:29:0;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;5968:773;-1:-1:-1;;5968:773:0:o;6294:440::-;5968:773;;;:::o;33017:245::-;33083:13;33140;33157:1;33140:18;33136:33;;-1:-1:-1;;33160:9:0;;;;;;;;;-1:-1:-1;33160:9:0;;;33017:245::o;33136:33::-;33211:7;33220:19;33230:8;33220:9;:19::i;:::-;33241:11;33194:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33180:74;;33017:245;;;:::o;894:173::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;1054:4:::1;-1:-1:-1::0;;;;;1027:32:0::1;1048:4;-1:-1:-1::0;;;;;1027:32:0::1;;;;;;;;;;;894:173:::0;;:::o;23380:556::-;23465:7;23485:31;23519:25;23535:8;23519:15;:25::i;:::-;23485:59;;23555:31;23589:46;23606:12;:28;;;23589:16;:46::i;:::-;23555:80;;23646:31;23724:1;23694:12;:27;;;:31;;;:165;;23858:1;23694:165;;;23741:96;23809:12;:27;;;23776:30;:28;:30::i;:::-;:60;;;;:::i;23741:96::-;23646:213;-1:-1:-1;23879:49:0;23646:213;23879:23;:49;:::i;29000:154::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29079:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;29079:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29120:26;;20710:51:1;;;20777:18;;;20770:50;29120:26:0::1;::::0;20683:18:1;29120:26:0::1;;;;;;;29000:154:::0;;:::o;31368:190::-;31450:18;;;;;;;31442:71;;;;-1:-1:-1;;;31442:71:0;;21033:2:1;31442:71:0;;;21015:21:1;21072:2;21052:18;;;21045:30;21111:34;21091:18;;;21084:62;-1:-1:-1;;;21162:18:1;;;21155:38;21210:19;;31442:71:0;20831:404:1;31442:71:0;31524:26;31540:9;;31524:15;:26::i;4670:168::-;4747:7;4774:56;4791:25;4807:8;4791:15;:25::i;:::-;:38;;;4774:16;:56::i;4238:131::-;4307:6;4340:20;4358:2;4340:15;:20;:::i;709:179::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;800:5:::1;::::0;;-1:-1:-1;;;;;816:12:0;;::::1;-1:-1:-1::0;;;;;;816:12:0;::::1;::::0;::::1;::::0;;;844:36:::1;::::0;800:5;::::1;::::0;816:12;800:5;;844:36:::1;::::0;781:16:::1;::::0;844:36:::1;769:119;709:179:::0;:::o;30183:255::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30270:159:::1;::::0;;30301:15:::1;30270:159;::::0;::::1;21525:19:1::0;30318:12:0::1;21560::1::0;;;21553:28;;;30332:16:0::1;21597:12:1::0;;;;21590:28;;;;30363:14:0::1;21652:15:1::0;;-1:-1:-1;;21648:53:1;21634:12;;;21627:75;30379:14:0::1;21718:13:1::0;;;21711:29;30395:23:0;::::1;21756:13:1::0;;;21749:29;21794:13;;30270:159:0::1;::::0;;-1:-1:-1;;30270:159:0;;::::1;::::0;;;;;;30260:170;;30270:159:::1;30260:170:::0;;::::1;::::0;30243:14:::1;:187:::0;30183:255::o;25756:170::-;25833:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;25833:27:0;-1:-1:-1;;;;;25833:27:0;;;;;;;;:21;;25885:17;25833:21;25885:7;:17::i;:::-;-1:-1:-1;;;;;25876:42:0;;;;;;;;;;;25756:170;;:::o;19303:424::-;19374:9;19406;19433:287;19444:1;19440;:5;19433:287;;;19516:14;19533:20;19540:9;;19550:1;19540:12;;;;;;;:::i;:::-;;;;;;;19533:6;:20::i;:::-;19516:37;-1:-1:-1;19631:10:0;-1:-1:-1;;;;;19631:20:0;;;19623:55;;;;-1:-1:-1;;;19623:55:0;;22020:2:1;19623:55:0;;;22002:21:1;22059:2;22039:18;;;22032:30;-1:-1:-1;;;22078:18:1;;;22071:52;22140:18;;19623:55:0;21818:346:1;19623:55:0;19704:3;;;;;19447:273;19433:287;;30884:229;31001:7;30985:13;:11;:13::i;:::-;:23;;;;:::i;:::-;30521:4;30971:38;;30963:99;;;;-1:-1:-1;;;30963:99:0;;22371:2:1;30963:99:0;;;22353:21:1;22410:2;22390:18;;;22383:30;22449:34;22429:18;;;22422:62;-1:-1:-1;;;22500:18:1;;;22493:33;22543:19;;30963:99:0;22169:399:1;30963:99:0;31073:32;31087:8;31097:7;31073:13;:32::i;25129:506::-;25230:4;25247:14;25264:17;25272:8;25264:7;:17::i;:::-;25247:34;;25396:8;-1:-1:-1;;;;;25386:18:0;:6;-1:-1:-1;;;;;25386:18:0;;:121;;;-1:-1:-1;25474:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;25474:33:0;;;:21;;:33;25386:121;:240;;;-1:-1:-1;;;;;;25592:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;25386:240;25292:335;25129:506;-1:-1:-1;;;;25129:506:0:o;38638:609::-;38814:26;38843:30;:28;:30::i;:::-;-1:-1:-1;;;;;38913:19:0;;38884:26;38913:19;;;:12;:19;;;;;:38;38814:59;;-1:-1:-1;;;;38913:38:0;;;;39044:42;38600:3;38913:38;39044:42;:::i;:::-;39021:65;;:19;:65;;;;39013:120;;;;-1:-1:-1;;;39013:120:0;;22947:2:1;39013:120:0;;;22929:21:1;22986:2;22966:18;;;22959:30;23025:26;23005:18;;;22998:54;23069:18;;39013:120:0;22745:348:1;39013:120:0;39200:39;39218:5;39225:3;39230:8;39200:17;:39::i;31593:326::-;31722:8;:15;31701:10;:17;:36;31693:72;;;;-1:-1:-1;;;31693:72:0;;23300:2:1;31693:72:0;;;23282:21:1;23339:2;23319:18;;;23312:30;23378:25;23358:18;;;23351:53;23421:18;;31693:72:0;23098:347:1;31693:72:0;31781:9;31776:136;31800:10;:17;31796:1;:21;31776:136;;;31835:33;31841:10;31852:1;31841:13;;;;;;;;:::i;:::-;;;;;;;31856:8;31865:1;31856:11;;;;;;;;:::i;:::-;;;;;;;31835:5;:33::i;:::-;31895:3;;31776:136;;35132:1054;35274:16;;35320:23;;-1:-1:-1;;;35320:23:0;;-1:-1:-1;;;;;2275:32:1;;35320:23:0;;;2257:51:1;35256:15:0;;34911:42;;35320:16;;2230:18:1;;35320:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35301:42;;35373:8;35362:7;:19;35354:54;;;;-1:-1:-1;;;35354:54:0;;23841:2:1;35354:54:0;;;23823:21:1;23880:2;23860:18;;;23853:30;-1:-1:-1;;;23899:18:1;;;23892:52;23961:18;;35354:54:0;23639:346:1;35354:54:0;35474:9;35469:710;35489:7;35485:1;:11;35469:710;;;35558:15;35576:9;35586:1;35576:12;;;;;;;;:::i;:::-;;;;;;;35558:30;;35702:5;-1:-1:-1;;;;;35675:32:0;34911:42;-1:-1:-1;;;;;35675:14:0;;35690:7;35675:23;;;;;;;;;;;;;4137:25:1;;4125:2;4110:18;;3991:177;35675:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35675:32:0;;35667:63;;;;-1:-1:-1;;;35667:63:0;;24448:2:1;35667:63:0;;;24430:21:1;24487:2;24467:18;;;24460:30;-1:-1:-1;;;24506:18:1;;;24499:48;24564:18;;35667:63:0;24246:342:1;35667:63:0;35057:42;35910:16;35918:7;35910;:16::i;:::-;-1:-1:-1;;;;;35910:32:0;;35902:57;;;;-1:-1:-1;;;35902:57:0;;24795:2:1;35902:57:0;;;24777:21:1;24834:2;24814:18;;;24807:30;-1:-1:-1;;;24853:18:1;;;24846:42;24905:18;;35902:57:0;24593:336:1;35902:57:0;36051:39;35057:42;36075:5;36082:7;36051:9;:39::i;:::-;-1:-1:-1;36162:3:0;;35469:710;;37212:906;37308:9;37303:808;37323:9;:16;37319:1;:20;37303:808;;;37401:15;37419:9;37429:1;37419:12;;;;;;;;:::i;:::-;;;;;;;37401:30;;37532:5;-1:-1:-1;;;;;37512:25:0;:16;37520:7;37512;:16::i;:::-;-1:-1:-1;;;;;37512:25:0;;37504:47;;;;-1:-1:-1;;;37504:47:0;;25136:2:1;37504:47:0;;;25118:21:1;25175:1;25155:18;;;25148:29;-1:-1:-1;;;25193:18:1;;;25186:39;25242:18;;37504:47:0;24934:332:1;37504:47:0;37656:23;;-1:-1:-1;;;37656:23:0;;;;;4137:25:1;;;37691:1:0;;34911:42;;37656:14;;4110:18:1;;37656:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37656:37:0;;37648:63;;;;-1:-1:-1;;;37648:63:0;;25473:2:1;37648:63:0;;;25455:21:1;25512:2;25492:18;;;25485:30;-1:-1:-1;;;25531:18:1;;;25524:43;25584:18;;37648:63:0;25271:337:1;37648:63:0;37809:39;;-1:-1:-1;;;37809:39:0;;-1:-1:-1;;;;;25805:32:1;;37809:39:0;;;25787:51:1;25854:18;;;25847:34;;;34911:42:0;;37809:23;;25760:18:1;;37809:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38035:30;:28;:30::i;:::-;-1:-1:-1;;;;;37994:19:0;;;;;;:12;:19;;;;;:71;;;;;;;-1:-1:-1;;;37994:71:0;-1:-1:-1;;37994:71:0;;;;;;;;;-1:-1:-1;;38094:3:0;37303:808;;26389:228;-1:-1:-1;;;;;26502:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;26502:47:0;;;;;;;;;;26565:44;;540:41:1;;;26565:44:0;;513:18:1;26565:44:0;;;;;;;26389:228;;;:::o;32553:458::-;32611:13;32641:6;32651:1;32641:11;32637:32;;-1:-1:-1;;32656:10:0;;;;;;;;;;;;-1:-1:-1;;;32656:10:0;;;;;32553:458::o;32637:32::-;32698:6;32679:16;32732:52;32739:13;;32732:52;;32756:9;;;;:::i;:::-;;-1:-1:-1;32767:14:0;;-1:-1:-1;32779:2:0;32767:14;;:::i;:::-;;;32732:52;;;32794:20;32827:7;-1:-1:-1;;;;;32817:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32817:18:0;;32794:41;;32846:124;32853:11;;32846:124;;32868:9;;;;:::i;:::-;;-1:-1:-1;32938:11:0;;-1:-1:-1;32947:2:0;32938:6;:11;:::i;:::-;32925:26;;:2;:26;:::i;:::-;32898:55;;32879:7;32887;32879:16;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;32879:74:0;;;;;;;;-1:-1:-1;32955:12:0;32965:2;32955:12;;:::i;:::-;;;32846:124;;19961:430;20034:9;20066;20093:291;20104:1;20100;:5;20093:291;;;20178:14;20195:22;20204:9;;20214:1;20204:12;;;;;;;:::i;:::-;;;;;;;20195:8;:22::i;:::-;20178:39;-1:-1:-1;20295:10:0;-1:-1:-1;;;;;20295:20:0;;;20287:55;;;;-1:-1:-1;;;20287:55:0;;22020:2:1;20287:55:0;;;22002:21:1;22059:2;22039:18;;;22032:30;-1:-1:-1;;;22078:18:1;;;22071:52;22140:18;;20287:55:0;21818:346:1;20287:55:0;20368:3;;;;;20107:277;20093:291;;11636:215;11696:7;11798:45;11817:8;11827:15;11798:18;:45::i;16932:306::-;17029:7;17047:140;17070:12;17054:13;:28;17047:140;;;17099:29;17116:12;17099:29;;:::i;:::-;;;17143:32;17157:3;17162:12;17143:13;:32::i;:::-;17047:140;;;17197:33;17211:3;17216:13;17197;:33::i;17699:792::-;17859:17;17867:8;17859:7;:17::i;:::-;-1:-1:-1;;;;;17850:26:0;:5;-1:-1:-1;;;;;17850:26:0;;17842:68;;;;-1:-1:-1;;;17842:68:0;;26352:2:1;17842:68:0;;;26334:21:1;26391:2;26371:18;;;26364:30;26430:31;26410:18;;;26403:59;26479:18;;17842:68:0;26150:353:1;17842:68:0;-1:-1:-1;;;;;17964:17:0;;17956:55;;;;-1:-1:-1;;;17956:55:0;;26710:2:1;17956:55:0;;;26692:21:1;26749:2;26729:18;;;26722:30;26788:27;26768:18;;;26761:55;26833:18;;17956:55:0;26508:349:1;17956:55:0;18064:21;;;;:11;:21;;;;;;;;18057:28;;-1:-1:-1;;;;;;18057:28:0;;;;;;18132:10;:20;;;;;;:32;;;;;-1:-1:-1;;;;;18132:32:0;;;;;18211:30;:28;:30::i;:::-;18175:20;;;;:10;:20;;;;;;;;:66;;;;;;-1:-1:-1;;;18175:66:0;-1:-1:-1;;;;18175:66:0;;;;;;-1:-1:-1;;;;;18316:19:0;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;18316:29:0;;;;;;-1:-1:-1;;18316:29:0;;;;;;;18360:17;;;;;;;;;:27;;;;;-1:-1:-1;18360:27:0;;;;;;;;;;;;;;18453:30;18186:8;;18360:17;-1:-1:-1;;;;;;;;;;;18453:30:0;;17699:792;;;:::o;12239:188::-;12300:7;12388:31;12407:8;12417:1;9019:2231;9116:7;9208:31;9242:25;9258:8;9242:15;:25::i;:::-;9295:18;;9349:27;;;;9208:59;;-1:-1:-1;9295:18:0;9444:42;9463:8;9208:59;9444:18;:42::i;:::-;9544:21;;;;:11;:21;;;;;9537:28;;-1:-1:-1;;;;;;9537:28:0;;;9635:14;;9631:1375;;9737:20;;;;9729:94;;;;-1:-1:-1;;;9729:94:0;;27064:2:1;9729:94:0;;;27046:21:1;27103:2;27083:18;;;27076:30;27142:34;27122:18;;;27115:62;-1:-1:-1;;;27193:18:1;;;27186:42;27245:19;;9729:94:0;26862:408:1;9729:94:0;-1:-1:-1;;;;;9951:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;9951:30:0;;;;;;;-1:-1:-1;;9951:30:0;;;;;;;2419:4;10000:30;;;;;;:40;;;;;-1:-1:-1;10000:40:0;;;;;;;;;;;;;;;10128:44;;10163:8;;2419:4;;-1:-1:-1;;;;;;;;;;;10128:44:0;;9631:1375;;;10330:15;:20;;10349:1;10330:20;10322:96;;;;-1:-1:-1;;;10322:96:0;;27477:2:1;10322:96:0;;;27459:21:1;27516:2;27496:18;;;27489:30;27555:34;27535:18;;;27528:62;-1:-1:-1;;;27606:18:1;;;27599:44;27660:19;;10322:96:0;27275:410:1;10322:96:0;-1:-1:-1;;;;;10546:20:0;;;;;;:12;:20;;;;;;;:30;;;;;;;;;-1:-1:-1;;10546:30:0;;;;;;:12;10608:16;2419:4;;2337:95;10608:16;-1:-1:-1;;;;;10595:30:0;;;;;;;;;;;;-1:-1:-1;10595:30:0;;;:40;;-1:-1:-1;;10595:40:0;;;;;;-1:-1:-1;;10595:40:0;;;;;;;10798:15;10765:30;:28;:30::i;:::-;:48;;;;:::i;:::-;10828:20;;;;:10;:20;;;;;:51;;10744:69;;-1:-1:-1;10744:69:0;;10828:36;;:51;;10744:69;;-1:-1:-1;;;10828:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10985:8;10977:6;-1:-1:-1;;;;;10950:44:0;10959:16;2419:4;;2337:95;10959:16;-1:-1:-1;;;;;10950:44:0;-1:-1:-1;;;;;;;;;;;10950:44:0;;;;;;;;;10257:749;9631:1375;11105:30;11124:10;11105:18;:30::i;:::-;11067:20;;;;:10;:20;;;;;:68;;;;;;;-1:-1:-1;;;11067:68:0;-1:-1:-1;;;;11067:68:0;;;;;;;;;-1:-1:-1;11236:6:0;-1:-1:-1;;9019:2231:0;;;;:::o;15694:1059::-;-1:-1:-1;;;;;15814:17:0;;15806:59;;;;-1:-1:-1;;;15806:59:0;;27892:2:1;15806:59:0;;;27874:21:1;27931:2;27911:18;;;27904:30;27970:31;27950:18;;;27943:59;28019:18;;15806:59:0;27690:353:1;15806:59:0;15960:12;15949:7;:23;;15941:90;;;;-1:-1:-1;;;15941:90:0;;28250:2:1;15941:90:0;;;28232:21:1;28289:2;28269:18;;;28262:30;28328:34;28308:18;;;28301:62;-1:-1:-1;;;28379:18:1;;;28372:38;28427:19;;15941:90:0;28048:404:1;15941:90:0;16101:10;;16082:16;16139:18;16150:7;16101:10;16139:18;:::i;:::-;16231:19;;;;:9;:19;;;;;:31;;-1:-1:-1;;;;;;16231:31:0;-1:-1:-1;;;;;16231:31:0;;;;;16122:35;-1:-1:-1;16308:30:0;:28;:30::i;:::-;16273:19;;;;:9;:19;;;;;;;;:65;;-1:-1:-1;;;;16273:65:0;-1:-1:-1;;;16273:65:0;;;;;;;;-1:-1:-1;;;;;16465:17:0;;;;:12;:17;;;;;:44;;-1:-1:-1;;16524:49:0;;16465:44;;;;;;;16524:49;;;;-1:-1:-1;;16465:44:0;;;;;;16524:49;;;;;;;;;;;;;;;;;16590:77;16600:35;;16626:8;;-1:-1:-1;;;;;16600:35:0;;;16617:1;;-1:-1:-1;;;;;;;;;;;16600:35:0;16617:1;;16600:35;16659:6;16646:10;;;;;;:19;16590:77;;16726:10;:19;-1:-1:-1;;;15694:1059:0:o;8186:300::-;8413:1;8375:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;8375:26:0;8371:108;;8432:20;;;;:10;:20;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8432:35:0;-1:-1:-1;;;;;8432:35:0;;;-1:-1:-1;;;8432:35:0;;;;;-1:-1:-1;;;;;8432:35:0;;;;-1:-1:-1;;;8432:35:0;-1:-1:-1;;;;;;8432:35:0;;;-1:-1:-1;;;;;8432:35:0;;;;;;;;;;;;;;;;;;;8186: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:348::-;644:8;654:6;708:3;701:4;693:6;689:17;685:27;675:55;;726:1;723;716:12;675:55;-1:-1:-1;749:20:1;;-1:-1:-1;;;;;781:30:1;;778:50;;;824:1;821;814:12;778:50;861:4;853:6;849:17;837:29;;913:3;906:4;897:6;889;885:19;881:30;878:39;875:59;;;930:1;927;920:12;875:59;592:348;;;;;:::o;945:411::-;1016:6;1024;1077:2;1065:9;1056:7;1052:23;1048:32;1045:52;;;1093:1;1090;1083:12;1045:52;1133:9;1120:23;-1:-1:-1;;;;;1158:6:1;1155:30;1152:50;;;1198:1;1195;1188:12;1152:50;1237:59;1288:7;1279:6;1268:9;1264:22;1237:59;:::i;:::-;1315:8;;1211:85;;-1:-1:-1;945:411:1;-1:-1:-1;;;;945:411:1:o;1361:289::-;1403:3;1441:5;1435:12;1468:6;1463:3;1456:19;1524:6;1517:4;1510:5;1506:16;1499:4;1494:3;1490:14;1484:47;1576:1;1569:4;1560:6;1555:3;1551:16;1547:27;1540:38;1639:4;1632:2;1628:7;1623:2;1615:6;1611:15;1607:29;1602:3;1598:39;1594:50;1587:57;;;1361:289;;;;:::o;1655:220::-;1804:2;1793:9;1786:21;1767:4;1824:45;1865:2;1854:9;1850:18;1842:6;1824:45;:::i;1880:226::-;1939:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;2053:23:1;;1880:226;-1:-1:-1;1880:226:1:o;2319:131::-;-1:-1:-1;;;;;2394:31:1;;2384:42;;2374:70;;2440:1;2437;2430:12;2455:367;2523:6;2531;2584:2;2572:9;2563:7;2559:23;2555:32;2552:52;;;2600:1;2597;2590:12;2552:52;2639:9;2626:23;2658:31;2683:5;2658:31;:::i;:::-;2708:5;2786:2;2771:18;;;;2758:32;;-1:-1:-1;;;2455:367:1:o;2827:::-;2890:8;2900:6;2954:3;2947:4;2939:6;2935:17;2931:27;2921:55;;2972:1;2969;2962:12;2921:55;-1:-1:-1;2995:20:1;;-1:-1:-1;;;;;3027:30:1;;3024:50;;;3070:1;3067;3060:12;3024:50;3107:4;3099:6;3095:17;3083:29;;3167:3;3160:4;3150:6;3147:1;3143:14;3135:6;3131:27;3127:38;3124:47;3121:67;;;3184:1;3181;3174:12;3199:437;3285:6;3293;3346:2;3334:9;3325:7;3321:23;3317:32;3314:52;;;3362:1;3359;3352:12;3314:52;3402:9;3389:23;-1:-1:-1;;;;;3427:6:1;3424:30;3421:50;;;3467:1;3464;3457:12;3421:50;3506:70;3568:7;3559:6;3548:9;3544:22;3506:70;:::i;3641:160::-;3706:20;;3762:13;;3755:21;3745:32;;3735:60;;3791:1;3788;3781:12;3806:180;3862:6;3915:2;3903:9;3894:7;3890:23;3886:32;3883:52;;;3931:1;3928;3921:12;3883:52;3954:26;3970:9;3954:26;:::i;4173:508::-;4250:6;4258;4266;4319:2;4307:9;4298:7;4294:23;4290:32;4287:52;;;4335:1;4332;4325:12;4287:52;4374:9;4361:23;4393:31;4418:5;4393:31;:::i;:::-;4443:5;-1:-1:-1;4500:2:1;4485:18;;4472:32;4513:33;4472:32;4513:33;:::i;:::-;4173:508;;4565:7;;-1:-1:-1;;;4645:2:1;4630:18;;;;4617:32;;4173:508::o;5153:572::-;5248:6;5256;5264;5317:2;5305:9;5296:7;5292:23;5288:32;5285:52;;;5333:1;5330;5323:12;5285:52;5372:9;5359:23;5391:31;5416:5;5391:31;:::i;:::-;5441:5;-1:-1:-1;5497:2:1;5482:18;;5469:32;-1:-1:-1;;;;;5513:30:1;;5510:50;;;5556:1;5553;5546:12;5510:50;5595:70;5657:7;5648:6;5637:9;5633:22;5595:70;:::i;:::-;5153:572;;5684:8;;-1:-1:-1;5569:96:1;;-1:-1:-1;;;;5153:572:1:o;5952:247::-;6011:6;6064:2;6052:9;6043:7;6039:23;6035:32;6032:52;;;6080:1;6077;6070:12;6032:52;6119:9;6106:23;6138:31;6163:5;6138:31;:::i;6204:276::-;6262:6;6315:2;6303:9;6294:7;6290:23;6286:32;6283:52;;;6331:1;6328;6321:12;6283:52;6370:9;6357:23;6420:10;6413:5;6409:22;6402:5;6399:33;6389:61;;6446:1;6443;6436:12;6485:611;6675:2;6687:21;;;6757:13;;6660:18;;;6779:22;;;6627:4;;6858:15;;;6832:2;6817:18;;;6627:4;6901:169;6915:6;6912:1;6909:13;6901:169;;;6976:13;;6964:26;;7019:2;7045:15;;;;7010:12;;;;6937:1;6930:9;6901:169;;;-1:-1:-1;7087:3:1;;6485:611;-1:-1:-1;;;;;6485:611:1:o;7101:768::-;7223:6;7231;7239;7247;7300:2;7288:9;7279:7;7275:23;7271:32;7268:52;;;7316:1;7313;7306:12;7268:52;7356:9;7343:23;-1:-1:-1;;;;;7381:6:1;7378:30;7375:50;;;7421:1;7418;7411:12;7375:50;7460:70;7522:7;7513:6;7502:9;7498:22;7460:70;:::i;:::-;7549:8;;-1:-1:-1;7434:96:1;-1:-1:-1;;7637:2:1;7622:18;;7609:32;-1:-1:-1;;;;;7653:32:1;;7650:52;;;7698:1;7695;7688:12;7650:52;7737:72;7801:7;7790:8;7779:9;7775:24;7737:72;:::i;:::-;7101:768;;;;-1:-1:-1;7828:8:1;-1:-1:-1;;;;7101:768:1:o;8622:716::-;8714:6;8722;8730;8738;8791:2;8779:9;8770:7;8766:23;8762:32;8759:52;;;8807:1;8804;8797:12;8759:52;8847:9;8834:23;-1:-1:-1;;;;;8872:6:1;8869:30;8866:50;;;8912:1;8909;8902:12;8866:50;8951:59;9002:7;8993:6;8982:9;8978:22;8951:59;:::i;:::-;9029:8;;-1:-1:-1;8925:85:1;-1:-1:-1;;9117:2:1;9102:18;;9089:32;-1:-1:-1;;;;;9133:32:1;;9130:52;;;9178:1;9175;9168:12;9130:52;9217:61;9270:7;9259:8;9248:9;9244:24;9217:61;:::i;9343:315::-;9408:6;9416;9469:2;9457:9;9448:7;9444:23;9440:32;9437:52;;;9485:1;9482;9475:12;9437:52;9524:9;9511:23;9543:31;9568:5;9543:31;:::i;:::-;9593:5;-1:-1:-1;9617:35:1;9648:2;9633:18;;9617:35;:::i;:::-;9607:45;;9343:315;;;;;:::o;9663:127::-;9724:10;9719:3;9715:20;9712:1;9705:31;9755:4;9752:1;9745:15;9779:4;9776:1;9769:15;9795:1341;9890:6;9898;9906;9914;9967:3;9955:9;9946:7;9942:23;9938:33;9935:53;;;9984:1;9981;9974:12;9935:53;10023:9;10010:23;10042:31;10067:5;10042:31;:::i;:::-;10092:5;-1:-1:-1;10149:2:1;10134:18;;10121:32;10162:33;10121:32;10162:33;:::i;:::-;10214:7;-1:-1:-1;10294:2:1;10279:18;;10266:32;;-1:-1:-1;10375:2:1;10360:18;;10347:32;-1:-1:-1;;;;;10391:30:1;;10388:50;;;10434:1;10431;10424:12;10388:50;10457:22;;10510:4;10502:13;;10498:27;-1:-1:-1;10488:55:1;;10539:1;10536;10529:12;10488:55;10579:2;10566:16;-1:-1:-1;;;;;10597:6:1;10594:30;10591:56;;;10627:18;;:::i;:::-;10676:2;10670:9;10768:2;10730:17;;-1:-1:-1;;10726:31:1;;;10759:2;10722:40;10718:54;10706:67;;-1:-1:-1;;;;;10788:34:1;;10824:22;;;10785:62;10782:88;;;10850:18;;:::i;:::-;10886:2;10879:22;10910;;;10951:15;;;10968:2;10947:24;10944:37;-1:-1:-1;10941:57:1;;;10994:1;10991;10984:12;10941:57;11050:6;11045:2;11041;11037:11;11032:2;11024:6;11020:15;11007:50;11103:1;11098:2;11089:6;11081;11077:19;11073:28;11066:39;11124:6;11114:16;;;;;9795:1341;;;;;;;:::o;11653:388::-;11721:6;11729;11782:2;11770:9;11761:7;11757:23;11753:32;11750:52;;;11798:1;11795;11788:12;11750:52;11837:9;11824:23;11856:31;11881:5;11856:31;:::i;:::-;11906:5;-1:-1:-1;11963:2:1;11948:18;;11935:32;11976:33;11935:32;11976:33;:::i;:::-;12028:7;12018:17;;;11653:388;;;;;:::o;12046:334::-;12248:2;12230:21;;;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12321:2:1;12306:18;;12299:40;12371:2;12356:18;;12046:334::o;12385:380::-;12464:1;12460:12;;;;12507;;;12528:61;;12582:4;12574:6;12570:17;12560:27;;12528:61;12635:2;12627:6;12624:14;12604:18;12601:38;12598:161;;12681:10;12676:3;12672:20;12669:1;12662:31;12716:4;12713:1;12706:15;12744:4;12741:1;12734:15;12598:161;;12385:380;;;:::o;12896:518::-;12998:2;12993:3;12990:11;12987:421;;;13034:5;13031:1;13024:16;13078:4;13075:1;13065:18;13148:2;13136:10;13132:19;13129:1;13125:27;13119:4;13115:38;13184:4;13172:10;13169:20;13166:47;;;-1:-1:-1;13207:4:1;13166:47;13262:2;13257:3;13253:12;13250:1;13246:20;13240:4;13236:31;13226:41;;13317:81;13335:2;13328:5;13325:13;13317:81;;;13394:1;13380:16;;13361:1;13350:13;13317:81;;13590:1198;-1:-1:-1;;;;;13709:3:1;13706:27;13703:53;;;13736:18;;:::i;:::-;13765:94;13855:3;13815:38;13847:4;13841:11;13815:38;:::i;:::-;13809:4;13765:94;:::i;:::-;13885:1;13910:2;13905:3;13902:11;13927:1;13922:608;;;;14574:1;14591:3;14588:93;;;-1:-1:-1;14647:19:1;;;14634:33;14588:93;-1:-1:-1;;13547:1:1;13543:11;;;13539:24;13535:29;13525:40;13571:1;13567:11;;;13522:57;14694:78;;13895:887;;13922:608;12843:1;12836:14;;;12880:4;12867:18;;-1:-1:-1;;13958:17:1;;;14073:229;14087:7;14084:1;14081:14;14073:229;;;14176:19;;;14163:33;14148:49;;14283:4;14268:20;;;;14236:1;14224:14;;;;14103:12;14073:229;;;14077:3;14330;14321:7;14318:16;14315:159;;;14454:1;14450:6;14444:3;14438;14435:1;14431:11;14427:21;14423:34;14419:39;14406:9;14401:3;14397:19;14384:33;14380:79;14372:6;14365:95;14315:159;;;14517:1;14511:3;14508:1;14504:11;14500:19;14494:4;14487:33;13895:887;;13590:1198;;;:::o;15560:335::-;15762:2;15744:21;;;15801:2;15781:18;;;15774:30;-1:-1:-1;;;15835:2:1;15820:18;;15813:41;15886:2;15871:18;;15560:335::o;15900:127::-;15961:10;15956:3;15952:20;15949:1;15942:31;15992:4;15989:1;15982:15;16016:4;16013:1;16006:15;16032:128;16099:9;;;16120:11;;;16117:37;;;16134:18;;:::i;16568:127::-;16629:10;16624:3;16620:20;16617:1;16610:31;16660:4;16657:1;16650:15;16684:4;16681:1;16674:15;16700:135;16739:3;16760:17;;;16757:43;;16780:18;;:::i;:::-;-1:-1:-1;16827:1:1;16816:13;;16700:135::o;16840:168::-;16913:9;;;16944;;16961:15;;;16955:22;;16941:37;16931:71;;16982:18;;:::i;17013:125::-;17078:9;;;17099:10;;;17096:36;;;17112:18;;:::i;17143:127::-;17204:10;17199:3;17195:20;17192:1;17185:31;17235:4;17232:1;17225:15;17259:4;17256:1;17249:15;17275:120;17315:1;17341;17331:35;;17346:18;;:::i;:::-;-1:-1:-1;17380:9:1;;17275:120::o;17400:485::-;-1:-1:-1;;;;;17631:32:1;;;17613:51;;17700:32;;17695:2;17680:18;;17673:60;17764:2;17749:18;;17742:34;;;17812:3;17807:2;17792:18;;17785:31;;;-1:-1:-1;;17833:46:1;;17859:19;;17851:6;17833:46;:::i;:::-;17825:54;17400:485;-1:-1:-1;;;;;;17400:485:1:o;17890:211::-;17931:3;17969:5;17963:12;18013:6;18006:4;17999:5;17995:16;17990:3;17984:36;18075:1;18039:16;;18064:13;;;-1:-1:-1;18039:16:1;;17890:211;-1:-1:-1;17890:211:1:o;18106:189::-;18235:3;18260:29;18285:3;18277:6;18260:29;:::i;18300:249::-;18369:6;18422:2;18410:9;18401:7;18397:23;18393:32;18390:52;;;18438:1;18435;18428:12;18390:52;18470:9;18464:16;18489:30;18513:5;18489:30;:::i;19329:677::-;19379:3;19420:5;19414:12;19449:36;19475:9;19449:36;:::i;:::-;19516:1;19501:17;;19527:133;;;;19674:1;19669:331;;;;19494:506;;19527:133;-1:-1:-1;;19560:24:1;;19548:37;;19633:14;;19626:22;19614:35;;19605:45;;;-1:-1:-1;19527:133:1;;19669:331;19700:5;19697:1;19690:16;19747:4;19744:1;19734:18;19774:1;19788:166;19802:6;19799:1;19796:13;19788:166;;;19882:14;;19869:11;;;19862:35;19938:1;19925:15;;;;19824:4;19817:12;19788:166;;;19792:3;;19983:6;19978:3;19974:16;19967:23;;19494:506;;;;19329:677;;;;:::o;20011:351::-;20232:3;20257:99;20291:64;20316:38;20350:3;20342:6;20316:38;:::i;:::-;20308:6;20291:64;:::i;:::-;20283:6;20257:99;:::i;20367:170::-;20464:10;20457:18;;;20437;;;20433:43;;20488:20;;20485:46;;;20511:18;;:::i;22573:167::-;22668:10;22641:18;;;22661;;;22637:43;;22692:19;;22689:45;;;22714:18;;:::i;23450:184::-;23520:6;23573:2;23561:9;23552:7;23548:23;23544:32;23541:52;;;23589:1;23586;23579:12;23541:52;-1:-1:-1;23612:16:1;;23450:184;-1:-1:-1;23450:184:1:o;23990:251::-;24060:6;24113:2;24101:9;24092:7;24088:23;24084:32;24081:52;;;24129:1;24126;24119:12;24081:52;24161:9;24155:16;24180:31;24205:5;24180:31;:::i;25892:136::-;25931:3;25959:5;25949:39;;25968:18;;:::i;:::-;-1:-1:-1;;;26004:18:1;;25892:136::o;26033:112::-;26065:1;26091;26081:35;;26096:18;;:::i;:::-;-1:-1:-1;26130:9:1;;26033:112::o
Swarm Source
ipfs://2c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.