Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,051 GBAC
Holders
1,318
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 GBACLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MiniStayPuft
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./interfaces/IERC721.sol"; import "./interfaces/IERC721Enumerable.sol"; import "./interfaces/IERC721Metadata.sol"; import "./interfaces/IERC721Receiver.sol"; import "./interfaces/IERC165.sol"; import "./IGBATrapsPartial.sol"; import "./Ownable.sol"; import "./GBAWhitelist.sol"; /// @author Andrew Parker /// @title Ghost Busters: Afterlife Mini Stay Puft NFT contract contract MiniStayPuft is IERC721, IERC721Metadata, IERC165, Ownable{ enum Phase{Init,PreReserve,Reserve,Final} // Launch phase struct Reservation{ uint24 block; // Using uint24 to store block number is fine for the next 2.2 years uint16[] tokens; // TokenIDs reserved by person } bool paused = true; // Sale pause state bool unpausable; // Unpausable uint startTime; // Timestamp of when preReserve phase started (adjusts when paused/unpaused) uint pauseTime; // Timestamp of pause uint16 tokenCount; // Total tokens minted and reserved. (not including caught mobs) uint16 tokensGiven; // Total number of giveaway token's minted uint16 constant TOKENS_GIVEAWAY = 200; // Max number of giveaway tokens uint constant PRICE_MINT = 0.08 ether; // Mint cost string __uriBase; // Metadata URI base string __uriSuffix; // Metadata URI suffix uint constant COOLDOWN = 10; // Min interval in blocks to reserve uint16 constant TRANSACTION_LIMIT = 10; // Max tokens reservable in one transaction mapping(address => Reservation) reservations; // Mapping of buyer to reservations mapping(address => uint8) whitelistReserveCount; // Mapping of how many times listees have preReserved uint8 constant WHITELIST_RESERVE_LIMIT = 2; // Limit of how many tokens a listee can preReserve uint constant PRESALE_LIMIT = 2000; // Max number of tokens that can be preReserved uint presaleCount; // Number of tokens that have been preReserved event Pause(bool _pause,uint _startTime,uint _pauseTime); event Reserve(address indexed reservist, uint indexed tokenId); event Claim(address indexed reservist, uint indexed tokenId); //MOB VARS address trapContract; // Address of Traps contract address whitelist; // Address of Whitelist contract uint16 constant SALE_MAX = 10000; // Max number of tokens that can be sold uint16[4] mobTokenIds; // Partial IDs of current mobs. 4th slot is highest id (used to detect mob end) uint16 constant TOTAL_MOB_COUNT = 500; // Total number of mobs that will exist uint constant MOB_OFFSET = 100000; // TokenId offset for mobs bool mobReleased = false; // Has mob been released bytes32 mobHash; // Current mob data mapping(address => uint256) internal balances; // Mapping of balances (not including active mobs) mapping (uint256 => address) internal allowance; // Mapping of allowances mapping (address => mapping (address => bool)) internal authorised; // Mapping of token allowances mapping(uint256 => address) owners; // Mapping of owners (not including active mobs) uint[] tokens; // Array of tokenIds (not including active mobs) mapping (bytes4 => bool) internal supportedInterfaces; constructor(string memory _uriBase, string memory _uriSuffix, address _trapContract, address _whitelist){ supportedInterfaces[0x80ac58cd] = true; //ERC721 supportedInterfaces[0x5b5e139f] = true; //ERC721Metadata supportedInterfaces[0x01ffc9a7] = true; //ERC165 mobTokenIds[0] = 1; mobTokenIds[1] = 2; mobTokenIds[2] = 3; mobTokenIds[3] = 3; trapContract = _trapContract; whitelist = _whitelist; __uriBase = _uriBase; __uriSuffix = _uriSuffix; //Init mobHash segments mobHash = shiftBytes(bytes32(uint(0)),0) ^ // Random data that changes every tx to even out gas costs shiftBytes(bytes32(uint(1)),1) ^ // Number of owners to base ownership calcs on for mob 0 shiftBytes(bytes32(uint(1)),2) ^ // Number of owners to base ownership calcs on for mob 1 shiftBytes(bytes32(uint(1)),3) ^ // Number of owners to base ownership calcs on for mob 2 shiftBytes(bytes32(uint(0)),4); // Location data for calculating ownership of all mobs } /// Mint-Reserve State /// @notice Get struct properties of reservation mapping for given address, as well as preReserve count. /// @dev Combined these to lower compiled contract size (Spurious Dragon). /// @param _tokenOwner Address of reservation data to check /// @return _whitelistReserveCount Number of times address has pre-reserved /// @return blockNumber Block number of last reservation /// @return tokenIds Array of reserved, unclaimed tokens function mintReserveState(address _tokenOwner) public view returns(uint8 _whitelistReserveCount, uint24 blockNumber, uint16[] memory tokenIds){ return (whitelistReserveCount[_tokenOwner],reservations[_tokenOwner].block,reservations[_tokenOwner].tokens); } /// Contract State /// @notice View function for various contract state properties /// @dev Combined these to lower compiled contract size (Spurious Dragon). /// @return _tokenCount Number of tokens reserved or minted (not including mobs) /// @return _phase Current launch phase /// @return mobMax Uint used to calculate IDs and number if mobs in circulation. function contractState() public view returns(uint _tokenCount, Phase _phase, uint mobMax){ return (tokenCount,phase(),mobTokenIds[3]); } /// Pre-Reserve /// @notice Pre-reserve tokens during Pre-Reserve phase if whitelisted. Max 2 per address. Must pay mint fee /// @param merkleProof Merkle proof for your address in the whitelist /// @param _count Number of tokens to reserve function preReserve(bytes32[] memory merkleProof, uint8 _count) external payable{ require(!paused,"paused"); require(phase() == Phase.PreReserve,"phase"); require(msg.value >= PRICE_MINT * _count,"PRICE_MINT"); require(whitelistReserveCount[msg.sender] + _count <= WHITELIST_RESERVE_LIMIT,"whitelistReserveCount"); require(presaleCount + _count < PRESALE_LIMIT,"PRESALE_LIMIT"); require(GBAWhitelist(whitelist).isWhitelisted(merkleProof,msg.sender),"whitelist"); whitelistReserveCount[msg.sender] += _count; presaleCount += _count; _reserve(_count,msg.sender,true); } /// Mint Giveaway /// @notice Mint tokens for giveaway /// @param numTokens Number of tokens to mint function mintGiveaway(uint16 numTokens) public onlyOwner { require(tokensGiven + numTokens <= TOKENS_GIVEAWAY,"tokensGiven"); require(tokenCount + numTokens <= SALE_MAX,"SALE_MAX"); for(uint i = 0; i < numTokens; i++){ tokensGiven++; _mint(msg.sender,++tokenCount); } } /// Withdraw All /// @notice Withdraw all Eth from mint fees function withdrawAll() public onlyOwner { require(payable(msg.sender).send(address(this).balance)); } /// Reserve /// @notice Reserve tokens. Max 10 per tx, one tx per 10 blocks. Can't be called by contracts. Must be in Reserve phase. Must pay mint fee. /// @param _count Number of tokens to reserve /// @dev requires tx.origin == msg.sender function reserve(uint16 _count) public payable{ require(msg.sender == tx.origin,"origin"); require(!paused,"paused"); require(phase() == Phase.Reserve,"phase"); require(_count <= TRANSACTION_LIMIT,"TRANSACTION_LIMIT"); require(msg.value >= uint(_count) * PRICE_MINT,"PRICE MINT"); _reserve(_count,msg.sender,false); } /// Internal Reserve /// @notice Does the work in both Reserve and PreReserve /// @param _count Number of tokens being reserved /// @param _to Address that is reserving /// @param ignoreCooldown Don't revert for cooldown.Used in pre-reserve function _reserve(uint16 _count, address _to, bool ignoreCooldown) internal{ require(tokenCount + _count <= SALE_MAX, "SALE_MAX"); require(ignoreCooldown || reservations[_to].block == 0 || block.number >= uint(reservations[_to].block) + COOLDOWN ,"COOLDOWN"); for(uint16 i = 0; i < _count; i++){ reservations[address(_to)].tokens.push(++tokenCount); emit Reserve(_to,tokenCount); } reservations[_to].block = uint24(block.number); } /// Claim /// @notice Mint reserved tokens /// @param reservist Address with reserved tokens. /// @param _count Number of reserved tokens mint. /// @dev Allows anyone to call claim for anyone else. Will mint to the address that made the reservations. function claim(address reservist, uint _count) public{ require(!paused,"paused"); require( phase() == Phase.Final ,"phase"); require( reservations[reservist].tokens.length >= _count, "_count"); for(uint i = 0; i < _count; i++){ uint tokenId = uint(reservations[reservist].tokens[reservations[reservist].tokens.length - 1]); reservations[reservist].tokens.pop(); _mint(reservist,tokenId); emit Claim(reservist,tokenId); } updateMobStart(); updateMobFinish(); } /// Mint /// @notice Mint unreserved tokens. Must pay mint fee. /// @param _count Number of reserved tokens mint. function mint(uint _count) public payable{ require(!paused,"paused"); require( phase() == Phase.Final ,"phase"); require(msg.value >= _count * PRICE_MINT,"PRICE"); require(tokenCount + uint16(_count) <= SALE_MAX,"SALE_MAX"); for(uint i = 0; i < _count; i++){ _mint(msg.sender,uint(++tokenCount)); } updateMobStart(); updateMobFinish(); } /// Update URI /// @notice Update URI base and suffix /// @param _uriBase URI base /// @param _uriSuffix URI suffix /// @dev Pushing size limits (Spurious Dragon), so rather than having an explicit lock function, it can be implicit by renouncing ownership. function updateURI(string memory _uriBase, string memory _uriSuffix) public onlyOwner{ __uriBase = _uriBase; __uriSuffix = _uriSuffix; } /// Phase /// @notice Internal function to calculate current Phase /// @return Phase (enum value) function phase() internal view returns(Phase){ uint _startTime = startTime; if(_startTime == 0){ return Phase.Init; }else if(block.timestamp <= _startTime + 2 hours){ return Phase.PreReserve; }else if(block.timestamp <= _startTime + 2 hours + 1 days && tokenCount < SALE_MAX){ return Phase.Reserve; }else{ return Phase.Final; } } /// Pause State /// @notice Get current pause state /// @return _paused Contract is paused /// @return _startTime Start timestamp of Cat phase (adjusted for pauses) /// @return _pauseTime Timestamp of pause function pauseState() view public returns(bool _paused,uint _startTime,uint _pauseTime){ return (paused,startTime,pauseTime); } /// Disable pause /// @notice Disable mint pausability function disablePause() public onlyOwner{ if(paused) togglePause(); unpausable = true; } /// Toggle pause /// @notice Toggle pause on/off function togglePause() public onlyOwner{ if(startTime == 0){ startTime = block.timestamp; paused = false; emit Pause(false,startTime,pauseTime); return; } require(!unpausable,"unpausable"); bool _pause = !paused; if(_pause){ pauseTime = block.timestamp; }else if(pauseTime != 0){ startTime += block.timestamp - pauseTime; delete pauseTime; } paused = _pause; emit Pause(_pause,startTime,pauseTime); } /// Get Mob Owner /// @notice Internal func to calculate the owner of a given mob for a given mob hash /// @param _mobIndex Index of mob to check (0-2) /// @param _mobHash Mob hash to base calcs off /// @return Address of the calculated owner function getMobOwner(uint _mobIndex, bytes32 _mobHash) internal view returns(address){ bytes32 mobModulo = extractBytes(_mobHash, _mobIndex + 1); bytes32 locationHash = extractBytes(_mobHash,4); uint hash = uint(keccak256(abi.encodePacked(locationHash,_mobIndex,mobModulo))); uint index = hash % uint(mobModulo); address _owner = owners[tokens[index]]; if(mobReleased){ return _owner; }else{ return address(0); } } /// Get Mob Token ID (internal) /// @notice Internal func to calculate mob token ID given an index /// @dev Doesn't check invalid vals, inferred by places where its used and saves gas /// @param _mobIndex Index of mob to calculate /// @return tokenId of mob function _getMobTokenId(uint _mobIndex) internal view returns(uint){ return MOB_OFFSET+uint(mobTokenIds[_mobIndex]); } /// Get Mob Token ID /// @notice Calculate mob token ID given an index /// @dev Doesn't fail for _mobIndex = 3, because of Spurious Dragon and because it doesnt matter /// @param _mobIndex Index of mob to calculate /// @return tokenId of mob function getMobTokenId(uint _mobIndex) public view returns(uint){ uint tokenId = _getMobTokenId(_mobIndex); require(tokenId != MOB_OFFSET,"no token"); return tokenId; } /// Extract Bytes /// @notice Get the nth 4-byte chunk from a bytes32 /// @param data Data to extract bytes from /// @param index Index of chunk function extractBytes(bytes32 data, uint index) internal pure returns(bytes32){ uint inset = 32 * ( 7 - index ); uint outset = 32 * index; return ((data << outset) >> outset) >> inset; } /// Extract Bytes /// @notice Bit shift a bytes32 for XOR packing /// @param data Data to bit shift /// @param index How many 4-byte segments to shift it by function shiftBytes(bytes32 data, uint index) internal pure returns(bytes32){ uint inset = 32 * ( 7 - index ); return data << inset; } /// Release Mob /// @notice Start Mob function releaseMob() public onlyOwner{ require(!mobReleased,"released"); require(tokens.length > 0, "no mint"); mobReleased = true; bytes32 _mobHash = mobHash; //READ uint eliminationBlock = block.number - (block.number % 245) - 10; //READ bytes32 updateHash = extractBytes(keccak256(abi.encodePacked(_mobHash)),0); bytes32 mobModulo = bytes32(tokens.length); bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4) ; bytes32 newMobHash = shiftBytes(updateHash,0) ^ //WRITE shiftBytes(mobModulo,1) ^ shiftBytes(mobModulo,2) ^ shiftBytes(mobModulo,3) ^ shiftBytes(destinationHash,4); for(uint i = 0; i < 3; i++){ uint _tokenId = _getMobTokenId(i); //READ x 3 emit Transfer(address(0),getMobOwner(i,newMobHash),_tokenId); //EMIT x 3 max } mobHash = newMobHash; } /// Update Mobs Start /// @notice Internal - Emits all the events sending mobs to 0. First part of mobs moving function updateMobStart() internal{ if(!mobReleased || mobTokenIds[3] == 0) return; //BURN THEM bytes32 _mobHash = mobHash; //READ for(uint i = 0; i < 3; i++){ uint _tokenId = _getMobTokenId(i); //READ x 3 if(_tokenId != MOB_OFFSET){ emit Transfer(getMobOwner(i,_mobHash),address(0),_tokenId); //READx3, EMIT x 3 max } } } /// Update Mobs Finish /// @notice Internal - Calculates mob owners and emits events sending to them. Second part of mobs moving function updateMobFinish() internal { if(!mobReleased) { require(gasleft() > 100000,"gas failsafe"); return; } if(mobTokenIds[3] == 0) return; require(gasleft() > 64500,"gas failsafe"); bytes32 _mobHash = mobHash; //READ uint eliminationBlock = block.number - (block.number % 245) - 10; //READ bytes32 updateHash = extractBytes(keccak256(abi.encodePacked(_mobHash)),0); bytes32 mobModulo0 = extractBytes(_mobHash,1); bytes32 mobModulo1 = extractBytes(_mobHash,2); bytes32 mobModulo2 = extractBytes(_mobHash,3); bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4); bytes32 newMobHash = shiftBytes(updateHash,0) ^ shiftBytes(mobModulo0,1) ^ shiftBytes(mobModulo1,2) ^ shiftBytes(mobModulo2,3) ^ shiftBytes(destinationHash,4); mobHash = newMobHash; //WRITE for(uint i = 0; i < 3; i++){ uint _tokenId = _getMobTokenId(i); //READ x 3 if(_tokenId != MOB_OFFSET){ emit Transfer(address(0),getMobOwner(i,newMobHash),_tokenId); //READx3, EMIT x 3 max } } } /// Update Catch Mob /// @notice Catch a mob that's in your wallet /// @param _mobIndex Index of mob to catch /// @dev Mints real token and updates mobs function catchMob(uint _mobIndex) public { IGBATrapsPartial(trapContract).useTrap(msg.sender); require(_mobIndex < 3,"mobIndex"); bytes32 _mobHash = mobHash; address mobOwner = getMobOwner(_mobIndex,_mobHash); require(msg.sender == mobOwner,"owner"); updateMobStart(); //Kill all mobs bytes32 updateHash = extractBytes(_mobHash,0); bytes32[3] memory mobModulo; for(uint i = 0; i < 3; i++){ mobModulo[i] = extractBytes(_mobHash,i + 1); } uint mobTokenId = _getMobTokenId(_mobIndex); //READ //Mint real one _mint(msg.sender,mobTokenId+MOB_OFFSET); bool mintNewMob = true; if(mobTokenIds[3] < TOTAL_MOB_COUNT){ mobTokenIds[_mobIndex] = ++mobTokenIds[3]; }else{ mintNewMob = false; //if final 3 mobTokenIds[3]++; mobTokenIds[_mobIndex] = 0; if(mobTokenIds[3] == TOTAL_MOB_COUNT + 3){ //if final mob, clear last slot to identify end condition delete mobTokenIds[3]; } } mobModulo[_mobIndex] = bytes32(tokens.length); uint eliminationBlock = block.number - (block.number % 245) - 10; //READ bytes32 destinationHash = extractBytes( blockhash(eliminationBlock),4); mobHash = shiftBytes(updateHash,0) ^ //WRITE shiftBytes(mobModulo[0],1) ^ shiftBytes(mobModulo[1],2) ^ shiftBytes(mobModulo[2],3) ^ shiftBytes(destinationHash,4); updateMobFinish(); //release mobs } /// Mint (internal) /// @notice Mints real tokens as per ERC721 /// @param _to Address to mint it for /// @param _tokenId Token to mint function _mint(address _to,uint _tokenId) internal{ emit Transfer(address(0), _to, _tokenId); owners[_tokenId] =_to; balances[_to]++; tokens.push(_tokenId); } /// Is Valid Token (internal) /// @notice Checks if given tokenId exists (Doesn't apply to mobs) /// @param _tokenId TokenId to check function isValidToken(uint256 _tokenId) internal view returns(bool){ return owners[_tokenId] != address(0); } /// Require Valid (internal) /// @notice Reverts if given token doesn't exist function requireValid(uint _tokenId) internal view{ require(isValidToken(_tokenId),"valid"); } /// Balance Of /// @notice ERC721 balanceOf func, includes active mobs function balanceOf(address _owner) external override view returns (uint256){ uint _balance = balances[_owner]; bytes32 _mobHash = mobHash; for(uint i = 0; i < 3; i++){ if(getMobOwner(i, _mobHash) == _owner){ _balance++; } } return _balance; } /// Owner Of /// @notice ERC721 ownerOf func, includes active mobs function ownerOf(uint256 _tokenId) public override view returns(address){ bytes32 _mobHash = mobHash; for(uint i = 0; i < 3; i++){ if(_getMobTokenId(i) == _tokenId){ address owner = getMobOwner(i,_mobHash); require(owner != address(0),"invalid"); return owner; } } requireValid(_tokenId); return owners[_tokenId]; } /// Approve /// @notice ERC721 function function approve(address _approved, uint256 _tokenId) external override{ address _owner = owners[_tokenId]; require( _owner == msg.sender //Require Sender Owns Token || authorised[_owner][msg.sender] // or is approved for all. ,"permission"); emit Approval(_owner, _approved, _tokenId); allowance[_tokenId] = _approved; } /// Get Approved /// @notice ERC721 function function getApproved(uint256 _tokenId) external view override returns (address) { // require(isValidToken(_tokenId),"invalid"); requireValid(_tokenId); return allowance[_tokenId]; } /// Is Approved For All /// @notice ERC721 function function isApprovedForAll(address _owner, address _operator) external view override returns (bool) { return authorised[_owner][_operator]; } /// Set Approval For All /// @notice ERC721 function function setApprovalForAll(address _operator, bool _approved) external override { emit ApprovalForAll(msg.sender,_operator, _approved); authorised[msg.sender][_operator] = _approved; } /// Transfer From /// @notice ERC721 function /// @dev Fails for mobs function transferFrom(address _from, address _to, uint256 _tokenId) public override { requireValid(_tokenId); //Check Transferable //There is a token validity check in ownerOf address _owner = owners[_tokenId]; require ( _owner == msg.sender //Require sender owns token //Doing the two below manually instead of referring to the external methods saves gas || allowance[_tokenId] == msg.sender //or is approved for this token || authorised[_owner][msg.sender] //or is approved for all ,"permission"); require(_owner == _from,"owner"); require(_to != address(0),"zero"); updateMobStart(); emit Transfer(_from, _to, _tokenId); owners[_tokenId] =_to; balances[_from]--; balances[_to]++; //Reset approved if there is one if(allowance[_tokenId] != address(0)){ delete allowance[_tokenId]; } updateMobFinish(); } /// Safe Transfer From /// @notice ERC721 function /// @dev Fails for mobs function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public override { transferFrom(_from, _to, _tokenId); //Get size of "_to" address, if 0 it's a wallet uint32 size; assembly { size := extcodesize(_to) } if(size > 0){ IERC721TokenReceiver receiver = IERC721TokenReceiver(_to); require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")),"receiver"); } } /// Safe Transfer From /// @notice ERC721 function /// @dev Fails for mobs function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override { safeTransferFrom(_from,_to,_tokenId,""); } /// Name /// @notice ERC721 Metadata function /// @return _name Name of token function name() external pure override returns (string memory _name){ return "Ghostbusters: Afterlife Collectibles"; } /// Symbol /// @notice ERC721 Metadata function /// @return _symbol Symbol of token function symbol() external pure override returns (string memory _symbol){ return "GBAC"; } /// Token URI /// @notice ERC721 Metadata function (includes active mobs) /// @param _tokenId ID of token to check /// @return URI (string) function tokenURI(uint256 _tokenId) public view override returns (string memory) { ownerOf(_tokenId); //includes validity check return string(abi.encodePacked(__uriBase,toString(_tokenId),__uriSuffix)); } /// To String /// @notice Converts uint to string /// @param value uint to convert /// @return String function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } // ENUMERABLE FUNCTIONS (not actually needed for compliance but everyone likes totalSupply) function totalSupply() public view returns (uint256){ uint highestMob = mobTokenIds[3]; if(!mobReleased || highestMob == 0){ return tokens.length; }else if(highestMob < TOTAL_MOB_COUNT){ return tokens.length + 3; }else{ return tokens.length + 3 - (TOTAL_MOB_COUNT - highestMob); } } function supportsInterface(bytes4 interfaceID) external override view returns (bool){ return supportedInterfaces[interfaceID]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 /* is ERC165 */ { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface IERC721Enumerable /* is ERC721 */ { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface IERC721Metadata /* is ERC721 */ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string memory _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface IERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author Andrew Parker /// @title Ghost Busters: Afterlife Traps NFT contract partial interface /// @notice For viewer func, and also for MSP because Traps relies on OpenZepp and MSP uses pure 721 implementation. interface IGBATrapsPartial{ enum State { Paused, Whitelist, Public, Final} function useTrap(address owner) external; function tokensClaimed() external view returns(uint); function hasMinted(address minter) external view returns(bool); function saleStarted() external view returns(bool); function whitelistEndTime() external view returns(uint); function balanceOf(address _owner) external view returns (uint256); function mintState() external view returns(State); function countdown() external view returns(uint); function totalSupply() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * OpenZeppelin's Ownable, but without Context, because it saves about 500 bytes * and compiled contract is pushing limits of Spurious Dragon and is unnecessary. * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "onlyOwner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "zero"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; /// @author Andrew Parker /// @title GBA Whitelist NFT Contract /// @notice Implementation of OpenZeppelin MerkleProof contract for GBA MiniStayPuft and Traps NFTs contract GBAWhitelist{ bytes32 merkleRoot; /// Constructor /// @param _merkleRoot root of merkle tree constructor(bytes32 _merkleRoot){ merkleRoot = _merkleRoot; } /// Is Whitelisted /// @notice Is a given address whitelisted based on proof provided /// @param proof Merkle proof /// @param claimer address to check /// @return Is whitelisted function isWhitelisted(bytes32[] memory proof, address claimer) public view returns(bool){ bytes32 leaf = keccak256(abi.encodePacked(claimer)); return MerkleProof.verify(proof,merkleRoot,leaf); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uriBase","type":"string"},{"internalType":"string","name":"_uriSuffix","type":"string"},{"internalType":"address","name":"_trapContract","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"}],"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":true,"internalType":"address","name":"reservist","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_pause","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pauseTime","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reservist","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Reserve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mobIndex","type":"uint256"}],"name":"catchMob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reservist","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractState","outputs":[{"internalType":"uint256","name":"_tokenCount","type":"uint256"},{"internalType":"enum MiniStayPuft.Phase","name":"_phase","type":"uint8"},{"internalType":"uint256","name":"mobMax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mobIndex","type":"uint256"}],"name":"getMobTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numTokens","type":"uint16"}],"name":"mintGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"mintReserveState","outputs":[{"internalType":"uint8","name":"_whitelistReserveCount","type":"uint8"},{"internalType":"uint24","name":"blockNumber","type":"uint24"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseState","outputs":[{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_pauseTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"preReserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"releaseMob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_count","type":"uint16"}],"name":"reserve","outputs":[],"stateMutability":"payable","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":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriBase","type":"string"},{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600060146101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620068f8380380620068f883398181016040528101906200006d919062000665565b6200007e336200043960201b60201c565b6001601360006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160136000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601360006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600060048110620001b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506002600b60016004811062000215577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506003600b60026004811062000278577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506003600b600360048110620002db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600490805190602001906200039a9291906200052c565b508260059080519060200190620003b39291906200052c565b50620003ca6000801b6004620004fd60201b60201c565b620003e1600160001b6003620004fd60201b60201c565b620003f8600160001b6002620004fd60201b60201c565b6200040f600160001b6001620004fd60201b60201c565b620004256000801b6000620004fd60201b60201c565b18181818600d819055505050505062000996565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808260076200050f9190620007c3565b60206200051d919062000762565b90508084901b91505092915050565b8280546200053a9062000872565b90600052602060002090601f0160209004810192826200055e5760008555620005aa565b82601f106200057957805160ff1916838001178555620005aa565b82800160010185558215620005aa579182015b82811115620005a95782518255916020019190600101906200058c565b5b509050620005b99190620005bd565b5090565b5b80821115620005d8576000816000905550600101620005be565b5090565b6000620005f3620005ed846200072c565b62000703565b9050828152602081018484840111156200060c57600080fd5b620006198482856200083c565b509392505050565b60008151905062000632816200097c565b92915050565b600082601f8301126200064a57600080fd5b81516200065c848260208601620005dc565b91505092915050565b600080600080608085870312156200067c57600080fd5b600085015167ffffffffffffffff8111156200069757600080fd5b620006a58782880162000638565b945050602085015167ffffffffffffffff811115620006c357600080fd5b620006d18782880162000638565b9350506040620006e48782880162000621565b9250506060620006f78782880162000621565b91505092959194509250565b60006200070f62000722565b90506200071d8282620008a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200074a57620007496200093c565b5b62000755826200096b565b9050602081019050919050565b60006200076f8262000832565b91506200077c8362000832565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007b857620007b7620008de565b5b828202905092915050565b6000620007d08262000832565b9150620007dd8362000832565b925082821015620007f357620007f2620008de565b5b828203905092915050565b60006200080b8262000812565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200085c5780820151818401526020810190506200083f565b838111156200086c576000848401525b50505050565b600060028204905060018216806200088b57607f821691505b60208210811415620008a257620008a16200090d565b5b50919050565b620008b3826200096b565b810181811067ffffffffffffffff82111715620008d557620008d46200093c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200098781620007fe565b81146200099357600080fd5b50565b615f5280620009a66000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063d711835111610064578063d711835114610667578063e985e9c514610694578063f2fde38b146106d1578063f67e4a6e146106fa576101e3565b8063b88d4fde146105c1578063c4ae3168146105ea578063c87b56dd14610601578063d00c00ee1461063e576101e3565b806395d89b41116100d157806395d89b4114610528578063a0712d6814610553578063a22cb4651461056f578063aad3ec9614610598576101e3565b8063715018a6146104a257806385209ee0146104b9578063853828b6146104e65780638da5cb5b146104fd576101e3565b80633638a2061161017a5780636352211e116101495780636352211e146103e8578063661df7e91461042557806367cce2b11461043c57806370a0823114610465576101e3565b80633638a2061461034f57806342842e0e1461036b578063584f969a1461039457806361ae5299146103ab576101e3565b80631789e2d8116101b65780631789e2d8146102b657806318160ddd146102df5780631f0808d41461030a57806323b872dd14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906146a5565b610739565b60405161021c9190614f3a565b60405180910390f35b34801561023157600080fd5b5061023a6107a1565b6040516102479190614f8c565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061478c565b6107c1565b6040516102849190614ea3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906145ec565b610807565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906146f7565b6109f0565b005b3480156102eb57600080fd5b506102f4610a97565b604051610301919061530e565b60405180910390f35b610324600480360381019061031f9190614763565b610b81565b005b34801561033257600080fd5b5061034d600480360381019061034891906144e6565b610dae565b005b61036960048036038101906103649190614628565b611240565b005b34801561037757600080fd5b50610392600480360381019061038d91906144e6565b611626565b005b3480156103a057600080fd5b506103a9611646565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061478c565b6116f6565b6040516103df919061530e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a919061478c565b611753565b60405161041c9190614ea3565b60405180910390f35b34801561043157600080fd5b5061043a61185a565b005b34801561044857600080fd5b50610463600480360381019061045e9190614763565b611ae4565b005b34801561047157600080fd5b5061048c60048036038101906104879190614481565b611ccb565b604051610499919061530e565b60405180910390f35b3480156104ae57600080fd5b506104b7611d8d565b005b3480156104c557600080fd5b506104ce611e0e565b6040516104dd93929190615329565b60405180910390f35b3480156104f257600080fd5b506104fb611e9a565b005b34801561050957600080fd5b50610512611f4f565b60405161051f9190614ea3565b60405180910390f35b34801561053457600080fd5b5061053d611f78565b60405161054a9190614f8c565b60405180910390f35b61056d6004803603810190610568919061478c565b611fb5565b005b34801561057b57600080fd5b50610596600480360381019061059191906145b0565b6121f0565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906145ec565b6122ed565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614535565b61269d565b005b3480156105f657600080fd5b506105ff6127fb565b005b34801561060d57600080fd5b506106286004803603810190610623919061478c565b6129ec565b6040516106359190614f8c565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061478c565b612a2d565b005b34801561067357600080fd5b5061067c6130c5565b60405161068b93929190614f55565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b691906144aa565b6130ea565b6040516106c89190614f3a565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614481565b61317e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614481565b61326f565b60405161073093929190615360565b60405180910390f35b600060136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060604051806060016040528060248152602001615ef960249139905090565b60006107cc826133dc565b600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108ff5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061506e565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a482600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a0f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061528e565b60405180910390fd5b8160049080519060200190610a7b929190614199565b508060059080519060200190610a92929190614199565b505050565b600080600b600360048110610ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff169050600c60009054906101000a900460ff161580610b115750600081145b15610b2457601280549050915050610b7e565b6101f461ffff16811015610b4c576003601280549050610b449190615553565b915050610b7e565b806101f461ffff16610b5e919061566b565b6003601280549050610b709190615553565b610b7a919061566b565b9150505b90565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be69061524e565b60405180910390fd5b600060149054906101000a900460ff1615610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c369061526e565b60405180910390fd5b60026003811115610c79577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610c81613427565b6003811115610cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf0906152ce565b60405180910390fd5b600a61ffff168161ffff161115610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c906151ae565b60405180910390fd5b67011c37937e0800008161ffff16610d5d9190615611565b341015610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061516e565b60405180910390fd5b610dab813360006134bc565b50565b610db7816133dc565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e8757503373ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610f185750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9061506e565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90614fae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061502e565b60405180910390fd5b61103d6137d3565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826011600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061113a906157ae565b9190505550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118f90615866565b9190505550600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123257600f600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61123a6138fa565b50505050565b600060149054906101000a900460ff1615611290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112879061526e565b60405180910390fd5b600160038111156112ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6112d2613427565b600381111561130a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906152ce565b60405180910390fd5b8060ff1667011c37937e0800006113619190615611565b3410156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061508e565b60405180910390fd5b600260ff1681600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140091906155a9565b60ff161115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b9061518e565b60405180910390fd5b6107d08160ff166008546114589190615553565b10611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061500e565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663debefaa683336040518363ffffffff1660e01b81526004016114f5929190614f0a565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611545919061467c565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906150ce565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115df91906155a9565b92506101000a81548160ff021916908360ff1602179055508060ff166008600082825461160c9190615553565b925050819055506116228160ff163360016134bc565b5050565b6116418383836040518060200160405280600081525061269d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611665611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b29061528e565b60405180910390fd5b600060149054906101000a900460ff16156116d9576116d86127fb565b5b6001600060156101000a81548160ff021916908315150217905550565b60008061170283613b92565b9050620186a081141561174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061512e565b60405180910390fd5b80915050919050565b600080600d54905060005b6003811015611813578361177182613b92565b14156118005760006117838284613c01565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec906152ee565b60405180910390fd5b809350505050611855565b808061180b90615866565b91505061175e565b5061181d836133dc565b6011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611879611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061528e565b60405180910390fd5b600c60009054906101000a900460ff161561191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906150ae565b60405180910390fd5b600060128054905011611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e9061504e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600d5490506000600a60f54361199a91906158c3565b436119a5919061566b565b6119af919061566b565b905060006119e4836040516020016119c79190614e1a565b604051602081830303815290604052805190602001206000613d1e565b9050600060128054905060001b90506000611a0184406004613d1e565b90506000611a10826004613d61565b611a1b846003613d61565b611a26856002613d61565b611a31866001613d61565b611a3c886000613d61565b18181818905060005b6003811015611ad4576000611a5982613b92565b905080611a668385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4508080611acc90615866565b915050611a45565b5080600d81905550505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b03611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061528e565b60405180910390fd5b60c861ffff1681600360029054906101000a900461ffff16611b7b919061551b565b61ffff161115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906152ae565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16611be3919061551b565b61ffff161115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f906151ee565b60405180910390fd5b60005b8161ffff16811015611cc7576003600281819054906101000a900461ffff1680929190611c579061583b565b91906101000a81548161ffff021916908361ffff16021790555050611cb4336003600081819054906101000a900461ffff16611c929061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b8080611cbf90615866565b915050611c2b565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d54905060005b6003811015611d82578473ffffffffffffffffffffffffffffffffffffffff16611d448284613c01565b73ffffffffffffffffffffffffffffffffffffffff161415611d6f578280611d6b90615866565b9350505b8080611d7a90615866565b915050611d1a565b508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611dac611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061528e565b60405180910390fd5b611e0c6000613ebc565b565b6000806000600360009054906101000a900461ffff16611e2c613427565b600b600360048110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff168261ffff1692508061ffff169050925092509250909192565b3373ffffffffffffffffffffffffffffffffffffffff16611eb9611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f069061528e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d57600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4742414300000000000000000000000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff1615612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9061526e565b60405180910390fd5b60038081111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612046613427565b600381111561207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906152ce565b60405180910390fd5b67011c37937e080000816120d29190615611565b341015612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906151ce565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16612137919061551b565b61ffff16111561217c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612173906151ee565b60405180910390fd5b60005b818110156121dc576121c9336003600081819054906101000a900461ffff166121a79061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b80806121d490615866565b91505061217f565b506121e56137d3565b6121ed6138fa565b50565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161224d9190614f3a565b60405180910390a380601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060149054906101000a900460ff161561233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061526e565b60405180910390fd5b600380811115612376577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61237e613427565b60038111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906152ce565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050101561247e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612475906150ee565b60405180910390fd5b60005b81811015612688576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054905061251f919061566b565b81548110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff021916905590556126308482613d8c565b808473ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d460405160405180910390a350808061268090615866565b915050612481565b506126916137d3565b6126996138fa565b5050565b6126a8848484610dae565b6000833b905060008163ffffffff1611156127f45760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016127419493929190614ebe565b602060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279391906146ce565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e99061510e565b60405180910390fd5b505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661281a611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061528e565b60405180910390fd5b600060015414156128e1574260018190555060008060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e41580071260006001546002546040516128d493929190614f55565b60405180910390a16129ea565b600060159054906101000a900460ff1615612931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129289061522e565b60405180910390fd5b60008060149054906101000a900460ff161590508015612957574260028190555061298f565b60006002541461298e576002544261296f919061566b565b600160008282546129809190615553565b925050819055506002600090555b5b80600060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e415800712816001546002546040516129e093929190614f55565b60405180910390a1505b565b60606129f782611753565b506004612a0383613f80565b6005604051602001612a1793929190614e72565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355cc5186336040518263ffffffff1660e01b8152600401612a889190614ea3565b600060405180830381600087803b158015612aa257600080fd5b505af1158015612ab6573d6000803e3d6000fd5b5050505060038110612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614fce565b60405180910390fd5b6000600d5490506000612b108383613c01565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614fae565b60405180910390fd5b612b886137d3565b6000612b95836000613d1e565b9050612b9f61421f565b60005b6003811015612c1657612bc185600183612bbc9190615553565b613d1e565b828260038110612bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612c0e90615866565b915050612ba2565b506000612c2286613b92565b9050612c3c33620186a083612c379190615553565b613d8c565b6000600190506101f461ffff16600b600360048110612c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161015612d8557600b600360048110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff16612d089061583b565b91906101000a81548161ffff021916908361ffff1602179055600b8860048110612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612f34565b60009050600b600360048110612dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff1680929190612ded9061583b565b91906101000a81548161ffff021916908361ffff160217905550506000600b8860048110612e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060036101f4612e78919061551b565b61ffff16600b600360048110612eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161415612f3357600b600360048110612f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81549061ffff02191690555b5b60128054905060001b838860038110612f76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250506000600a60f543612f9091906158c3565b43612f9b919061566b565b612fa5919061566b565b90506000612fb582406004613d1e565b9050612fc2816004613d61565b61300b86600260038110612fff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003613d61565b61305487600160038110613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516002613d61565b61309d88600060038110613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516001613d61565b6130a88a6000613d61565b18181818600d819055506130ba6138fa565b505050505050505050565b60008060008060149054906101000a900460ff16600154600254925092509250909192565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661319d611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061528e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a9061502e565b60405180910390fd5b61326c81613ebc565b50565b6000806060600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054806020026020016040519081016040528092919081815260200182805480156133c857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161338f5790505b505050505090509250925092509193909250565b6133e58161412d565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061520e565b60405180910390fd5b50565b600080600154905060008114156134425760009150506134b9565b611c20816134509190615553565b42116134605760019150506134b9565b62015180611c20826134729190615553565b61347c9190615553565b42111580156134a4575061271061ffff16600360009054906101000a900461ffff1661ffff16105b156134b35760029150506134b9565b60039150505b90565b61271061ffff1683600360009054906101000a900461ffff166134df919061551b565b61ffff161115613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351b906151ee565b60405180910390fd5b808061358657506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16145b806135f35750600a600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff166135ef9190615553565b4310155b613632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136299061514e565b60405180910390fd5b60005b8361ffff168161ffff16101561376e57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016003600081819054906101000a900461ffff166136a39061583b565b91906101000a81548161ffff021916908361ffff160217905590806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600360009054906101000a900461ffff1661ffff168373ffffffffffffffffffffffffffffffffffffffff167f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c160405160405180910390a380806137669061583b565b915050613635565b5043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548162ffffff021916908362ffffff160217905550505050565b600c60009054906101000a900460ff16158061384757506000600b600360048110613827577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16145b15613851576138f8565b6000600d54905060005b60038110156138f557600061386f82613b92565b9050620186a081146138e15780600073ffffffffffffffffffffffffffffffffffffffff1661389e8486613c01565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5080806138ed90615866565b91505061385b565b50505b565b600c60009054906101000a900460ff1661395857620186a05a11613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394a90614fee565b60405180910390fd5b613b90565b6000600b600360048110613995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1614156139be57613b90565b61fbf45a11613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f990614fee565b60405180910390fd5b6000600d5490506000600a60f543613a1a91906158c3565b43613a25919061566b565b613a2f919061566b565b90506000613a6483604051602001613a479190614e1a565b604051602081830303815290604052805190602001206000613d1e565b90506000613a73846001613d1e565b90506000613a82856002613d1e565b90506000613a91866003613d1e565b90506000613aa186406004613d1e565b90506000613ab0826004613d61565b613abb846003613d61565b613ac6866002613d61565b613ad1886001613d61565b613adc8a6000613d61565b18181818905080600d8190555060005b6003811015613b86576000613b0082613b92565b9050620186a08114613b725780613b178385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b508080613b7e90615866565b915050613aec565b5050505050505050505b565b6000600b8260048110613bce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16620186a0613bfa9190615553565b9050919050565b600080613c1a83600186613c159190615553565b613d1e565b90506000613c29846004613d1e565b90506000818684604051602001613c4293929190614e35565b6040516020818303038152906040528051906020012060001c905060008360001c82613c6e91906158c3565b905060006011600060128481548110613cb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60009054906101000a900460ff1615613d0e578095505050505050613d18565b6000955050505050505b92915050565b600080826007613d2e919061566b565b6020613d3a9190615611565b90506000836020613d4b9190615611565b905081818287901b901c901c9250505092915050565b600080826007613d71919061566b565b6020613d7d9190615611565b90508084901b91505092915050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4816011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190613e8a90615866565b919050555060128190806001815401808255809150506001900390600052602060002001600090919091909150555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415613fc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614128565b600082905060005b60008214613ffa578080613fe390615866565b915050600a82613ff391906155e0565b9150613fd0565b60008167ffffffffffffffff81111561403c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561406e5781602001600182028036833780820191505090505b5090505b6000851461412157600182614087919061566b565b9150600a8561409691906158c3565b60306140a29190615553565b60f81b8183815181106140de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561411a91906155e0565b9450614072565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8280546141a5906157d8565b90600052602060002090601f0160209004810192826141c7576000855561420e565b82601f106141e057805160ff191683800117855561420e565b8280016001018555821561420e579182015b8281111561420d5782518255916020019190600101906141f2565b5b50905061421b9190614241565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5b8082111561425a576000816000905550600101614242565b5090565b600061427161426c846153c3565b61539e565b9050808382526020820190508285602086028201111561429057600080fd5b60005b858110156142c057816142a688826143af565b845260208401935060208301925050600181019050614293565b5050509392505050565b60006142dd6142d8846153ef565b61539e565b9050828152602081018484840111156142f557600080fd5b61430084828561576c565b509392505050565b600061431b61431684615420565b61539e565b90508281526020810184848401111561433357600080fd5b61433e84828561576c565b509392505050565b60008135905061435581615e57565b92915050565b600082601f83011261436c57600080fd5b813561437c84826020860161425e565b91505092915050565b60008135905061439481615e6e565b92915050565b6000815190506143a981615e6e565b92915050565b6000813590506143be81615e85565b92915050565b6000813590506143d381615e9c565b92915050565b6000815190506143e881615e9c565b92915050565b600082601f8301126143ff57600080fd5b813561440f8482602086016142ca565b91505092915050565b600082601f83011261442957600080fd5b8135614439848260208601614308565b91505092915050565b60008135905061445181615eb3565b92915050565b60008135905061446681615eca565b92915050565b60008135905061447b81615ee1565b92915050565b60006020828403121561449357600080fd5b60006144a184828501614346565b91505092915050565b600080604083850312156144bd57600080fd5b60006144cb85828601614346565b92505060206144dc85828601614346565b9150509250929050565b6000806000606084860312156144fb57600080fd5b600061450986828701614346565b935050602061451a86828701614346565b925050604061452b86828701614457565b9150509250925092565b6000806000806080858703121561454b57600080fd5b600061455987828801614346565b945050602061456a87828801614346565b935050604061457b87828801614457565b925050606085013567ffffffffffffffff81111561459857600080fd5b6145a4878288016143ee565b91505092959194509250565b600080604083850312156145c357600080fd5b60006145d185828601614346565b92505060206145e285828601614385565b9150509250929050565b600080604083850312156145ff57600080fd5b600061460d85828601614346565b925050602061461e85828601614457565b9150509250929050565b6000806040838503121561463b57600080fd5b600083013567ffffffffffffffff81111561465557600080fd5b6146618582860161435b565b92505060206146728582860161446c565b9150509250929050565b60006020828403121561468e57600080fd5b600061469c8482850161439a565b91505092915050565b6000602082840312156146b757600080fd5b60006146c5848285016143c4565b91505092915050565b6000602082840312156146e057600080fd5b60006146ee848285016143d9565b91505092915050565b6000806040838503121561470a57600080fd5b600083013567ffffffffffffffff81111561472457600080fd5b61473085828601614418565b925050602083013567ffffffffffffffff81111561474d57600080fd5b61475985828601614418565b9150509250929050565b60006020828403121561477557600080fd5b600061478384828501614442565b91505092915050565b60006020828403121561479e57600080fd5b60006147ac84828501614457565b91505092915050565b60006147c183836148bf565b60208301905092915050565b60006147d98383614dc7565b60208301905092915050565b6147ee8161569f565b82525050565b60006147ff82615486565b61480981856154cc565b935061481483615451565b8060005b8381101561484557815161482c88826147b5565b9750614837836154b2565b925050600181019050614818565b5085935050505092915050565b600061485d82615491565b61486781856154dd565b935061487283615461565b8060005b838110156148a357815161488a88826147cd565b9750614895836154bf565b925050600181019050614876565b5085935050505092915050565b6148b9816156b1565b82525050565b6148c8816156bd565b82525050565b6148df6148da826156bd565b6158af565b82525050565b60006148f08261549c565b6148fa81856154ee565b935061490a81856020860161577b565b614913816159df565b840191505092915050565b6149278161575a565b82525050565b6000614938826154a7565b61494281856154ff565b935061495281856020860161577b565b61495b816159df565b840191505092915050565b6000614971826154a7565b61497b8185615510565b935061498b81856020860161577b565b80840191505092915050565b600081546149a4816157d8565b6149ae8186615510565b945060018216600081146149c957600181146149da57614a0d565b60ff19831686528186019350614a0d565b6149e385615471565b60005b83811015614a05578154818901526001820191506020810190506149e6565b838801955050505b50505092915050565b6000614a236005836154ff565b9150614a2e826159f0565b602082019050919050565b6000614a466008836154ff565b9150614a5182615a19565b602082019050919050565b6000614a69600c836154ff565b9150614a7482615a42565b602082019050919050565b6000614a8c600d836154ff565b9150614a9782615a6b565b602082019050919050565b6000614aaf6004836154ff565b9150614aba82615a94565b602082019050919050565b6000614ad26007836154ff565b9150614add82615abd565b602082019050919050565b6000614af5600a836154ff565b9150614b0082615ae6565b602082019050919050565b6000614b18600a836154ff565b9150614b2382615b0f565b602082019050919050565b6000614b3b6008836154ff565b9150614b4682615b38565b602082019050919050565b6000614b5e6009836154ff565b9150614b6982615b61565b602082019050919050565b6000614b816006836154ff565b9150614b8c82615b8a565b602082019050919050565b6000614ba46008836154ff565b9150614baf82615bb3565b602082019050919050565b6000614bc76008836154ff565b9150614bd282615bdc565b602082019050919050565b6000614bea6008836154ff565b9150614bf582615c05565b602082019050919050565b6000614c0d600a836154ff565b9150614c1882615c2e565b602082019050919050565b6000614c306015836154ff565b9150614c3b82615c57565b602082019050919050565b6000614c536011836154ff565b9150614c5e82615c80565b602082019050919050565b6000614c766005836154ff565b9150614c8182615ca9565b602082019050919050565b6000614c996008836154ff565b9150614ca482615cd2565b602082019050919050565b6000614cbc6005836154ff565b9150614cc782615cfb565b602082019050919050565b6000614cdf600a836154ff565b9150614cea82615d24565b602082019050919050565b6000614d026006836154ff565b9150614d0d82615d4d565b602082019050919050565b6000614d256006836154ff565b9150614d3082615d76565b602082019050919050565b6000614d486009836154ff565b9150614d5382615d9f565b602082019050919050565b6000614d6b600b836154ff565b9150614d7682615dc8565b602082019050919050565b6000614d8e6005836154ff565b9150614d9982615df1565b602082019050919050565b6000614db16007836154ff565b9150614dbc82615e1a565b602082019050919050565b614dd081615706565b82525050565b614ddf81615734565b82525050565b614dee81615743565b82525050565b614e05614e0082615743565b6158b9565b82525050565b614e148161574d565b82525050565b6000614e2682846148ce565b60208201915081905092915050565b6000614e4182866148ce565b602082019150614e518285614df4565b602082019150614e6182846148ce565b602082019150819050949350505050565b6000614e7e8286614997565b9150614e8a8285614966565b9150614e968284614997565b9150819050949350505050565b6000602082019050614eb860008301846147e5565b92915050565b6000608082019050614ed360008301876147e5565b614ee060208301866147e5565b614eed6040830185614de5565b8181036060830152614eff81846148e5565b905095945050505050565b60006040820190508181036000830152614f2481856147f4565b9050614f3360208301846147e5565b9392505050565b6000602082019050614f4f60008301846148b0565b92915050565b6000606082019050614f6a60008301866148b0565b614f776020830185614de5565b614f846040830184614de5565b949350505050565b60006020820190508181036000830152614fa6818461492d565b905092915050565b60006020820190508181036000830152614fc781614a16565b9050919050565b60006020820190508181036000830152614fe781614a39565b9050919050565b6000602082019050818103600083015261500781614a5c565b9050919050565b6000602082019050818103600083015261502781614a7f565b9050919050565b6000602082019050818103600083015261504781614aa2565b9050919050565b6000602082019050818103600083015261506781614ac5565b9050919050565b6000602082019050818103600083015261508781614ae8565b9050919050565b600060208201905081810360008301526150a781614b0b565b9050919050565b600060208201905081810360008301526150c781614b2e565b9050919050565b600060208201905081810360008301526150e781614b51565b9050919050565b6000602082019050818103600083015261510781614b74565b9050919050565b6000602082019050818103600083015261512781614b97565b9050919050565b6000602082019050818103600083015261514781614bba565b9050919050565b6000602082019050818103600083015261516781614bdd565b9050919050565b6000602082019050818103600083015261518781614c00565b9050919050565b600060208201905081810360008301526151a781614c23565b9050919050565b600060208201905081810360008301526151c781614c46565b9050919050565b600060208201905081810360008301526151e781614c69565b9050919050565b6000602082019050818103600083015261520781614c8c565b9050919050565b6000602082019050818103600083015261522781614caf565b9050919050565b6000602082019050818103600083015261524781614cd2565b9050919050565b6000602082019050818103600083015261526781614cf5565b9050919050565b6000602082019050818103600083015261528781614d18565b9050919050565b600060208201905081810360008301526152a781614d3b565b9050919050565b600060208201905081810360008301526152c781614d5e565b9050919050565b600060208201905081810360008301526152e781614d81565b9050919050565b6000602082019050818103600083015261530781614da4565b9050919050565b60006020820190506153236000830184614de5565b92915050565b600060608201905061533e6000830186614de5565b61534b602083018561491e565b6153586040830184614de5565b949350505050565b60006060820190506153756000830186614e0b565b6153826020830185614dd6565b81810360408301526153948184614852565b9050949350505050565b60006153a86153b9565b90506153b4828261580a565b919050565b6000604051905090565b600067ffffffffffffffff8211156153de576153dd6159b0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561540a576154096159b0565b5b615413826159df565b9050602081019050919050565b600067ffffffffffffffff82111561543b5761543a6159b0565b5b615444826159df565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061552682615706565b915061553183615706565b92508261ffff03821115615548576155476158f4565b5b828201905092915050565b600061555e82615743565b915061556983615743565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561559e5761559d6158f4565b5b828201905092915050565b60006155b48261574d565b91506155bf8361574d565b92508260ff038211156155d5576155d46158f4565b5b828201905092915050565b60006155eb82615743565b91506155f683615743565b92508261560657615605615923565b5b828204905092915050565b600061561c82615743565b915061562783615743565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156605761565f6158f4565b5b828202905092915050565b600061567682615743565b915061568183615743565b925082821015615694576156936158f4565b5b828203905092915050565b60006156aa82615714565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061570182615e43565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615765826156f3565b9050919050565b82818337600083830152505050565b60005b8381101561579957808201518184015260208101905061577e565b838111156157a8576000848401525b50505050565b60006157b982615743565b915060008214156157cd576157cc6158f4565b5b600182039050919050565b600060028204905060018216806157f057607f821691505b6020821081141561580457615803615981565b5b50919050565b615813826159df565b810181811067ffffffffffffffff82111715615832576158316159b0565b5b80604052505050565b600061584682615706565b915061ffff82141561585b5761585a6158f4565b5b600182019050919050565b600061587182615743565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158a4576158a36158f4565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006158ce82615743565b91506158d983615743565b9250826158e9576158e8615923565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f6d6f62496e646578000000000000000000000000000000000000000000000000600082015250565b7f676173206661696c736166650000000000000000000000000000000000000000600082015250565b7f50524553414c455f4c494d495400000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f206d696e7400000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f50524943455f4d494e5400000000000000000000000000000000000000000000600082015250565b7f72656c6561736564000000000000000000000000000000000000000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f5f636f756e740000000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f6e6f20746f6b656e000000000000000000000000000000000000000000000000600082015250565b7f434f4f4c444f574e000000000000000000000000000000000000000000000000600082015250565b7f5052494345204d494e5400000000000000000000000000000000000000000000600082015250565b7f77686974656c69737452657365727665436f756e740000000000000000000000600082015250565b7f5452414e53414354494f4e5f4c494d4954000000000000000000000000000000600082015250565b7f5052494345000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f4d4158000000000000000000000000000000000000000000000000600082015250565b7f76616c6964000000000000000000000000000000000000000000000000000000600082015250565b7f756e7061757361626c6500000000000000000000000000000000000000000000600082015250565b7f6f726967696e0000000000000000000000000000000000000000000000000000600082015250565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c794f776e65720000000000000000000000000000000000000000000000600082015250565b7f746f6b656e73476976656e000000000000000000000000000000000000000000600082015250565b7f7068617365000000000000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615e5457615e53615952565b5b50565b615e608161569f565b8114615e6b57600080fd5b50565b615e77816156b1565b8114615e8257600080fd5b50565b615e8e816156bd565b8114615e9957600080fd5b50565b615ea5816156c7565b8114615eb057600080fd5b50565b615ebc81615706565b8114615ec757600080fd5b50565b615ed381615743565b8114615ede57600080fd5b50565b615eea8161574d565b8114615ef557600080fd5b5056fe47686f7374627573746572733a2041667465726c69666520436f6c6c65637469626c6573a264697066735822122013af6d30c9c26238f72ede5380ce35fc56259be8874c53677dd0eded2eb5d56264736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440000000000000000000000000000000000000000000000000000000000000000c504c414345484f4c4445522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2f504c414345484f4c4445520000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063d711835111610064578063d711835114610667578063e985e9c514610694578063f2fde38b146106d1578063f67e4a6e146106fa576101e3565b8063b88d4fde146105c1578063c4ae3168146105ea578063c87b56dd14610601578063d00c00ee1461063e576101e3565b806395d89b41116100d157806395d89b4114610528578063a0712d6814610553578063a22cb4651461056f578063aad3ec9614610598576101e3565b8063715018a6146104a257806385209ee0146104b9578063853828b6146104e65780638da5cb5b146104fd576101e3565b80633638a2061161017a5780636352211e116101495780636352211e146103e8578063661df7e91461042557806367cce2b11461043c57806370a0823114610465576101e3565b80633638a2061461034f57806342842e0e1461036b578063584f969a1461039457806361ae5299146103ab576101e3565b80631789e2d8116101b65780631789e2d8146102b657806318160ddd146102df5780631f0808d41461030a57806323b872dd14610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906146a5565b610739565b60405161021c9190614f3a565b60405180910390f35b34801561023157600080fd5b5061023a6107a1565b6040516102479190614f8c565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061478c565b6107c1565b6040516102849190614ea3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906145ec565b610807565b005b3480156102c257600080fd5b506102dd60048036038101906102d891906146f7565b6109f0565b005b3480156102eb57600080fd5b506102f4610a97565b604051610301919061530e565b60405180910390f35b610324600480360381019061031f9190614763565b610b81565b005b34801561033257600080fd5b5061034d600480360381019061034891906144e6565b610dae565b005b61036960048036038101906103649190614628565b611240565b005b34801561037757600080fd5b50610392600480360381019061038d91906144e6565b611626565b005b3480156103a057600080fd5b506103a9611646565b005b3480156103b757600080fd5b506103d260048036038101906103cd919061478c565b6116f6565b6040516103df919061530e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a919061478c565b611753565b60405161041c9190614ea3565b60405180910390f35b34801561043157600080fd5b5061043a61185a565b005b34801561044857600080fd5b50610463600480360381019061045e9190614763565b611ae4565b005b34801561047157600080fd5b5061048c60048036038101906104879190614481565b611ccb565b604051610499919061530e565b60405180910390f35b3480156104ae57600080fd5b506104b7611d8d565b005b3480156104c557600080fd5b506104ce611e0e565b6040516104dd93929190615329565b60405180910390f35b3480156104f257600080fd5b506104fb611e9a565b005b34801561050957600080fd5b50610512611f4f565b60405161051f9190614ea3565b60405180910390f35b34801561053457600080fd5b5061053d611f78565b60405161054a9190614f8c565b60405180910390f35b61056d6004803603810190610568919061478c565b611fb5565b005b34801561057b57600080fd5b50610596600480360381019061059191906145b0565b6121f0565b005b3480156105a457600080fd5b506105bf60048036038101906105ba91906145ec565b6122ed565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190614535565b61269d565b005b3480156105f657600080fd5b506105ff6127fb565b005b34801561060d57600080fd5b506106286004803603810190610623919061478c565b6129ec565b6040516106359190614f8c565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061478c565b612a2d565b005b34801561067357600080fd5b5061067c6130c5565b60405161068b93929190614f55565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b691906144aa565b6130ea565b6040516106c89190614f3a565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614481565b61317e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614481565b61326f565b60405161073093929190615360565b60405180910390f35b600060136000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060604051806060016040528060248152602001615ef960249139905090565b60006107cc826133dc565b600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108ff5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61093e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109359061506e565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a482600f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a0f611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c9061528e565b60405180910390fd5b8160049080519060200190610a7b929190614199565b508060059080519060200190610a92929190614199565b505050565b600080600b600360048110610ad5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff169050600c60009054906101000a900460ff161580610b115750600081145b15610b2457601280549050915050610b7e565b6101f461ffff16811015610b4c576003601280549050610b449190615553565b915050610b7e565b806101f461ffff16610b5e919061566b565b6003601280549050610b709190615553565b610b7a919061566b565b9150505b90565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be69061524e565b60405180910390fd5b600060149054906101000a900460ff1615610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c369061526e565b60405180910390fd5b60026003811115610c79577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610c81613427565b6003811115610cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf0906152ce565b60405180910390fd5b600a61ffff168161ffff161115610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c906151ae565b60405180910390fd5b67011c37937e0800008161ffff16610d5d9190615611565b341015610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d969061516e565b60405180910390fd5b610dab813360006134bc565b50565b610db7816133dc565b60006011600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610e8757503373ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610f185750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e9061506e565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90614fae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061502e565b60405180910390fd5b61103d6137d3565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4826011600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061113a906157ae565b9190505550600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061118f90615866565b9190505550600073ffffffffffffffffffffffffffffffffffffffff16600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461123257600f600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b61123a6138fa565b50505050565b600060149054906101000a900460ff1615611290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112879061526e565b60405180910390fd5b600160038111156112ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6112d2613427565b600381111561130a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906152ce565b60405180910390fd5b8060ff1667011c37937e0800006113619190615611565b3410156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061508e565b60405180910390fd5b600260ff1681600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661140091906155a9565b60ff161115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b9061518e565b60405180910390fd5b6107d08160ff166008546114589190615553565b10611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f9061500e565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663debefaa683336040518363ffffffff1660e01b81526004016114f5929190614f0a565b60206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611545919061467c565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b906150ce565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166115df91906155a9565b92506101000a81548160ff021916908360ff1602179055508060ff166008600082825461160c9190615553565b925050819055506116228160ff163360016134bc565b5050565b6116418383836040518060200160405280600081525061269d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611665611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b29061528e565b60405180910390fd5b600060149054906101000a900460ff16156116d9576116d86127fb565b5b6001600060156101000a81548160ff021916908315150217905550565b60008061170283613b92565b9050620186a081141561174a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117419061512e565b60405180910390fd5b80915050919050565b600080600d54905060005b6003811015611813578361177182613b92565b14156118005760006117838284613c01565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec906152ee565b60405180910390fd5b809350505050611855565b808061180b90615866565b91505061175e565b5061181d836133dc565b6011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150505b919050565b3373ffffffffffffffffffffffffffffffffffffffff16611879611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c69061528e565b60405180910390fd5b600c60009054906101000a900460ff161561191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906150ae565b60405180910390fd5b600060128054905011611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e9061504e565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600d5490506000600a60f54361199a91906158c3565b436119a5919061566b565b6119af919061566b565b905060006119e4836040516020016119c79190614e1a565b604051602081830303815290604052805190602001206000613d1e565b9050600060128054905060001b90506000611a0184406004613d1e565b90506000611a10826004613d61565b611a1b846003613d61565b611a26856002613d61565b611a31866001613d61565b611a3c886000613d61565b18181818905060005b6003811015611ad4576000611a5982613b92565b905080611a668385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4508080611acc90615866565b915050611a45565b5080600d81905550505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b03611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b509061528e565b60405180910390fd5b60c861ffff1681600360029054906101000a900461ffff16611b7b919061551b565b61ffff161115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb7906152ae565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16611be3919061551b565b61ffff161115611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f906151ee565b60405180910390fd5b60005b8161ffff16811015611cc7576003600281819054906101000a900461ffff1680929190611c579061583b565b91906101000a81548161ffff021916908361ffff16021790555050611cb4336003600081819054906101000a900461ffff16611c929061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b8080611cbf90615866565b915050611c2b565b5050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600d54905060005b6003811015611d82578473ffffffffffffffffffffffffffffffffffffffff16611d448284613c01565b73ffffffffffffffffffffffffffffffffffffffff161415611d6f578280611d6b90615866565b9350505b8080611d7a90615866565b915050611d1a565b508192505050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611dac611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df99061528e565b60405180910390fd5b611e0c6000613ebc565b565b6000806000600360009054906101000a900461ffff16611e2c613427565b600b600360048110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff168261ffff1692508061ffff169050925092509250909192565b3373ffffffffffffffffffffffffffffffffffffffff16611eb9611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f069061528e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611f4d57600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4742414300000000000000000000000000000000000000000000000000000000815250905090565b600060149054906101000a900460ff1615612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9061526e565b60405180910390fd5b60038081111561203e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b612046613427565b600381111561207e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906152ce565b60405180910390fd5b67011c37937e080000816120d29190615611565b341015612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906151ce565b60405180910390fd5b61271061ffff1681600360009054906101000a900461ffff16612137919061551b565b61ffff16111561217c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612173906151ee565b60405180910390fd5b60005b818110156121dc576121c9336003600081819054906101000a900461ffff166121a79061583b565b91906101000a81548161ffff021916908361ffff160217905561ffff16613d8c565b80806121d490615866565b91505061217f565b506121e56137d3565b6121ed6138fa565b50565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161224d9190614f3a565b60405180910390a380601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060149054906101000a900460ff161561233d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123349061526e565b60405180910390fd5b600380811115612376577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61237e613427565b60038111156123b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906152ce565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180549050101561247e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612475906150ee565b60405180910390fd5b60005b81811015612688576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054905061251f919061566b565b81548110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806125f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002090601091828204019190066002026101000a81549061ffff021916905590556126308482613d8c565b808473ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d460405160405180910390a350808061268090615866565b915050612481565b506126916137d3565b6126996138fa565b5050565b6126a8848484610dae565b6000833b905060008163ffffffff1611156127f45760008490507f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663150b7a02338988886040518563ffffffff1660e01b81526004016127419493929190614ebe565b602060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279391906146ce565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e99061510e565b60405180910390fd5b505b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661281a611f4f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128679061528e565b60405180910390fd5b600060015414156128e1574260018190555060008060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e41580071260006001546002546040516128d493929190614f55565b60405180910390a16129ea565b600060159054906101000a900460ff1615612931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129289061522e565b60405180910390fd5b60008060149054906101000a900460ff161590508015612957574260028190555061298f565b60006002541461298e576002544261296f919061566b565b600160008282546129809190615553565b925050819055506002600090555b5b80600060146101000a81548160ff0219169083151502179055507f8408a369f8baeb88bf8ea365dcc7894594ee453d2e8f058c060538e415800712816001546002546040516129e093929190614f55565b60405180910390a1505b565b60606129f782611753565b506004612a0383613f80565b6005604051602001612a1793929190614e72565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355cc5186336040518263ffffffff1660e01b8152600401612a889190614ea3565b600060405180830381600087803b158015612aa257600080fd5b505af1158015612ab6573d6000803e3d6000fd5b5050505060038110612afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af490614fce565b60405180910390fd5b6000600d5490506000612b108383613c01565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614fae565b60405180910390fd5b612b886137d3565b6000612b95836000613d1e565b9050612b9f61421f565b60005b6003811015612c1657612bc185600183612bbc9190615553565b613d1e565b828260038110612bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612c0e90615866565b915050612ba2565b506000612c2286613b92565b9050612c3c33620186a083612c379190615553565b613d8c565b6000600190506101f461ffff16600b600360048110612c84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161015612d8557600b600360048110612ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff16612d089061583b565b91906101000a81548161ffff021916908361ffff1602179055600b8860048110612d5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550612f34565b60009050600b600360048110612dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6010918282040191900660020281819054906101000a900461ffff1680929190612ded9061583b565b91906101000a81548161ffff021916908361ffff160217905550506000600b8860048110612e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060036101f4612e78919061551b565b61ffff16600b600360048110612eb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff161415612f3357600b600360048110612f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002026101000a81549061ffff02191690555b5b60128054905060001b838860038110612f76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250506000600a60f543612f9091906158c3565b43612f9b919061566b565b612fa5919061566b565b90506000612fb582406004613d1e565b9050612fc2816004613d61565b61300b86600260038110612fff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003613d61565b61305487600160038110613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516002613d61565b61309d88600060038110613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516001613d61565b6130a88a6000613d61565b18181818600d819055506130ba6138fa565b505050505050505050565b60008060008060149054906101000a900460ff16600154600254925092509250909192565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661319d611f4f565b73ffffffffffffffffffffffffffffffffffffffff16146131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061528e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a9061502e565b60405180910390fd5b61326c81613ebc565b50565b6000806060600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054806020026020016040519081016040528092919081815260200182805480156133c857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161338f5790505b505050505090509250925092509193909250565b6133e58161412d565b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061520e565b60405180910390fd5b50565b600080600154905060008114156134425760009150506134b9565b611c20816134509190615553565b42116134605760019150506134b9565b62015180611c20826134729190615553565b61347c9190615553565b42111580156134a4575061271061ffff16600360009054906101000a900461ffff1661ffff16105b156134b35760029150506134b9565b60039150505b90565b61271061ffff1683600360009054906101000a900461ffff166134df919061551b565b61ffff161115613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351b906151ee565b60405180910390fd5b808061358657506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16145b806135f35750600a600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff166135ef9190615553565b4310155b613632576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136299061514e565b60405180910390fd5b60005b8361ffff168161ffff16101561376e57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016003600081819054906101000a900461ffff166136a39061583b565b91906101000a81548161ffff021916908361ffff160217905590806001815401808255809150506001900390600052602060002090601091828204019190066002029091909190916101000a81548161ffff021916908361ffff160217905550600360009054906101000a900461ffff1661ffff168373ffffffffffffffffffffffffffffffffffffffff167f61c8427ca14788cf50e420fe4b1e41be1ab20530a3f48bb547315dc91e62b9c160405160405180910390a380806137669061583b565b915050613635565b5043600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548162ffffff021916908362ffffff160217905550505050565b600c60009054906101000a900460ff16158061384757506000600b600360048110613827577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16145b15613851576138f8565b6000600d54905060005b60038110156138f557600061386f82613b92565b9050620186a081146138e15780600073ffffffffffffffffffffffffffffffffffffffff1661389e8486613c01565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5080806138ed90615866565b91505061385b565b50505b565b600c60009054906101000a900460ff1661395857620186a05a11613953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394a90614fee565b60405180910390fd5b613b90565b6000600b600360048110613995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff1614156139be57613b90565b61fbf45a11613a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f990614fee565b60405180910390fd5b6000600d5490506000600a60f543613a1a91906158c3565b43613a25919061566b565b613a2f919061566b565b90506000613a6483604051602001613a479190614e1a565b604051602081830303815290604052805190602001206000613d1e565b90506000613a73846001613d1e565b90506000613a82856002613d1e565b90506000613a91866003613d1e565b90506000613aa186406004613d1e565b90506000613ab0826004613d61565b613abb846003613d61565b613ac6866002613d61565b613ad1886001613d61565b613adc8a6000613d61565b18181818905080600d8190555060005b6003811015613b86576000613b0082613b92565b9050620186a08114613b725780613b178385613c01565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b508080613b7e90615866565b915050613aec565b5050505050505050505b565b6000600b8260048110613bce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16620186a0613bfa9190615553565b9050919050565b600080613c1a83600186613c159190615553565b613d1e565b90506000613c29846004613d1e565b90506000818684604051602001613c4293929190614e35565b6040516020818303038152906040528051906020012060001c905060008360001c82613c6e91906158c3565b905060006011600060128481548110613cb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60009054906101000a900460ff1615613d0e578095505050505050613d18565b6000955050505050505b92915050565b600080826007613d2e919061566b565b6020613d3a9190615611565b90506000836020613d4b9190615611565b905081818287901b901c901c9250505092915050565b600080826007613d71919061566b565b6020613d7d9190615611565b90508084901b91505092915050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4816011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190613e8a90615866565b919050555060128190806001815401808255809150506001900390600052602060002001600090919091909150555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415613fc8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614128565b600082905060005b60008214613ffa578080613fe390615866565b915050600a82613ff391906155e0565b9150613fd0565b60008167ffffffffffffffff81111561403c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561406e5781602001600182028036833780820191505090505b5090505b6000851461412157600182614087919061566b565b9150600a8561409691906158c3565b60306140a29190615553565b60f81b8183815181106140de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561411a91906155e0565b9450614072565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166011600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8280546141a5906157d8565b90600052602060002090601f0160209004810192826141c7576000855561420e565b82601f106141e057805160ff191683800117855561420e565b8280016001018555821561420e579182015b8281111561420d5782518255916020019190600101906141f2565b5b50905061421b9190614241565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5b8082111561425a576000816000905550600101614242565b5090565b600061427161426c846153c3565b61539e565b9050808382526020820190508285602086028201111561429057600080fd5b60005b858110156142c057816142a688826143af565b845260208401935060208301925050600181019050614293565b5050509392505050565b60006142dd6142d8846153ef565b61539e565b9050828152602081018484840111156142f557600080fd5b61430084828561576c565b509392505050565b600061431b61431684615420565b61539e565b90508281526020810184848401111561433357600080fd5b61433e84828561576c565b509392505050565b60008135905061435581615e57565b92915050565b600082601f83011261436c57600080fd5b813561437c84826020860161425e565b91505092915050565b60008135905061439481615e6e565b92915050565b6000815190506143a981615e6e565b92915050565b6000813590506143be81615e85565b92915050565b6000813590506143d381615e9c565b92915050565b6000815190506143e881615e9c565b92915050565b600082601f8301126143ff57600080fd5b813561440f8482602086016142ca565b91505092915050565b600082601f83011261442957600080fd5b8135614439848260208601614308565b91505092915050565b60008135905061445181615eb3565b92915050565b60008135905061446681615eca565b92915050565b60008135905061447b81615ee1565b92915050565b60006020828403121561449357600080fd5b60006144a184828501614346565b91505092915050565b600080604083850312156144bd57600080fd5b60006144cb85828601614346565b92505060206144dc85828601614346565b9150509250929050565b6000806000606084860312156144fb57600080fd5b600061450986828701614346565b935050602061451a86828701614346565b925050604061452b86828701614457565b9150509250925092565b6000806000806080858703121561454b57600080fd5b600061455987828801614346565b945050602061456a87828801614346565b935050604061457b87828801614457565b925050606085013567ffffffffffffffff81111561459857600080fd5b6145a4878288016143ee565b91505092959194509250565b600080604083850312156145c357600080fd5b60006145d185828601614346565b92505060206145e285828601614385565b9150509250929050565b600080604083850312156145ff57600080fd5b600061460d85828601614346565b925050602061461e85828601614457565b9150509250929050565b6000806040838503121561463b57600080fd5b600083013567ffffffffffffffff81111561465557600080fd5b6146618582860161435b565b92505060206146728582860161446c565b9150509250929050565b60006020828403121561468e57600080fd5b600061469c8482850161439a565b91505092915050565b6000602082840312156146b757600080fd5b60006146c5848285016143c4565b91505092915050565b6000602082840312156146e057600080fd5b60006146ee848285016143d9565b91505092915050565b6000806040838503121561470a57600080fd5b600083013567ffffffffffffffff81111561472457600080fd5b61473085828601614418565b925050602083013567ffffffffffffffff81111561474d57600080fd5b61475985828601614418565b9150509250929050565b60006020828403121561477557600080fd5b600061478384828501614442565b91505092915050565b60006020828403121561479e57600080fd5b60006147ac84828501614457565b91505092915050565b60006147c183836148bf565b60208301905092915050565b60006147d98383614dc7565b60208301905092915050565b6147ee8161569f565b82525050565b60006147ff82615486565b61480981856154cc565b935061481483615451565b8060005b8381101561484557815161482c88826147b5565b9750614837836154b2565b925050600181019050614818565b5085935050505092915050565b600061485d82615491565b61486781856154dd565b935061487283615461565b8060005b838110156148a357815161488a88826147cd565b9750614895836154bf565b925050600181019050614876565b5085935050505092915050565b6148b9816156b1565b82525050565b6148c8816156bd565b82525050565b6148df6148da826156bd565b6158af565b82525050565b60006148f08261549c565b6148fa81856154ee565b935061490a81856020860161577b565b614913816159df565b840191505092915050565b6149278161575a565b82525050565b6000614938826154a7565b61494281856154ff565b935061495281856020860161577b565b61495b816159df565b840191505092915050565b6000614971826154a7565b61497b8185615510565b935061498b81856020860161577b565b80840191505092915050565b600081546149a4816157d8565b6149ae8186615510565b945060018216600081146149c957600181146149da57614a0d565b60ff19831686528186019350614a0d565b6149e385615471565b60005b83811015614a05578154818901526001820191506020810190506149e6565b838801955050505b50505092915050565b6000614a236005836154ff565b9150614a2e826159f0565b602082019050919050565b6000614a466008836154ff565b9150614a5182615a19565b602082019050919050565b6000614a69600c836154ff565b9150614a7482615a42565b602082019050919050565b6000614a8c600d836154ff565b9150614a9782615a6b565b602082019050919050565b6000614aaf6004836154ff565b9150614aba82615a94565b602082019050919050565b6000614ad26007836154ff565b9150614add82615abd565b602082019050919050565b6000614af5600a836154ff565b9150614b0082615ae6565b602082019050919050565b6000614b18600a836154ff565b9150614b2382615b0f565b602082019050919050565b6000614b3b6008836154ff565b9150614b4682615b38565b602082019050919050565b6000614b5e6009836154ff565b9150614b6982615b61565b602082019050919050565b6000614b816006836154ff565b9150614b8c82615b8a565b602082019050919050565b6000614ba46008836154ff565b9150614baf82615bb3565b602082019050919050565b6000614bc76008836154ff565b9150614bd282615bdc565b602082019050919050565b6000614bea6008836154ff565b9150614bf582615c05565b602082019050919050565b6000614c0d600a836154ff565b9150614c1882615c2e565b602082019050919050565b6000614c306015836154ff565b9150614c3b82615c57565b602082019050919050565b6000614c536011836154ff565b9150614c5e82615c80565b602082019050919050565b6000614c766005836154ff565b9150614c8182615ca9565b602082019050919050565b6000614c996008836154ff565b9150614ca482615cd2565b602082019050919050565b6000614cbc6005836154ff565b9150614cc782615cfb565b602082019050919050565b6000614cdf600a836154ff565b9150614cea82615d24565b602082019050919050565b6000614d026006836154ff565b9150614d0d82615d4d565b602082019050919050565b6000614d256006836154ff565b9150614d3082615d76565b602082019050919050565b6000614d486009836154ff565b9150614d5382615d9f565b602082019050919050565b6000614d6b600b836154ff565b9150614d7682615dc8565b602082019050919050565b6000614d8e6005836154ff565b9150614d9982615df1565b602082019050919050565b6000614db16007836154ff565b9150614dbc82615e1a565b602082019050919050565b614dd081615706565b82525050565b614ddf81615734565b82525050565b614dee81615743565b82525050565b614e05614e0082615743565b6158b9565b82525050565b614e148161574d565b82525050565b6000614e2682846148ce565b60208201915081905092915050565b6000614e4182866148ce565b602082019150614e518285614df4565b602082019150614e6182846148ce565b602082019150819050949350505050565b6000614e7e8286614997565b9150614e8a8285614966565b9150614e968284614997565b9150819050949350505050565b6000602082019050614eb860008301846147e5565b92915050565b6000608082019050614ed360008301876147e5565b614ee060208301866147e5565b614eed6040830185614de5565b8181036060830152614eff81846148e5565b905095945050505050565b60006040820190508181036000830152614f2481856147f4565b9050614f3360208301846147e5565b9392505050565b6000602082019050614f4f60008301846148b0565b92915050565b6000606082019050614f6a60008301866148b0565b614f776020830185614de5565b614f846040830184614de5565b949350505050565b60006020820190508181036000830152614fa6818461492d565b905092915050565b60006020820190508181036000830152614fc781614a16565b9050919050565b60006020820190508181036000830152614fe781614a39565b9050919050565b6000602082019050818103600083015261500781614a5c565b9050919050565b6000602082019050818103600083015261502781614a7f565b9050919050565b6000602082019050818103600083015261504781614aa2565b9050919050565b6000602082019050818103600083015261506781614ac5565b9050919050565b6000602082019050818103600083015261508781614ae8565b9050919050565b600060208201905081810360008301526150a781614b0b565b9050919050565b600060208201905081810360008301526150c781614b2e565b9050919050565b600060208201905081810360008301526150e781614b51565b9050919050565b6000602082019050818103600083015261510781614b74565b9050919050565b6000602082019050818103600083015261512781614b97565b9050919050565b6000602082019050818103600083015261514781614bba565b9050919050565b6000602082019050818103600083015261516781614bdd565b9050919050565b6000602082019050818103600083015261518781614c00565b9050919050565b600060208201905081810360008301526151a781614c23565b9050919050565b600060208201905081810360008301526151c781614c46565b9050919050565b600060208201905081810360008301526151e781614c69565b9050919050565b6000602082019050818103600083015261520781614c8c565b9050919050565b6000602082019050818103600083015261522781614caf565b9050919050565b6000602082019050818103600083015261524781614cd2565b9050919050565b6000602082019050818103600083015261526781614cf5565b9050919050565b6000602082019050818103600083015261528781614d18565b9050919050565b600060208201905081810360008301526152a781614d3b565b9050919050565b600060208201905081810360008301526152c781614d5e565b9050919050565b600060208201905081810360008301526152e781614d81565b9050919050565b6000602082019050818103600083015261530781614da4565b9050919050565b60006020820190506153236000830184614de5565b92915050565b600060608201905061533e6000830186614de5565b61534b602083018561491e565b6153586040830184614de5565b949350505050565b60006060820190506153756000830186614e0b565b6153826020830185614dd6565b81810360408301526153948184614852565b9050949350505050565b60006153a86153b9565b90506153b4828261580a565b919050565b6000604051905090565b600067ffffffffffffffff8211156153de576153dd6159b0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561540a576154096159b0565b5b615413826159df565b9050602081019050919050565b600067ffffffffffffffff82111561543b5761543a6159b0565b5b615444826159df565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061552682615706565b915061553183615706565b92508261ffff03821115615548576155476158f4565b5b828201905092915050565b600061555e82615743565b915061556983615743565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561559e5761559d6158f4565b5b828201905092915050565b60006155b48261574d565b91506155bf8361574d565b92508260ff038211156155d5576155d46158f4565b5b828201905092915050565b60006155eb82615743565b91506155f683615743565b92508261560657615605615923565b5b828204905092915050565b600061561c82615743565b915061562783615743565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156605761565f6158f4565b5b828202905092915050565b600061567682615743565b915061568183615743565b925082821015615694576156936158f4565b5b828203905092915050565b60006156aa82615714565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061570182615e43565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615765826156f3565b9050919050565b82818337600083830152505050565b60005b8381101561579957808201518184015260208101905061577e565b838111156157a8576000848401525b50505050565b60006157b982615743565b915060008214156157cd576157cc6158f4565b5b600182039050919050565b600060028204905060018216806157f057607f821691505b6020821081141561580457615803615981565b5b50919050565b615813826159df565b810181811067ffffffffffffffff82111715615832576158316159b0565b5b80604052505050565b600061584682615706565b915061ffff82141561585b5761585a6158f4565b5b600182019050919050565b600061587182615743565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158a4576158a36158f4565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006158ce82615743565b91506158d983615743565b9250826158e9576158e8615923565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6f776e6572000000000000000000000000000000000000000000000000000000600082015250565b7f6d6f62496e646578000000000000000000000000000000000000000000000000600082015250565b7f676173206661696c736166650000000000000000000000000000000000000000600082015250565b7f50524553414c455f4c494d495400000000000000000000000000000000000000600082015250565b7f7a65726f00000000000000000000000000000000000000000000000000000000600082015250565b7f6e6f206d696e7400000000000000000000000000000000000000000000000000600082015250565b7f7065726d697373696f6e00000000000000000000000000000000000000000000600082015250565b7f50524943455f4d494e5400000000000000000000000000000000000000000000600082015250565b7f72656c6561736564000000000000000000000000000000000000000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f5f636f756e740000000000000000000000000000000000000000000000000000600082015250565b7f7265636569766572000000000000000000000000000000000000000000000000600082015250565b7f6e6f20746f6b656e000000000000000000000000000000000000000000000000600082015250565b7f434f4f4c444f574e000000000000000000000000000000000000000000000000600082015250565b7f5052494345204d494e5400000000000000000000000000000000000000000000600082015250565b7f77686974656c69737452657365727665436f756e740000000000000000000000600082015250565b7f5452414e53414354494f4e5f4c494d4954000000000000000000000000000000600082015250565b7f5052494345000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f4d4158000000000000000000000000000000000000000000000000600082015250565b7f76616c6964000000000000000000000000000000000000000000000000000000600082015250565b7f756e7061757361626c6500000000000000000000000000000000000000000000600082015250565b7f6f726967696e0000000000000000000000000000000000000000000000000000600082015250565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c794f776e65720000000000000000000000000000000000000000000000600082015250565b7f746f6b656e73476976656e000000000000000000000000000000000000000000600082015250565b7f7068617365000000000000000000000000000000000000000000000000000000600082015250565b7f696e76616c696400000000000000000000000000000000000000000000000000600082015250565b60048110615e5457615e53615952565b5b50565b615e608161569f565b8114615e6b57600080fd5b50565b615e77816156b1565b8114615e8257600080fd5b50565b615e8e816156bd565b8114615e9957600080fd5b50565b615ea5816156c7565b8114615eb057600080fd5b50565b615ebc81615706565b8114615ec757600080fd5b50565b615ed381615743565b8114615ede57600080fd5b50565b615eea8161574d565b8114615ef557600080fd5b5056fe47686f7374627573746572733a2041667465726c69666520436f6c6c65637469626c6573a264697066735822122013af6d30c9c26238f72ede5380ce35fc56259be8874c53677dd0eded2eb5d56264736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440000000000000000000000000000000000000000000000000000000000000000c504c414345484f4c4445522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2f504c414345484f4c4445520000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uriBase (string): PLACEHOLDER/
Arg [1] : _uriSuffix (string): /PLACEHOLDER
Arg [2] : _trapContract (address): 0x9540eA4bC7d8DF2Ef8ED68110CDBf4171D42aF5B
Arg [3] : _whitelist (address): 0x8D01ddCA9613FD28Cc7D258E3324F12aBbCeE440
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000009540ea4bc7d8df2ef8ed68110cdbf4171d42af5b
Arg [3] : 0000000000000000000000008d01ddca9613fd28cc7d258e3324f12abbcee440
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 504c414345484f4c4445522f0000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 2f504c414345484f4c4445520000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.