ERC-721
Overview
Max Total Supply
48 BAE
Holders
8
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 BAELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BAECore
Compiler Version
v0.5.3+commit.10d17f24
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-02-07 */ pragma solidity ^0.5.3; library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } library SafeERC20 { function safeTransfer( ERC20Basic _token, address _to, uint256 _value ) internal { require(_token.transfer(_to, _value)); } function safeTransferFrom( ERC20 _token, address _from, address _to, uint256 _value ) internal { require(_token.transferFrom(_from, _to, _value)); } function safeApprove( ERC20 _token, address _spender, uint256 _value ) internal { require(_token.approve(_spender, _value)); } } contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) internal balances; uint256 internal totalSupply_; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev Transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_value <= balances[msg.sender]); require(_to != address(0)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); require(_to != address(0)); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance( address _owner, address _spender ) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint256 _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 oldValue = allowed[msg.sender][_spender]; if (_subtractedValue >= oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } contract PausableToken is StandardToken, Pausable { function transfer( address _to, uint256 _value ) public whenNotPaused returns (bool) { return super.transfer(_to, _value); } function transferFrom( address _from, address _to, uint256 _value ) public whenNotPaused returns (bool) { return super.transferFrom(_from, _to, _value); } function approve( address _spender, uint256 _value ) public whenNotPaused returns (bool) { return super.approve(_spender, _value); } function increaseApproval( address _spender, uint _addedValue ) public whenNotPaused returns (bool success) { return super.increaseApproval(_spender, _addedValue); } function decreaseApproval( address _spender, uint _subtractedValue ) public whenNotPaused returns (bool success) { return super.decreaseApproval(_spender, _subtractedValue); } } contract AccessControl is Ownable, Pausable { /// @dev The addresses of the accounts (or contracts) that can execute actions within each roles. address payable public ceoAddress; address payable public cfoAddress; address payable public cooAddress; address payable public cmoAddress; address payable public BAEFeeAddress; address payable public owner = msg.sender; /// @dev Access modifier for CEO-only functionality modifier onlyCEO() { require( msg.sender == ceoAddress, "Only our CEO address can execute this function"); _; } /// @dev Access modifier for CFO-only functionality modifier onlyCFO() { require( msg.sender == cfoAddress, "Only our CFO can can ll this function"); _; } /// @dev Access modifier for COO-only functionality modifier onlyCOO() { require( msg.sender == cooAddress, "Only our COO can can ll this function"); _; } /// @dev Access modifier for Clevel functions modifier onlyCLevelOrOwner() { require( msg.sender == cooAddress || msg.sender == ceoAddress || msg.sender == cfoAddress || msg.sender == owner, "You need to be the owner or a Clevel @BAE to call this function" ); _; } /// @dev Assigns a new address to act as the CEO. Only available to the current CEO. /// @param _newCEO The address of the new CEO function setCEO(address payable _newCEO) external onlyCEO whenNotPaused { require(_newCEO != address(0)); ceoAddress = _newCEO; } /// @dev Assigns a new address to act as the CFO. Only available to the current CEO. /// @param _newCFO The address of the new CFO function setCFO(address payable _newCFO) external onlyCLevelOrOwner whenNotPaused { require(_newCFO != address(0)); cfoAddress = _newCFO; } /// @dev Assigns a new address to act as the COO. Only available to the current CEO. /// @param _newCOO The address of the new COO function setCOO(address payable _newCOO) external onlyCLevelOrOwner whenNotPaused { require(_newCOO != address(0)); cooAddress = _newCOO; } /// @dev Assigns a new address to act as the CMO. /// @param _newCMO The address of the new CMO function setCMO(address payable _newCMO) external onlyCLevelOrOwner whenNotPaused { require(_newCMO != address(0)); cmoAddress = _newCMO; } function getBAEFeeAddress() external view onlyCLevelOrOwner returns (address) { return BAEFeeAddress; } function setBAEFeeAddress(address payable _newAddress) public onlyCLevelOrOwner { BAEFeeAddress = _newAddress; } // Only the CEO, COO, and CFO can execute this function: function pause() public onlyCLevelOrOwner whenNotPaused { paused = true; emit Pause(); } function unpause() public onlyCLevelOrOwner whenPaused { paused = false; emit Unpause(); } } contract Destructible is AccessControl { /** * @dev Transfers the current balance to the owner and terminates the contract * onlyOwner needs to be changed to onlyBAE */ function destroy() public onlyCLevelOrOwner whenPaused{ selfdestruct(owner); } /** * @dev Transfers the current balance to the address and terminates the contract. */ function destroyAndSend(address payable _recipient) public onlyCLevelOrOwner whenPaused { selfdestruct(_recipient); } } contract ArtShop is Destructible { using SafeMath for uint256; /// @dev this fires everytime an artpiece is created event NewArtpiece(uint pieceId, string name, string artist); /// @dev this is set up to track how many changes the url has been changed event UrlChange(uint pieceId); /// @dev - both baeFeeLevel and royaltyFeeLevel are percentages and the combined should be /// kept below 95% on first sale or 99% on secondary sale :) uint8 internal baeFeeLevel; uint8 internal royaltyFeeLevel; uint8 internal potFeeLevel = 5; /// @dev this is used to prevent constant movement of art uint32 public timeUntilAbleToTransfer = 1 hours; /// @dev all metadata relating to an artpiece /// @dev this is done to prevent the error: Stacktrace too long as per /// @dev https://ethereum.stackexchange.com/questions/7325/stack-too-deep-try-removing-local-variables struct ArtpieceMetaData { uint8 remainingPrintings; uint64 basePrice; ///@dev listing price uint256 dateCreatedByTheArtist; string notes; bool isFirstSale; bool physical; } /// @dev all properties of an artpiece struct Artpiece { string name; /// @dev - should this change? I don't think so string artist; ///@dev artist's name for now - might be good to be an id/hash string thumbnailUrl; string mainUrl; string grade; uint64 price; /// @dev current price uint8 feeLevel; /// @dev this is the royalty fee uint8 baeFeeLevel; ArtpieceMetaData metadata; } Artpiece[] artpieces; mapping (uint256 => address) public numArtInAddress; mapping (address => uint256) public artCollection; mapping (uint256 => address) public artpieceApproved; /// @dev contract-specific modifiers on fees modifier onlyWithGloballySetFee() { require( baeFeeLevel > 0, "Requires a fee level to be set up" ); require( royaltyFeeLevel > 0, "Requires a an artist fee level to be set up" ); _; } /// @dev this is the gloabal fee setter /// @dev setBAEFeeLevel should be 35 initially on first sale function setBAEFeeLevel(uint8 _newFee) public onlyCLevelOrOwner { baeFeeLevel = _newFee; } function setRoyaltyFeeLevel(uint8 _newFee) public onlyCLevelOrOwner { royaltyFeeLevel = _newFee; } function _createArtpiece( string memory _name, string memory _artist, string memory _thumbnailUrl, string memory _mainUrl, string memory _notes, string memory _grade, uint256 _dateCreatedByTheArtist, uint64 _price, uint64 _basePrice, uint8 _remainingPrintings, bool _physical ) internal onlyWithGloballySetFee whenNotPaused { ArtpieceMetaData memory metd = ArtpieceMetaData( _remainingPrintings, _basePrice, _dateCreatedByTheArtist, _notes, true, _physical ); Artpiece memory newArtpiece = Artpiece( _name, _artist, _thumbnailUrl, _mainUrl, _grade, _price, royaltyFeeLevel, baeFeeLevel, metd ); uint id = artpieces.push(newArtpiece) - 1; numArtInAddress[id] = msg.sender; artCollection[msg.sender] = artCollection[msg.sender].add(1); emit NewArtpiece(id, _name, _artist); } } contract Helpers is ArtShop { /// @dev modifiers for the ERC721-compliant functions modifier onlyOwnerOf(uint _artpieceId) { require(msg.sender == numArtInAddress[_artpieceId]); _; } /// @dev we use this so we can't delete artpieces once they are on auction /// so people have the feeling they really own the modifier onlyBeforeFirstSale(uint _tokenId) { (,,,,bool isFirstSale,) = getArtpieceMeta(_tokenId); require(isFirstSale == true); _; } event Printed(uint indexed _id, uint256 indexed _time); function getArtpieceData(uint _id) public view returns(string memory name, string memory artist, string memory thumbnailUrl, string memory grade, uint64 price) { return ( artpieces[_id].name, artpieces[_id].artist, artpieces[_id].thumbnailUrl, artpieces[_id].grade, artpieces[_id].price ); } function getArtpieceFeeLevels(uint _id) public view returns(uint8, uint8) { return ( artpieces[_id].feeLevel, artpieces[_id].baeFeeLevel ); } function getArtpieceMeta(uint _id) public view returns(uint8, uint64, uint256, string memory, bool, bool) { return ( artpieces[_id].metadata.remainingPrintings, artpieces[_id].metadata.basePrice, artpieces[_id].metadata.dateCreatedByTheArtist, artpieces[_id].metadata.notes, artpieces[_id].metadata.isFirstSale, artpieces[_id].metadata.physical ); } function getMainUrl(uint _id) public view onlyOwnerOf(_id) returns(string memory) { return artpieces[_id].mainUrl; } function setArtpieceName(uint _id, string memory _name) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].name = _name; } function setArtist(uint _id, string memory _artist) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].artist = _artist; } function setThumbnailUrl(uint _id, string memory _newThumbnailUrl) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].thumbnailUrl = _newThumbnailUrl; } // this used to be internal function setMainUrl(uint _id, string memory _newUrl) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].mainUrl = _newUrl; emit UrlChange(_id); } function setGrade(uint _id, string memory _grade) public onlyCLevelOrOwner whenNotPaused returns (bool success) { artpieces[_id].grade = _grade; return true; } function setPrice(uint _id, uint64 _price) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].price = _price; } function setArtpieceBAEFee(uint _id, uint8 _newFee) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].baeFeeLevel = _newFee; } function setArtpieceRoyaltyFeeLevel(uint _id, uint8 _newFee) public onlyCLevelOrOwner whenNotPaused { artpieces[_id].feeLevel = _newFee; } function setRemainingPrintings(uint _id, uint8 _remainingPrintings) internal onlyCLevelOrOwner whenNotPaused { artpieces[_id].metadata.remainingPrintings = _remainingPrintings; } function setBasePrice(uint _id, uint64 _basePrice) public onlyCLevelOrOwner { artpieces[_id].metadata.basePrice = _basePrice; } function setDateCreateByArtist(uint _id, uint256 _dateCreatedByTheArtist) public onlyCLevelOrOwner { artpieces[_id].metadata.dateCreatedByTheArtist = _dateCreatedByTheArtist; } function setNotes(uint _id, string memory _notes) public onlyCLevelOrOwner { artpieces[_id].metadata.notes = _notes; } function setIsPhysical(uint _id, bool _physical) public onlyCLevelOrOwner { artpieces[_id].metadata.physical = _physical; } function getArtpiecesByOwner(address _owner) external view returns(uint[] memory) { uint[] memory result = new uint[](artCollection[_owner]); uint counter = 0; for ( uint i = 0; i < artpieces.length; i++ ) { if (numArtInAddress[i] == _owner) { result[counter] = i; counter = counter.add(1); } } return result; } } contract BAEToken is PausableToken, AccessControl { using SafeMath for uint256; using SafeERC20 for ERC20; event Mint(address indexed to, uint256 amount); event MintFinished(); event Burn(address indexed burner, uint256 value); string public constant name = "BAEToken"; string public constant symbol = "BAE"; uint public constant decimals = 6; uint public currentAmount = 0; // rate is £1 == 10 BAE based on 100 000 000 = 10,000,000 uint public totalAllocated = 0; bool public mintingFinished = false; uint256 public currentIndex = 0; /// @dev - holder adresses by index mapping(uint => address) public holderAddresses; /// @dev total supply assigned to msg.sender directly constructor() public { totalSupply_ = 0; } modifier validDestination(address _to) { require(_to != address(0x0)); require(_to != address(this)); _; } modifier canMint() { require( !mintingFinished, "Still minting." ); _; } modifier hasMintPermission() { require( msg.sender == owner, "Message sender is not owner." ); _; } modifier onlyWhenNotMinting() { require( mintingFinished == false, "Minting needs to be stopped to execute this function" ); _; } /** * @dev getter for name */ function getName() public pure returns (string memory) { return name; } /** * @dev getter for token symbol */ function getSymbol() public pure returns (string memory) { return symbol; } /** * @dev getter for totalSupply_ */ function getTotalSupply() public view returns (uint) { return totalSupply_; } /** * @dev getter for user amount */ function getBalance() public view returns (uint) { return balances[msg.sender]; } /// @dev this is a superuser function to check each wallet amount function getUserBalance(address _userAddress) public view onlyCLevelOrOwner returns(uint) { return balances[_userAddress]; } /** * @dev private */ function burn(address _who, uint256 _value) public onlyCEO whenNotPaused { require( _value <= balances[_who], "Value is smaller than the value the account in balances has" ); // no need to require value <= totalSupply, since that would imply the // sender's balance is greater than the totalSupply, which *should* be an assertion failure // BAEholders[_who] = BAEholders[_who].sub(_value); totalSupply_ = totalSupply_.sub(_value); totalAllocated = totalAllocated.sub(_value); balances[_who] = balances[_who].sub(_value); emit Burn(_who, _value); emit Transfer(_who, address(0), _value); } /** * @dev Function to mint tokens * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function mint( address _to, uint256 _amount ) public canMint onlyCLevelOrOwner whenNotPaused returns (bool) { totalSupply_ = totalSupply_.add(_amount); totalAllocated = totalAllocated.add(_amount); balances[_to] = balances[_to].add(_amount); emit Mint(_to, _amount); emit Transfer(address(0), _to, _amount); return true; } /** * @dev Function to stop minting new tokens. * @return True if the operation was successful. */ function finishMinting() public onlyCEO canMint whenNotPaused returns (bool) { mintingFinished = true; emit MintFinished(); return true; } /** ------------------------------------------------------------------------ * @dev - Owner can transfer out ERC20 tokens * ------------------------------------------------------------------------ // */ /// @dev - we `override` the ability of calling those methods to be allowed only of the owner /// or the C level as the tokens shouldn't have any money properties. function transfer(address _to, uint256 _value) public onlyCLevelOrOwner returns (bool) { /// @dev call the super function transfer as is super.transfer(_to, _value); /// @dev and add the required totalAllocated = totalAllocated.add(_value); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); holderAddresses[currentIndex] = _to; currentIndex = currentIndex.add(1); return true; } function transferFrom( address _from, address _to, uint256 _value ) public onlyCLevelOrOwner returns (bool) { super.transferFrom(_from, _to, _value); totalAllocated = totalAllocated.add(_value); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); holderAddresses[currentIndex] = _to; currentIndex = currentIndex.add(1); return true; } function approve(address _spender, uint256 _value) public onlyCLevelOrOwner returns (bool) { super.approve(_spender, _value); } } contract Payments is BAEToken { event PotPayout(address indexed _to, uint256 indexed value); BAECore public baeInstance; constructor() public { ceoAddress = msg.sender; } function setBAECoreAddress(address payable _address) public onlyCEO whenPaused { BAECore baeCandidate = BAECore(_address); baeInstance = baeCandidate; } /// @dev - Update balances - % of ownership function addToBAEHolders(address _to) public onlyCLevelOrOwner whenNotPaused { mint(_to, currentAmount); } function subToBAEHolders(address _from, address _to, uint _amount) public onlyCLevelOrOwner whenNotPaused { transferFrom(_from, _to, _amount); } function setFinalPriceInPounds(uint _finalPrice) public onlyCLevelOrOwner whenNotPaused { currentAmount = _finalPrice.mul(10000000); } function withdraw() public onlyCFO { cfoAddress.transfer(address(this).balance); } function() external payable { } } 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. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } contract IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function transferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public; } contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) public view returns (string memory); } contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address owner, uint256 index ) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 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)"))` */ function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) public returns(bytes4); } contract IERC721Full is IERC721, IERC721Enumerable, IERC721Metadata { } contract ERC165 is IERC165 { bytes4 private constant _InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) internal _supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() public { _registerInterface(_InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev private method for registering an interface */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff); _supportedInterfaces[interfaceId] = true; } } contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_InterfaceId_ERC721); } /** * @dev Gets the balance of the specified address * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0)); return _ownedTokensCount[owner]; } /** * @dev Gets the owner of the specified token ID * @param tokenId uint256 ID of the token to query the owner of * @return owner address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0)); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId)); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != msg.sender); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } /** * @dev Tells whether an operator is approved by a given owner * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll( address owner, address operator ) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address * Usage of this method is discouraged, use `safeTransferFrom` whenever possible * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom( address from, address to, uint256 tokenId ) public { require(_isApprovedOrOwner(msg.sender, tokenId)); require(to != address(0)); _clearApproval(from, tokenId); _removeTokenFrom(from, tokenId); _addTokenTo(to, tokenId); emit Transfer(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address from, address to, uint256 tokenId ) public { // solium-disable-next-line arg-overflow safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public { transferFrom(from, to, tokenId); // solium-disable-next-line arg-overflow require(_checkAndCallSafeTransfer(from, to, tokenId, _data)); } /** * @dev Returns whether the specified token exists * @param tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner( address spender, uint256 tokenId ) internal view returns (bool) { address owner = ownerOf(tokenId); // Disable solium check because of // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return ( spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender) ); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address to, uint256 tokenId) internal { require(to != address(0)); _addTokenTo(to, tokenId); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { _clearApproval(owner, tokenId); _removeTokenFrom(owner, tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to clear current approval of a given token ID * Reverts if the given address is not indeed the owner of the token * @param owner owner of the token * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner); if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } /** * @dev Internal function to add a token ID to the list of a given address * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenTo(address to, uint256 tokenId) internal { require(_tokenOwner[tokenId] == address(0)); _tokenOwner[tokenId] = to; _ownedTokensCount[to] = _ownedTokensCount[to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFrom(address from, uint256 tokenId) internal { require(ownerOf(tokenId) == from); _ownedTokensCount[from] = _ownedTokensCount[from].sub(1); _tokenOwner[tokenId] = address(0); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function _checkAndCallSafeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received( msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } } contract ERC721Metadata is ERC165, ERC721, IERC721Metadata { // Token name string internal _name; // Token symbol string internal _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ /** * @dev Constructor function */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(InterfaceId_ERC721Metadata); } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId)); return _tokenURIs[tokenId]; } /** * @dev Internal function to set the token URI for a given token * Reverts if the token ID does not exist * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { require(_exists(tokenId)); _tokenURIs[tokenId] = uri; } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; bytes4 private constant _InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ /** * @dev Constructor function */ constructor() public { // register the supported interface to conform to ERC721 via ERC165 _registerInterface(_InterfaceId_ERC721Enumerable); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex( address owner, uint256 index ) public view returns (uint256) { require(index < balanceOf(owner)); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply()); return _allTokens[index]; } /** * @dev Internal function to add a token ID to the list of a given address * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenTo(address to, uint256 tokenId) internal { super._addTokenTo(to, tokenId); uint256 length = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); _ownedTokensIndex[tokenId] = length; } /** * @dev Internal function to remove a token ID from the list of a given address * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFrom(address from, uint256 tokenId) internal { super._removeTokenFrom(from, tokenId); // To prevent a gap in the array, we store the last token in the index of the token to delete, and // then delete the last slot. uint256 tokenIndex = _ownedTokensIndex[tokenId]; uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 lastToken = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastToken; // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to // be zero. Then we can make sure that we will remove tokenId from the ownedTokens list since we are first swapping // the lastToken to the first position, and then dropping the element placed in the last position of the list _ownedTokensIndex[tokenId] = 0; _ownedTokensIndex[lastToken] = tokenIndex; } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Reorg all tokens array uint256 tokenIndex = _allTokensIndex[tokenId]; uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 lastToken = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastToken; _allTokens[lastTokenIndex] = 0; _allTokens.length--; _allTokensIndex[tokenId] = 0; _allTokensIndex[lastToken] = tokenIndex; } } contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) { // solhint-disable-previous-line no-empty-blocks } } contract BAE is ERC721Full, Helpers { using SafeMath for uint256; /// @dev - extra events on the ERC721 contract event Sold(uint indexed _tokenId, address _from, address _to, uint indexed _price); event Deleted(uint indexed _tokenId, address _from); event PaymentsContractChange(address _prevAddress, address _futureAddress); event AuctionContractChange(address _prevAddress, address _futureAddress); Payments public tokenInterface; mapping (uint => address) artTransApprovals; constructor() ERC721Full("BlockchainArtExchange", "BAE") public {} /// @dev functions affecting ERC20 tokens function setPaymentAddress(address payable _newAddress) public onlyCEO whenPaused { Payments tokenInterfaceCandidate = Payments(_newAddress); tokenInterface = tokenInterfaceCandidate; } function createArtpiece( string memory _name, string memory _artist, string memory _thumbnailUrl, string memory _mainUrl, string memory _notes, string memory _grade, uint256 _dateCreatedByTheArtist, uint64 _price, uint64 _basePrice, uint8 _remainingPrintings, bool _physical ) public { super._createArtpiece(_name, _artist, _thumbnailUrl, _mainUrl, _notes, _grade, _dateCreatedByTheArtist, _price, _basePrice, _remainingPrintings, _physical); _mint(msg.sender, artpieces.length - 1); } function calculateFees(uint _tokenId) public payable whenNotPaused returns (uint baeFee, uint royaltyFee, uint potFee) { /// @dev check this will not bring problems in the future or should we be using SafeMath library. uint baeFeeAmount = (uint(artpieces[_tokenId].baeFeeLevel) * msg.value) / 100; uint artistFeeAmount = (uint(artpieces[_tokenId].feeLevel) * msg.value) / 100; /// @dev any extra money will be added to the pot uint potFeeAmount = msg.value - (baeFeeAmount + artistFeeAmount); return (baeFeeAmount, artistFeeAmount, potFeeAmount); } /// @dev - this should be getting the royalty fee so we get the remaining as what is the bae fee function payFees(uint256 _baeFee, uint256 _royaltyFee, uint256 _potFee, address payable _seller) public payable whenNotPaused { uint totalToPay = _baeFee + _royaltyFee + _potFee; require( msg.value >= totalToPay, "Value must be equal or greater than the cost of the fees" ); BAEFeeAddress.transfer(msg.value.sub(_baeFee)); _seller.transfer(msg.value.sub(_royaltyFee)); // we send the value left of the message to the POT contract address(tokenInterface).transfer(msg.value); } /// @dev set post-purchase data function _postPurchase(address _from, address _to, uint256 _tokenId) internal { artCollection[_to] = artCollection[_to].add(1); artCollection[_from] = artCollection[_from].sub(1); numArtInAddress[_tokenId] = _to; if (artpieces[_tokenId].metadata.isFirstSale) { artpieces[_tokenId].feeLevel = uint8(96); artpieces[_tokenId].baeFeeLevel = uint8(3); /// potFeeLevel is calculated from adding up (baeFeeLevel + royaltyFee) - 100 } /// @dev we set this as not being the first sale anymore artpieces[_tokenId].metadata.isFirstSale = false; emit Sold(_tokenId, _from, _to, artpieces[_tokenId].price); } /// @dev this method is not part of erc-721 - not yet tested function deleteArtpiece(uint256 _tokenId) public onlyCLevelOrOwner whenNotPaused onlyBeforeFirstSale(_tokenId) returns (bool deleted) { address _from = numArtInAddress[_tokenId]; delete numArtInAddress[_tokenId]; artCollection[_from] = artCollection[_from].sub(1); _burn(_from, _tokenId); delete artpieces[_tokenId]; emit Deleted(_tokenId, _from); return true; } /// @dev - we override this so only the CEO can call it. function pause() public onlyCEO whenNotPaused { super.pause(); } } contract PerishableSimpleAuction is Destructible { using SafeMath for uint256; event AuctionCreated(uint id, address seller); event AuctionWon(uint tokenId, address _who); event SellerPaid(bool success, uint amount); BAECore public baeInstance; bool private currentAuction; struct Auction { uint256 tokenId; uint256 startingPrice; uint256 finalPrice; address payable seller; uint8 paid; } // When someone wins add it to this mapping /// @dev address => uint === winnerAddress => tokenId mapping (uint => address) public winners; // Map from token ID to their corresponding auction. mapping (uint256 => Auction) public tokenIdToAuction; mapping (uint256 => uint256) public tokendIdToAuctionId; /// @dev auction array Auction[20] public auctions; /// @dev auction index uint public idx = 0; /// @dev cut on each auction uint256 public baeAuctionFee = 0.01 ether; modifier onlyAuctionOwner() { require(msg.sender == owner); _; } modifier onlyAuctionLord() { require(msg.sender == address(baeInstance)); _; } constructor() public { paused = true; ceoAddress = msg.sender; } function setIsCurrentAuction(bool _current) external onlyCEO { currentAuction = _current; } /// @dev this should be done when paused as it breaks functionality /// @dev changes the current contract interaccting with the auction function setBAEAddress(address payable _newAddress) public onlyAuctionOwner whenPaused { address currentInstance = address(baeInstance); BAECore candidate = BAECore(_newAddress); baeInstance = candidate; require(address(baeInstance) != address(0) && address(baeInstance) != currentInstance); } function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _finalPrice, address payable _seller ) external whenNotPaused onlyAuctionLord { if (tokendIdToAuctionId[_tokenId] != 0) { require(tokenIdToAuction[_tokenId].paid == 1); } require(idx <= 20); Auction memory newAuction = Auction(_tokenId, _startingPrice, _finalPrice, _seller, 0); auctions[idx] = newAuction; tokenIdToAuction[_tokenId] = newAuction; tokendIdToAuctionId[_tokenId] = idx; idx = idx.add(1); emit AuctionCreated(idx, _seller); } /// @dev this function sets who won that auction and allows the token to be marked as approved for sale. function hasWon(uint256 _auctionId, address _winner, uint256 _finalBidPrice) external whenNotPaused onlyAuctionLord { winners[auctions[_auctionId].tokenId] = _winner; auctions[_auctionId].finalPrice = _finalBidPrice; emit AuctionWon(auctions[_auctionId].tokenId, _winner); } function winnerCheckWireDetails(uint _auctionId, address _sender) external view whenNotPaused returns(address payable, uint, uint) { /// get the storage variables uint finalPrice = auctions[_auctionId].finalPrice; uint tokenId = auctions[_auctionId].tokenId; address winnerAddress = winners[tokenId]; address payable seller = auctions[_auctionId].seller; /// get winner address and check it is in the winners' mapping require(_sender == winnerAddress); return (seller, tokenId, finalPrice); } function setPaid(uint _auctionId) external whenNotPaused onlyAuctionLord { require(auctions[_auctionId].paid == 0); auctions[_auctionId].paid = 1; emit SellerPaid(true, auctions[_auctionId].finalPrice); } /** Takes an auctionId to get the tokenId for the auction and returns the address of the winner. */ function getAuctionWinnerAddress(uint _auctionId) external view whenNotPaused returns(address) { return winners[auctions[_auctionId].tokenId]; } function getFinalPrice(uint _auctionId) external view whenNotPaused returns(uint) { return auctions[_auctionId].finalPrice; } function getAuctionDetails(uint _auctionId) external view whenNotPaused returns (uint, uint, uint, address, uint) { return (auctions[_auctionId].tokenId, auctions[_auctionId].startingPrice, auctions[_auctionId].finalPrice, auctions[_auctionId].seller, auctions[_auctionId].paid); } function getCurrentIndex() external view returns (uint) { uint val = idx - 1; if (val > 20) { return 0; } return val; } function getTokenIdToAuctionId(uint _tokenId) external view returns (uint) { return tokendIdToAuctionId[_tokenId]; } function unpause() public onlyAuctionOwner whenPaused { require(address(baeInstance) != address(0)); super.unpause(); } function () external payable { revert(); } } contract BAECore is BAE { using SafeMath for uint256; /// @dev this will be private so no one can see where it is living and will be deployed by another address PerishableSimpleAuction private instanceAuctionAddress; constructor() public { paused = true; ceoAddress = msg.sender; } function setAuctionAddress(address payable _newAddress) public onlyCEO whenPaused { PerishableSimpleAuction possibleAuctionInstance = PerishableSimpleAuction(_newAddress); instanceAuctionAddress = possibleAuctionInstance; } /// @dev we can also charge straight away by charging an amount and making this function payable function createAuction(uint _tokenId, uint _startingPrice, uint _finalPrice) external whenNotPaused { require(ownerOf( _tokenId) == msg.sender, "You can't transfer an artpiece which is not yours"); require(_startingPrice >= artpieces[_tokenId].metadata.basePrice); instanceAuctionAddress.createAuction(_tokenId, _startingPrice,_finalPrice, msg.sender); /// @dev - approve the setWinnerAndPrice callers setApprovalForAll(owner, true); setApprovalForAll(ceoAddress, true); setApprovalForAll(cfoAddress, true); setApprovalForAll(cooAddress, true); } function getAuctionDetails(uint _auctionId) public view returns (uint) { (uint tokenId,,,,) = instanceAuctionAddress.getAuctionDetails(_auctionId); return tokenId; } /// @dev this should be cleared from the array if its called on a second time. function setWinnerAndPrice(uint256 _auctionId, address _winner, uint256 _finalPrice, uint256 _currentPrice) external onlyCLevelOrOwner whenNotPaused returns(bool hasWinnerInfo) { (uint tokenId,,,,) = instanceAuctionAddress.getAuctionDetails(_auctionId); require(_finalPrice >= uint256(artpieces[tokenId].metadata.basePrice)); approve(_winner, tokenId); instanceAuctionAddress.hasWon(_auctionId, _winner, _finalPrice); tokenInterface.setFinalPriceInPounds(_currentPrice); return true; } function calculateFees(uint _tokenId, uint _fullAmount) internal view whenNotPaused returns (uint baeFee, uint royaltyFee, uint potFee) { /// @dev check this will not bring problems in the future or should we be using SafeMath library. uint baeFeeAmount = (uint(artpieces[_tokenId].baeFeeLevel) * _fullAmount) / 100; uint artistFeeAmount = (uint(artpieces[_tokenId].feeLevel) * _fullAmount) / 100; /// @dev any extra money will be added to the pot uint potFeeAmount = _fullAmount - (baeFeeAmount + artistFeeAmount); return (baeFeeAmount, artistFeeAmount, potFeeAmount); } function payAndWithdraw(uint _auctionId) public payable { // calculate the share of each of the stakeholders (address payable seller, uint tokenId, uint finalPrice) = instanceAuctionAddress.winnerCheckWireDetails(_auctionId, msg.sender); (uint baeFeeAmount, uint artistFeeAmount,) = calculateFees(tokenId, finalPrice); // break msg.value it into the rightchunks require(msg.value >= finalPrice); uint baeFee = msg.value.sub(baeFeeAmount); uint artistFee = msg.value.sub(artistFeeAmount); // do the transfers BAEFeeAddress.transfer(msg.value.sub(baeFee)); seller.transfer(msg.value.sub(artistFee)); address(tokenInterface).transfer(address(this).balance); // and when the money is sent, we mark the auccion as completed instanceAuctionAddress.setPaid(_auctionId); // and since it's paid then initiate the transfer mechanism transferFrom(seller, msg.sender, tokenId); } function getWinnerAddress(uint _auctionId) public view returns(address) { return instanceAuctionAddress.getAuctionWinnerAddress(_auctionId); } function getHighestBid(uint _auctionId) public view returns(uint) { return instanceAuctionAddress.getFinalPrice(_auctionId); } function getLatestAuctionIndex() public view returns(uint) { return instanceAuctionAddress.getCurrentIndex(); } function transferFrom(address _from, address _to, uint256 _tokenId) public whenNotPaused { uint auctionId = instanceAuctionAddress.getTokenIdToAuctionId(_tokenId); (,,,,uint paid) = (instanceAuctionAddress.getAuctionDetails(auctionId)); require(paid == 1); super.transferFrom(_from, _to, _tokenId); _postPurchase(_from, _to, _tokenId); /// @dev this gets paid even to non artists, if it's a seller he will get the same tokenInterface.addToBAEHolders(_from); } function unpause() public onlyCEO whenPaused { require(ceoAddress != address(0)); require(address(instanceAuctionAddress) != address(0)); require(address(tokenInterface) != address(0)); require(address(BAEFeeAddress) != address(0)); super.unpause(); } /// @dev - we override this so only the CEO can call it. function pause() public onlyCEO whenNotPaused { super.pause(); } function () external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getMainUrl","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getArtpiecesByOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFee","type":"uint8"}],"name":"setRoyaltyFeeLevel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBAEFeeAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLatestAuctionIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getArtpieceFeeLevels","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_name","type":"string"}],"name":"setArtpieceName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_price","type":"uint64"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BAEFeeAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"deleteArtpiece","outputs":[{"name":"deleted","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_newUrl","type":"string"}],"name":"setMainUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getArtpieceMeta","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint64"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFee","type":"uint8"}],"name":"setBAEFeeLevel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_auctionId","type":"uint256"}],"name":"getWinnerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"calculateFees","outputs":[{"name":"baeFee","type":"uint256"},{"name":"royaltyFee","type":"uint256"},{"name":"potFee","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_newThumbnailUrl","type":"string"}],"name":"setThumbnailUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_notes","type":"string"}],"name":"setNotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"artpieceApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_physical","type":"bool"}],"name":"setIsPhysical","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_artist","type":"string"},{"name":"_thumbnailUrl","type":"string"},{"name":"_mainUrl","type":"string"},{"name":"_notes","type":"string"},{"name":"_grade","type":"string"},{"name":"_dateCreatedByTheArtist","type":"uint256"},{"name":"_price","type":"uint64"},{"name":"_basePrice","type":"uint64"},{"name":"_remainingPrintings","type":"uint8"},{"name":"_physical","type":"bool"}],"name":"createArtpiece","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"numArtInAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timeUntilAbleToTransfer","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setBAEFeeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_auctionId","type":"uint256"},{"name":"_winner","type":"address"},{"name":"_finalPrice","type":"uint256"},{"name":"_currentPrice","type":"uint256"}],"name":"setWinnerAndPrice","outputs":[{"name":"hasWinnerInfo","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_auctionId","type":"uint256"}],"name":"getHighestBid","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_basePrice","type":"uint64"}],"name":"setBasePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"artCollection","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_auctionId","type":"uint256"}],"name":"payAndWithdraw","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_grade","type":"string"}],"name":"setGrade","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_newFee","type":"uint8"}],"name":"setArtpieceRoyaltyFeeLevel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getArtpieceData","outputs":[{"name":"name","type":"string"},{"name":"artist","type":"string"},{"name":"thumbnailUrl","type":"string"},{"name":"grade","type":"string"},{"name":"price","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_artist","type":"string"}],"name":"setArtist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_finalPrice","type":"uint256"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_newFee","type":"uint8"}],"name":"setArtpieceBAEFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_baeFee","type":"uint256"},{"name":"_royaltyFee","type":"uint256"},{"name":"_potFee","type":"uint256"},{"name":"_seller","type":"address"}],"name":"payFees","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_dateCreatedByTheArtist","type":"uint256"}],"name":"setDateCreateByArtist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_auctionId","type":"uint256"}],"name":"getAuctionDetails","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenInterface","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_to","type":"address"},{"indexed":true,"name":"_price","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"_from","type":"address"}],"name":"Deleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevAddress","type":"address"},{"indexed":false,"name":"_futureAddress","type":"address"}],"name":"PaymentsContractChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevAddress","type":"address"},{"indexed":false,"name":"_futureAddress","type":"address"}],"name":"AuctionContractChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_id","type":"uint256"},{"indexed":true,"name":"_time","type":"uint256"}],"name":"Printed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pieceId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"artist","type":"string"}],"name":"NewArtpiece","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pieceId","type":"uint256"}],"name":"UrlChange","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
Contract Creation Code
6080604052600c805460a060020a60ff02191690556012805433600160a060020a03199091161760b060020a60ff0219167605000000000000000000000000000000000000000000001760b860020a63ffffffff021916780e1000000000000000000000000000000000000000000000001790553480156200008057600080fd5b50604080518082018252601581527f426c6f636b636861696e41727445786368616e676500000000000000000000006020808301919091528251808401909352600383527f424145000000000000000000000000000000000000000000000000000000000090830152908181620001207f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000239810204565b620001547f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000239810204565b620001887f780e9d630000000000000000000000000000000000000000000000000000000064010000000062000239810204565b81516200019d906009906020850190620002a6565b508051620001b390600a906020840190620002a6565b50620001e87f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000239810204565b5050600c80547401000000000000000000000000000000000000000033600160a060020a0319928316811760a060020a60ff02191691909117909255600d80549091169091179055506200034b9050565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200026957600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e957805160ff191683800117855562000319565b8280016001018555821562000319579182015b8281111562000319578251825591602001919060010190620002fc565b50620003279291506200032b565b5090565b6200034891905b8082111562000327576000815560010162000332565b90565b615f33806200035b6000396000f3fe608060405260043610610438576000357c0100000000000000000000000000000000000000000000000000000000900480635fa66b321161023b5780639a95ac4b11610140578063cda4beef116100c8578063eab31fc911610097578063eab31fc914611a59578063f20e5e3514611a89578063f2fde38b14611ab3578063f343d68314611ae6578063f5074f4114611afb57610438565b8063cda4beef1461197d578063d939c13a146119b3578063e985e9c5146119e6578063ea0a977314611a2157610438565b8063b3a03a261161010f578063b3a03a26146115a4578063b88d4fde146115d7578063c4d74d50146116aa578063c87b56dd14611899578063cb33420b146118c357610438565b80639a95ac4b1461147d5780639ace64961461149a578063a22cb46514611554578063b047fb501461158f57610438565b80638ab8d19e116101c35780638f288644116101925780638f2886441461139e57806391ef4c7e146113c857806393ac36381461140257806395d89b4114611435578063997f8b0a1461144a57610438565b80638ab8d19e146112fc5780638c267b971461132f5780638d59767c146113445780638da5cb5b1461138957610438565b806379b58a631161020a57806379b58a6314610ef95780638121bfef1461127a57806383197ef0146112a45780638456cb59146112b9578063889f22cb146112ce57610438565b80635fa66b3214610e555780636352211e14610e8757806370a0823114610eb1578063715018a614610ee457610438565b80632ba73c15116103415780634e0a3379116102c95780635387253f116102985780635387253f14610c6f5780635b89a38a14610d295780635c975abb14610de35780635e1e100414610df85780635f4968de14610e2b57610438565b80634e0a337914610bad5780634f6ccce714610be0578063515371a314610c0a57806352238fdd14610c3457610438565b80632f745c59116103105780632f745c5914610a085780632fba521114610a415780633f4ba83a14610b2857806340d7ce1414610b3d57806342842e0e14610b6a57610438565b80632ba73c15146108dc5780632bc334e41461090f5780632c4b4a29146109245780632e584ade1461094e57610438565b80631dc9fc61116103c457806323b872dd1161039357806323b872dd1461072857806327d328721461076b57806327d7874c146107b55780632a1d0b16146107e85780632ba27019146108a257610438565b80631dc9fc611461069e5780632072863b146106cb578063215f02f4146106fe57806321d354fd1461071357610438565b8063095ea7b31161040b578063095ea7b31461057c5780630a0f8168146105b557806311229c53146105ca578063134e89f0146105f457806318160ddd1461067757610438565b806301ffc9a71461043a5780630519ce791461049757806306fdde03146104c8578063081812fc14610552575b005b34801561044657600080fd5b506104836004803603602081101561045d57600080fd5b50357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916611b2e565b604080519115158252519081900360200190f35b3480156104a357600080fd5b506104ac611b62565b60408051600160a060020a039092168252519081900360200190f35b3480156104d457600080fd5b506104dd611b71565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105175781810151838201526020016104ff565b50505050905090810190601f1680156105445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055e57600080fd5b506104ac6004803603602081101561057557600080fd5b5035611c08565b34801561058857600080fd5b506104386004803603604081101561059f57600080fd5b50600160a060020a038135169060200135611c3a565b3480156105c157600080fd5b506104ac611ce3565b3480156105d657600080fd5b506104dd600480360360208110156105ed57600080fd5b5035611cf2565b34801561060057600080fd5b506106276004803603602081101561061757600080fd5b5035600160a060020a0316611dcb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066357818101518382015260200161064b565b505050509050019250505060405180910390f35b34801561068357600080fd5b5061068c611e8e565b60408051918252519081900360200190f35b3480156106aa57600080fd5b50610438600480360360208110156106c157600080fd5b503560ff16611e94565b3480156106d757600080fd5b50610438600480360360208110156106ee57600080fd5b5035600160a060020a0316611f65565b34801561070a57600080fd5b506104ac612040565b34801561071f57600080fd5b5061068c6120e0565b34801561073457600080fd5b506104386004803603606081101561074b57600080fd5b50600160a060020a0381358116916020810135909116906040013561216f565b34801561077757600080fd5b506107956004803603602081101561078e57600080fd5b503561235c565b6040805160ff938416815291909216602082015281519081900390910190f35b3480156107c157600080fd5b50610438600480360360208110156107d857600080fd5b5035600160a060020a03166123c4565b3480156107f457600080fd5b506104386004803603604081101561080b57600080fd5b8135919081019060408101602082013564010000000081111561082d57600080fd5b82018360208201111561083f57600080fd5b8035906020019184600183028401116401000000008311171561086157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061245e945050505050565b3480156108ae57600080fd5b50610438600480360360408110156108c557600080fd5b508035906020013567ffffffffffffffff1661253b565b3480156108e857600080fd5b50610438600480360360208110156108ff57600080fd5b5035600160a060020a031661262a565b34801561091b57600080fd5b506104ac612705565b34801561093057600080fd5b506104836004803603602081101561094757600080fd5b5035612714565b34801561095a57600080fd5b506104386004803603604081101561097157600080fd5b8135919081019060408101602082013564010000000081111561099357600080fd5b8201836020820111156109a557600080fd5b803590602001918460018302840111640100000000831117156109c757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612940945050505050565b348015610a1457600080fd5b5061068c60048036036040811015610a2b57600080fd5b50600160a060020a038135169060200135612a50565b348015610a4d57600080fd5b50610a6b60048036036020811015610a6457600080fd5b5035612a9d565b604051808760ff1660ff1681526020018667ffffffffffffffff1667ffffffffffffffff168152602001858152602001806020018415151515815260200183151515158152602001828103825285818151815260200191508051906020019080838360005b83811015610ae8578181015183820152602001610ad0565b50505050905090810190601f168015610b155780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610b3457600080fd5b50610438612c41565b348015610b4957600080fd5b5061043860048036036020811015610b6057600080fd5b503560ff16612d0b565b348015610b7657600080fd5b5061043860048036036060811015610b8d57600080fd5b50600160a060020a03813581169160208101359091169060400135612dc9565b348015610bb957600080fd5b5061043860048036036020811015610bd057600080fd5b5035600160a060020a0316612de5565b348015610bec57600080fd5b5061068c60048036036020811015610c0357600080fd5b5035612ec0565b348015610c1657600080fd5b506104ac60048036036020811015610c2d57600080fd5b5035612ef5565b610c5160048036036020811015610c4a57600080fd5b5035612f8c565b60408051938452602084019290925282820152519081900360600190f35b348015610c7b57600080fd5b5061043860048036036040811015610c9257600080fd5b81359190810190604081016020820135640100000000811115610cb457600080fd5b820183602082011115610cc657600080fd5b80359060200191846001830284011164010000000083111715610ce857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613043945050505050565b348015610d3557600080fd5b5061043860048036036040811015610d4c57600080fd5b81359190810190604081016020820135640100000000811115610d6e57600080fd5b820183602082011115610d8057600080fd5b80359060200191846001830284011164010000000083111715610da257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061311b945050505050565b348015610def57600080fd5b506104836131df565b348015610e0457600080fd5b5061043860048036036020811015610e1b57600080fd5b5035600160a060020a03166131ef565b348015610e3757600080fd5b506104ac60048036036020811015610e4e57600080fd5b5035613275565b348015610e6157600080fd5b5061043860048036036040811015610e7857600080fd5b50803590602001351515613290565b348015610e9357600080fd5b506104ac60048036036020811015610eaa57600080fd5b503561335a565b348015610ebd57600080fd5b5061068c60048036036020811015610ed457600080fd5b5035600160a060020a0316613384565b348015610ef057600080fd5b506104386133b7565b348015610f0557600080fd5b506104386004803603610160811015610f1d57600080fd5b810190602081018135640100000000811115610f3857600080fd5b820183602082011115610f4a57600080fd5b80359060200191846001830284011164010000000083111715610f6c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610fbf57600080fd5b820183602082011115610fd157600080fd5b80359060200191846001830284011164010000000083111715610ff357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561104657600080fd5b82018360208201111561105857600080fd5b8035906020019184600183028401116401000000008311171561107a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156110cd57600080fd5b8201836020820111156110df57600080fd5b8035906020019184600183028401116401000000008311171561110157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561115457600080fd5b82018360208201111561116657600080fd5b8035906020019184600183028401116401000000008311171561118857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156111db57600080fd5b8201836020820111156111ed57600080fd5b8035906020019184600183028401116401000000008311171561120f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505067ffffffffffffffff60208301358116926040810135909116915060ff60608201351690608001351515613418565b34801561128657600080fd5b506104ac6004803603602081101561129d57600080fd5b503561344a565b3480156112b057600080fd5b50610438613465565b3480156112c557600080fd5b50610438613518565b3480156112da57600080fd5b506112e3613583565b6040805163ffffffff9092168252519081900360200190f35b34801561130857600080fd5b506104386004803603602081101561131f57600080fd5b5035600160a060020a03166135aa565b34801561133b57600080fd5b506104ac613659565b34801561135057600080fd5b506104836004803603608081101561136757600080fd5b50803590600160a060020a036020820135169060408101359060600135613668565b34801561139557600080fd5b506104ac613904565b3480156113aa57600080fd5b5061068c600480360360208110156113c157600080fd5b5035613913565b3480156113d457600080fd5b50610438600480360360408110156113eb57600080fd5b508035906020013567ffffffffffffffff16613978565b34801561140e57600080fd5b506104386004803603602081101561142557600080fd5b5035600160a060020a0316613a53565b34801561144157600080fd5b506104dd613ad9565b34801561145657600080fd5b5061068c6004803603602081101561146d57600080fd5b5035600160a060020a0316613b3a565b6104386004803603602081101561149357600080fd5b5035613b4c565b3480156114a657600080fd5b50610483600480360360408110156114bd57600080fd5b813591908101906040810160208201356401000000008111156114df57600080fd5b8201836020820111156114f157600080fd5b8035906020019184600183028401116401000000008311171561151357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613da4945050505050565b34801561156057600080fd5b506104386004803603604081101561157757600080fd5b50600160a060020a0381351690602001351515613e89565b34801561159b57600080fd5b506104ac613f0d565b3480156115b057600080fd5b50610438600480360360408110156115c757600080fd5b508035906020013560ff16613f1c565b3480156115e357600080fd5b50610438600480360360808110156115fa57600080fd5b600160a060020a0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561163557600080fd5b82018360208201111561164757600080fd5b8035906020019184600183028401116401000000008311171561166957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613ffd945050505050565b3480156116b657600080fd5b506116d4600480360360208110156116cd57600080fd5b5035614025565b60405180806020018060200180602001806020018667ffffffffffffffff1667ffffffffffffffff16815260200185810385528a818151815260200191508051906020019080838360005b8381101561173757818101518382015260200161171f565b50505050905090810190601f1680156117645780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b8381101561179757818101518382015260200161177f565b50505050905090810190601f1680156117c45780820380516001836020036101000a031916815260200191505b5085810383528851815288516020918201918a019080838360005b838110156117f75781810151838201526020016117df565b50505050905090810190601f1680156118245780820380516001836020036101000a031916815260200191505b50858103825287518152875160209182019189019080838360005b8381101561185757818101518382015260200161183f565b50505050905090810190601f1680156118845780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156118a557600080fd5b506104dd600480360360208110156118bc57600080fd5b5035614326565b3480156118cf57600080fd5b50610438600480360360408110156118e657600080fd5b8135919081019060408101602082013564010000000081111561190857600080fd5b82018360208201111561191a57600080fd5b8035906020019184600183028401116401000000008311171561193c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506143db945050505050565b34801561198957600080fd5b50610438600480360360608110156119a057600080fd5b50803590602081013590604001356144b3565b3480156119bf57600080fd5b50610438600480360360408110156119d657600080fd5b508035906020013560ff16614648565b3480156119f257600080fd5b5061048360048036036040811015611a0957600080fd5b50600160a060020a0381358116916020013516614729565b61043860048036036080811015611a3757600080fd5b5080359060208101359060408101359060600135600160a060020a0316614757565b348015611a6557600080fd5b5061043860048036036040811015611a7c57600080fd5b5080359060200135614884565b348015611a9557600080fd5b5061068c60048036036020811015611aac57600080fd5b5035614939565b348015611abf57600080fd5b5061043860048036036020811015611ad657600080fd5b5035600160a060020a03166149d6565b348015611af257600080fd5b506104ac6149f9565b348015611b0757600080fd5b5061043860048036036020811015611b1e57600080fd5b5035600160a060020a0316614a08565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600e54600160a060020a031681565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611bfd5780601f10611bd257610100808354040283529160200191611bfd565b820191906000526020600020905b815481529060010190602001808311611be057829003601f168201915b505050505090505b90565b6000611c1382614ab9565b1515611c1e57600080fd5b50600090815260026020526040902054600160a060020a031690565b6000611c458261335a565b9050600160a060020a038381169082161415611c6057600080fd5b33600160a060020a0382161480611c7c5750611c7c8133614729565b1515611c8757600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d54600160a060020a031681565b6000818152601460205260409020546060908290600160a060020a03163314611d1a57600080fd5b6013805484908110611d2857fe5b60009182526020918290206003600a9092020101805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015611dbe5780601f10611d9357610100808354040283529160200191611dbe565b820191906000526020600020905b815481529060010190602001808311611da157829003601f168201915b5050505050915050919050565b6060806015600084600160a060020a0316600160a060020a0316815260200190815260200160002054604051908082528060200260200182016040528015611e1d578160200160208202803883390190505b5090506000805b601354811015611e8557600081815260146020526040902054600160a060020a0386811691161415611e7d57808383815181101515611e5f57fe5b60209081029091010152611e7a82600163ffffffff614ad616565b91505b600101611e24565b50909392505050565b60075490565b600f54600160a060020a0316331480611eb75750600d54600160a060020a031633145b80611ecc5750600e54600160a060020a031633145b80611ee15750601254600160a060020a031633145b1515611f215760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b6012805460ff90921675010000000000000000000000000000000000000000000275ff00000000000000000000000000000000000000000019909216919091179055565b600f54600160a060020a0316331480611f885750600d54600160a060020a031633145b80611f9d5750600e54600160a060020a031633145b80611fb25750601254600160a060020a031633145b1515611ff25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561200957600080fd5b600160a060020a038116151561201e57600080fd5b60108054600160a060020a031916600160a060020a0392909216919091179055565b600f54600090600160a060020a03163314806120665750600d54600160a060020a031633145b8061207b5750600e54600160a060020a031633145b806120905750601254600160a060020a031633145b15156120d05760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b50601154600160a060020a031690565b601954604080517f0d9005ae0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691630d9005ae916004808301926020929190829003018186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d602081101561216857600080fd5b5051905090565b600c5460a060020a900460ff161561218657600080fd5b601954604080517f89accba5000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a0316916389accba5916024808301926020929190829003018186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b5051601954604080517ff20e5e35000000000000000000000000000000000000000000000000000000008152600481018490529051929350600092600160a060020a039092169163f20e5e359160248082019260a092909190829003018186803b15801561228257600080fd5b505afa158015612296573d6000803e3d6000fd5b505050506040513d60a08110156122ac57600080fd5b50608001519050600181146122c057600080fd5b6122cb858585614ae3565b6122d6858585614b71565b601754604080517f84991fa8000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916384991fa891602480830192600092919082900301818387803b15801561233d57600080fd5b505af1158015612351573d6000803e3d6000fd5b505050505050505050565b60008060138381548110151561236e57fe5b90600052602060002090600a020160050160089054906101000a900460ff1660138481548110151561239c57fe5b90600052602060002090600a020160050160099054906101000a900460ff1691509150915091565b600d54600160a060020a031633146124105760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561242757600080fd5b600160a060020a038116151561243c57600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600f54600160a060020a03163314806124815750600d54600160a060020a031633145b806124965750600e54600160a060020a031633145b806124ab5750601254600160a060020a031633145b15156124eb5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561250257600080fd5b8060138381548110151561251257fe5b90600052602060002090600a02016000019080519060200190612536929190615c53565b505050565b600f54600160a060020a031633148061255e5750600d54600160a060020a031633145b806125735750600e54600160a060020a031633145b806125885750601254600160a060020a031633145b15156125c85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156125df57600080fd5b806013838154811015156125ef57fe5b90600052602060002090600a020160050160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600f54600160a060020a031633148061264d5750600d54600160a060020a031633145b806126625750600e54600160a060020a031633145b806126775750601254600160a060020a031633145b15156126b75760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156126ce57600080fd5b600160a060020a03811615156126e357600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b601154600160a060020a031681565b600f54600090600160a060020a031633148061273a5750600d54600160a060020a031633145b8061274f5750600e54600160a060020a031633145b806127645750601254600160a060020a031633145b15156127a45760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156127bb57600080fd5b8160006127c782612a9d565b50945050505081151560011490506127de57600080fd5b60008481526014602090815260408083208054600160a060020a03198116909155600160a060020a031680845260159092529091205461282590600163ffffffff614d6116565b600160a060020a0382166000908152601560205260409020556128488186614d73565b601380548690811061285657fe5b600091825260208220600a90910201906128708282615cd1565b61287e600183016000615cd1565b61288c600283016000615cd1565b61289a600383016000615cd1565b6128a8600483016000615cd1565b60058201805469ffffffffffffffffffff1916905560068201805468ffffffffffffffffff191681556000600784018190556128e76008850182615cd1565b50600301805461ffff19169055505060408051600160a060020a0383168152905186917fbdfa951bad4bf2b0fd50f185e31e2dd8a65886d3c650d38151d30fcaabca46e8919081900360200190a2506001949350505050565b600f54600160a060020a03163314806129635750600d54600160a060020a031633145b806129785750600e54600160a060020a031633145b8061298d5750601254600160a060020a031633145b15156129cd5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156129e457600080fd5b806013838154811015156129f457fe5b90600052602060002090600a02016003019080519060200190612a18929190615c53565b506040805183815290517f6c6e7adf43b1b050caae0d2e59b2e5bd7dea7978e49178adb602129c505ce4c59181900360200190a15050565b6000612a5b83613384565b8210612a6657600080fd5b600160a060020a0383166000908152600560205260409020805483908110612a8a57fe5b9060005260206000200154905092915050565b60008060006060600080601387815481101515612ab657fe5b600091825260209091206006600a9092020101546013805460ff9092169189908110612ade57fe5b90600052602060002090600a020160060160000160019054906101000a900467ffffffffffffffff16601389815481101515612b1657fe5b90600052602060002090600a02016006016001015460138a815481101515612b3a57fe5b90600052602060002090600a020160060160020160138b815481101515612b5d57fe5b600091825260209091206009600a9092020101546013805460ff909216918d908110612b8557fe5b6000918252602091829020600a9190910201600901548354604080516002610100600185161581026000190190941604601f81018690048602820186019092528181529190920460ff169290918591830182828015612c255780601f10612bfa57610100808354040283529160200191612c25565b820191906000526020600020905b815481529060010190602001808311612c0857829003601f168201915b5050505050925095509550955095509550955091939550919395565b600d54600160a060020a03163314612c8d5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161515612ca557600080fd5b600d54600160a060020a03161515612cbc57600080fd5b601954600160a060020a03161515612cd357600080fd5b601754600160a060020a03161515612cea57600080fd5b601154600160a060020a03161515612d0157600080fd5b612d09614dbf565b565b600f54600160a060020a0316331480612d2e5750600d54600160a060020a031633145b80612d435750600e54600160a060020a031633145b80612d585750601254600160a060020a031633145b1515612d985760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b6012805460ff90921660a060020a0274ff000000000000000000000000000000000000000019909216919091179055565b6125368383836020604051908101604052806000815250613ffd565b600f54600160a060020a0316331480612e085750600d54600160a060020a031633145b80612e1d5750600e54600160a060020a031633145b80612e325750601254600160a060020a031633145b1515612e725760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615612e8957600080fd5b600160a060020a0381161515612e9e57600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b6000612eca611e8e565b8210612ed557600080fd5b6007805483908110612ee357fe5b90600052602060002001549050919050565b601954604080517f5fe36b81000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a031691635fe36b81916024808301926020929190829003018186803b158015612f5a57600080fd5b505afa158015612f6e573d6000803e3d6000fd5b505050506040513d6020811015612f8457600080fd5b505192915050565b600c546000908190819060a060020a900460ff1615612faa57600080fd5b6000606434601387815481101515612fbe57fe5b60009182526020909120600a90910201600501546901000000000000000000900460ff1602811515612fec57fe5b049050600060643460138881548110151561300357fe5b60009182526020909120600a909102016005015468010000000000000000900460ff160281151561303057fe5b9297920495505084860134039350915050565b600f54600160a060020a03163314806130665750600d54600160a060020a031633145b8061307b5750600e54600160a060020a031633145b806130905750601254600160a060020a031633145b15156130d05760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156130e757600080fd5b806013838154811015156130f757fe5b90600052602060002090600a02016002019080519060200190612536929190615c53565b600f54600160a060020a031633148061313e5750600d54600160a060020a031633145b806131535750600e54600160a060020a031633145b806131685750601254600160a060020a031633145b15156131a85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b806013838154811015156131b857fe5b90600052602060002090600a02016006016002019080519060200190612536929190615c53565b600c5460a060020a900460ff1681565b600d54600160a060020a0316331461323b5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff16151561325357600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b601660205260009081526040902054600160a060020a031681565b600f54600160a060020a03163314806132b35750600d54600160a060020a031633145b806132c85750600e54600160a060020a031633145b806132dd5750601254600160a060020a031633145b151561331d5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b8060138381548110151561332d57fe5b600091825260209091206009600a909202010180549115156101000261ff00199092169190911790555050565b600081815260016020526040812054600160a060020a031680151561337e57600080fd5b92915050565b6000600160a060020a038216151561339b57600080fd5b50600160a060020a031660009081526003602052604090205490565b600c54600160a060020a031633146133ce57600080fd5b600c54604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600c8054600160a060020a0319169055565b61342b8b8b8b8b8b8b8b8b8b8b8b614ead565b60135461343d90339060001901615388565b5050505050505050505050565b601460205260009081526040902054600160a060020a031681565b600f54600160a060020a03163314806134885750600d54600160a060020a031633145b8061349d5750600e54600160a060020a031633145b806134b25750601254600160a060020a031633145b15156134f25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16151561350a57600080fd5b601254600160a060020a0316ff5b600d54600160a060020a031633146135645760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561357b57600080fd5b612d096153d7565b60125477010000000000000000000000000000000000000000000000900463ffffffff1681565b600f54600160a060020a03163314806135cd5750600d54600160a060020a031633145b806135e25750600e54600160a060020a031633145b806135f75750601254600160a060020a031633145b15156136375760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b601054600160a060020a031681565b600f54600090600160a060020a031633148061368e5750600d54600160a060020a031633145b806136a35750600e54600160a060020a031633145b806136b85750601254600160a060020a031633145b15156136f85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561370f57600080fd5b601954604080517ff20e5e35000000000000000000000000000000000000000000000000000000008152600481018890529051600092600160a060020a03169163f20e5e359160248083019260a0929190829003018186803b15801561377457600080fd5b505afa158015613788573d6000803e3d6000fd5b505050506040513d60a081101561379e57600080fd5b50516013805491925090829081106137b257fe5b60009182526020909120600a9091020160060154610100900467ffffffffffffffff168410156137e157600080fd5b6137eb8582611c3a565b601954604080517f04b40f6900000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a03888116602483015260448201889052915191909216916304b40f6991606480830192600092919082900301818387803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b5050601754604080517f0d498b61000000000000000000000000000000000000000000000000000000008152600481018890529051600160a060020a039092169350630d498b61925060248082019260009290919082900301818387803b1580156138de57600080fd5b505af11580156138f2573d6000803e3d6000fd5b5050505060019150505b949350505050565b601254600160a060020a031681565b601954604080517f4b554954000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a031691634b554954916024808301926020929190829003018186803b158015612f5a57600080fd5b600f54600160a060020a031633148061399b5750600d54600160a060020a031633145b806139b05750600e54600160a060020a031633145b806139c55750601254600160a060020a031633145b1515613a055760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b80601383815481101515613a1557fe5b90600052602060002090600a020160060160000160016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600d54600160a060020a03163314613a9f5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161515613ab757600080fd5b60198054600160a060020a031916600160a060020a0392909216919091179055565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611bfd5780601f10611bd257610100808354040283529160200191611bfd565b60156020526000908152604090205481565b601954604080517f83e2e0a800000000000000000000000000000000000000000000000000000000815260048101849052336024820152905160009283928392600160a060020a03909216916383e2e0a891604480820192606092909190829003018186803b158015613bbe57600080fd5b505afa158015613bd2573d6000803e3d6000fd5b505050506040513d6060811015613be857600080fd5b50805160208201516040909201519094509092509050600080613c0b8484615442565b5091509150823410151515613c1f57600080fd5b6000613c31348463ffffffff614d6116565b90506000613c45348463ffffffff614d6116565b601154909150600160a060020a03166108fc613c67348563ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015613c8f573d6000803e3d6000fd5b50600160a060020a0387166108fc613cad348463ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015613cd5573d6000803e3d6000fd5b50601754604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015613d10573d6000803e3d6000fd5b50601954604080517f6d25e48e000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a0390921691636d25e48e9160248082019260009290919082900301818387803b158015613d7757600080fd5b505af1158015613d8b573d6000803e3d6000fd5b50505050613d9a87338861216f565b5050505050505050565b600f54600090600160a060020a0316331480613dca5750600d54600160a060020a031633145b80613ddf5750600e54600160a060020a031633145b80613df45750601254600160a060020a031633145b1515613e345760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615613e4b57600080fd5b81601384815481101515613e5b57fe5b90600052602060002090600a02016004019080519060200190613e7f929190615c53565b5060019392505050565b600160a060020a038216331415613e9f57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600f54600160a060020a031681565b600f54600160a060020a0316331480613f3f5750600d54600160a060020a031633145b80613f545750600e54600160a060020a031633145b80613f695750601254600160a060020a031633145b1515613fa95760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615613fc057600080fd5b80601383815481101515613fd057fe5b90600052602060002090600a020160050160086101000a81548160ff021916908360ff1602179055505050565b61400884848461216f565b614014848484846154fa565b151561401f57600080fd5b50505050565b606080606080600060138681548110151561403c57fe5b90600052602060002090600a020160000160138781548110151561405c57fe5b90600052602060002090600a020160010160138881548110151561407c57fe5b90600052602060002090600a020160020160138981548110151561409c57fe5b90600052602060002090600a020160040160138a8154811015156140bc57fe5b60009182526020918290206005600a909202010154855460408051601f6002600019600186161561010002019094169390930492830185900485028101850190915281815267ffffffffffffffff909216928791908301828280156141625780601f1061413757610100808354040283529160200191614162565b820191906000526020600020905b81548152906001019060200180831161414557829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156141f05780601f106141c5576101008083540402835291602001916141f0565b820191906000526020600020905b8154815290600101906020018083116141d357829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529599508894509250840190508282801561427e5780601f106142535761010080835404028352916020019161427e565b820191906000526020600020905b81548152906001019060200180831161426157829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529598508794509250840190508282801561430c5780601f106142e15761010080835404028352916020019161430c565b820191906000526020600020905b8154815290600101906020018083116142ef57829003601f168201915b505050505091509450945094509450945091939590929450565b606061433182614ab9565b151561433c57600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156143cf5780601f106143a4576101008083540402835291602001916143cf565b820191906000526020600020905b8154815290600101906020018083116143b257829003601f168201915b50505050509050919050565b600f54600160a060020a03163314806143fe5750600d54600160a060020a031633145b806144135750600e54600160a060020a031633145b806144285750601254600160a060020a031633145b15156144685760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561447f57600080fd5b8060138381548110151561448f57fe5b90600052602060002090600a02016001019080519060200190612536929190615c53565b600c5460a060020a900460ff16156144ca57600080fd5b336144d48461335a565b600160a060020a03161461451c5760405160e560020a62461bcd028152600401808060200182810382526031815260200180615e7e6031913960400191505060405180910390fd5b601380548490811061452a57fe5b60009182526020909120600a9091020160060154610100900467ffffffffffffffff1682101561455957600080fd5b601954604080517f819c9e4c0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490523360648201529051600160a060020a039092169163819c9e4c9160848082019260009290919082900301818387803b1580156145d357600080fd5b505af11580156145e7573d6000803e3d6000fd5b50506012546146039250600160a060020a031690506001613e89565b600d5461461a90600160a060020a03166001613e89565b600e5461463190600160a060020a03166001613e89565b600f5461253690600160a060020a03166001613e89565b600f54600160a060020a031633148061466b5750600d54600160a060020a031633145b806146805750600e54600160a060020a031633145b806146955750601254600160a060020a031633145b15156146d55760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156146ec57600080fd5b806013838154811015156146fc57fe5b90600052602060002090600a020160050160096101000a81548160ff021916908360ff1602179055505050565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c5460a060020a900460ff161561476e57600080fd5b8383018201348111156147b55760405160e560020a62461bcd028152600401808060200182810382526038815260200180615eaf6038913960400191505060405180910390fd5b601154600160a060020a03166108fc6147d4348863ffffffff614d6116565b6040518115909202916000818181858888f193505050501580156147fc573d6000803e3d6000fd5b50600160a060020a0382166108fc61481a348763ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015614842573d6000803e3d6000fd5b50601754604051600160a060020a03909116903480156108fc02916000818181858888f1935050505015801561487c573d6000803e3d6000fd5b505050505050565b600f54600160a060020a03163314806148a75750600d54600160a060020a031633145b806148bc5750600e54600160a060020a031633145b806148d15750601254600160a060020a031633145b15156149115760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b8060138381548110151561492157fe5b600091825260209091206007600a9092020101555050565b601954604080517ff20e5e350000000000000000000000000000000000000000000000000000000081526004810184905290516000928392600160a060020a039091169163f20e5e359160248082019260a092909190829003018186803b1580156149a357600080fd5b505afa1580156149b7573d6000803e3d6000fd5b505050506040513d60a08110156149cd57600080fd5b50519392505050565b600c54600160a060020a031633146149ed57600080fd5b6149f681615676565b50565b601754600160a060020a031681565b600f54600160a060020a0316331480614a2b5750600d54600160a060020a031633145b80614a405750600e54600160a060020a031633145b80614a555750601254600160a060020a031633145b1515614a955760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161515614aad57600080fd5b80600160a060020a0316ff5b600090815260016020526040902054600160a060020a0316151590565b8181018281101561337e57fe5b614aed33826156e7565b1515614af857600080fd5b600160a060020a0382161515614b0d57600080fd5b614b17838261573e565b614b2183826157a0565b614b2b82826158a2565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600160a060020a038216600090815260156020526040902054614b9b90600163ffffffff614ad616565b600160a060020a038084166000908152601560205260408082209390935590851681522054614bd190600163ffffffff614d6116565b600160a060020a0384811660009081526015602090815260408083209490945584825260149052919091208054600160a060020a0319169184169190911790556013805482908110614c1f57fe5b600091825260209091206009600a90920201015460ff1615614cb0576060601382815481101515614c4c57fe5b90600052602060002090600a020160050160086101000a81548160ff021916908360ff1602179055506003601382815481101515614c8657fe5b90600052602060002090600a020160050160096101000a81548160ff021916908360ff1602179055505b6000601382815481101515614cc157fe5b60009182526020909120600a90910201600901805460ff19169115159190911790556013805482908110614cf157fe5b60009182526020918290206005600a90920201015460408051600160a060020a038088168252861693810193909352805167ffffffffffffffff9092169284927f23f50d55776d8003622a982ade45a6c7f083116c8dbbcd980f59942f440badb1929181900390910190a3505050565b600082821115614d6d57fe5b50900390565b614d7d82826158e8565b6000818152600b60205260409020546002600019610100600184161502019091160415614dbb576000818152600b60205260408120614dbb91615cd1565b5050565b600f54600160a060020a0316331480614de25750600d54600160a060020a031633145b80614df75750600e54600160a060020a031633145b80614e0c5750601254600160a060020a031633145b1515614e4c5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161515614e6457600080fd5b600c805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b601254600060a060020a90910460ff1611614efc5760405160e560020a62461bcd028152600401808060200182810382526021815260200180615ee76021913960400191505060405180910390fd5b6012546000750100000000000000000000000000000000000000000090910460ff1611614f5d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180615e25602b913960400191505060405180910390fd5b600c5460a060020a900460ff1615614f7457600080fd5b614f7c615d15565b506040805160c08101825260ff8416815267ffffffffffffffff85166020820152908101869052606081018890526001608082015281151560a0820152614fc1615d49565b5060408051610120810182528d815260208082018e90529181018c9052606081018b90526080810189905267ffffffffffffffff871660a082015260125460ff75010000000000000000000000000000000000000000008204811660c084015260a060020a9091041660e0820152610100810183905260138054600181810180845560009384528451805195969495929491938793600a9091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090019261508c928492910190615c53565b5060208281015180516150a59260018501920190615c53565b50604082015180516150c1916002840191602090910190615c53565b50606082015180516150dd916003840191602090910190615c53565b50608082015180516150f9916004840191602090910190615c53565b5060a082015160058201805460c085015160e086015167ffffffffffffffff1990921667ffffffffffffffff9485161768ff000000000000000019166801000000000000000060ff928316021769ff00000000000000000019166901000000000000000000928216929092029190911790915561010080850151805160068601805460208085015160ff19909216939096169290921768ffffffffffffffff0019169190951690920291909117835560408101516007850155606081015180519193926151ce92600887019290910190615c53565b5060808201516003909101805460a09093015115156101000261ff001992151560ff19909416939093179190911691909117905550500360008181526014602090815260408083208054600160a060020a031916339081179091558352601590915290205490915061524790600163ffffffff614ad616565b6015600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507fcde99b9efee390265235bbcaf4265100bf0707838094ed6b2c22384636581746818f8f604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156152db5781810151838201526020016152c3565b50505050905090810190601f1680156153085780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561533b578181015183820152602001615323565b50505050905090810190601f1680156153685780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050505050505050565b61539282826159a1565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b600d54600160a060020a031633146154235760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561543a57600080fd5b612d096159fc565b600c546000908190819060a060020a900460ff161561546057600080fd5b600060648560138881548110151561547457fe5b60009182526020909120600a90910201600501546901000000000000000000900460ff16028115156154a257fe5b04905060006064866013898154811015156154b957fe5b60009182526020909120600a909102016005015468010000000000000000900460ff16028115156154e657fe5b929892049650508587019094039392505050565b600061550e84600160a060020a0316615aef565b151561551c575060016138fc565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b838110156155af578181015183820152602001615597565b50505050905090810190601f1680156155dc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156155fe57600080fd5b505af1158015615612573d6000803e3d6000fd5b505050506040513d602081101561562857600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f150b7a020000000000000000000000000000000000000000000000000000000014915050949350505050565b600160a060020a038116151561568b57600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000806156f38361335a565b905080600160a060020a031684600160a060020a0316148061572e575083600160a060020a031661572384611c08565b600160a060020a0316145b806138fc57506138fc8185614729565b81600160a060020a03166157518261335a565b600160a060020a03161461576457600080fd5b600081815260026020526040902054600160a060020a031615614dbb5760009081526002602052604090208054600160a060020a031916905550565b6157aa8282615af7565b600081815260066020908152604080832054600160a060020a038616845260059092528220549091906157e490600163ffffffff614d6116565b600160a060020a0385166000908152600560205260408120805492935090918390811061580d57fe5b90600052602060002001549050806005600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561584d57fe5b6000918252602080832090910192909255600160a060020a0387168152600590915260409020805490615884906000198301615dab565b50600093845260066020526040808520859055908452909220555050565b6158ac8282615b80565b600160a060020a039091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b6158f28282615c03565b60008181526008602052604081205460075490919061591890600163ffffffff614d6116565b9050600060078281548110151561592b57fe5b906000526020600020015490508060078481548110151561594857fe5b6000918252602082200191909155600780548490811061596457fe5b6000918252602090912001556007805490615983906000198301615dab565b50600093845260086020526040808520859055908452909220555050565b600160a060020a03821615156159b657600080fd5b6159c082826158a2565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f54600160a060020a0316331480615a1f5750600d54600160a060020a031633145b80615a345750600e54600160a060020a031633145b80615a495750601254600160a060020a031633145b1515615a895760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615615aa057600080fd5b600c805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000903b1190565b81600160a060020a0316615b0a8261335a565b600160a060020a031614615b1d57600080fd5b600160a060020a038216600090815260036020526040902054615b4790600163ffffffff614d6116565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b600081815260016020526040902054600160a060020a031615615ba257600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054615be391614ad6565b600160a060020a0390921660009081526003602052604090209190915550565b615c0d828261573e565b615c1782826157a0565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c9457805160ff1916838001178555615cc1565b82800160010185558215615cc1579182015b82811115615cc1578251825591602001919060010190615ca6565b50615ccd929150615dcb565b5090565b50805460018160011615610100020316600290046000825580601f10615cf757506149f6565b601f0160209004906000526020600020908101906149f69190615dcb565b6040805160c0810182526000808252602082018190529181018290526060808201526080810182905260a081019190915290565b6101c0604051908101604052806060815260200160608152602001606081526020016060815260200160608152602001600067ffffffffffffffff168152602001600060ff168152602001600060ff168152602001615da6615d15565b905290565b815481835581811115612536576000838152602090206125369181019083015b611c0591905b80821115615ccd5760008155600101615dd156fe596f75206e65656420746f20626520746865206f776e6572206f72206120436c6576656c204042414520746f2063616c6c20746869732066756e6374696f6e5265717569726573206120616e2061727469737420666565206c6576656c20746f206265207365742075704f6e6c79206f75722043454f20616464726573732063616e206578656375746520746869732066756e6374696f6e596f752063616e2774207472616e7366657220616e206172747069656365207768696368206973206e6f7420796f75727356616c7565206d75737420626520657175616c206f722067726561746572207468616e2074686520636f7374206f662074686520666565735265717569726573206120666565206c6576656c20746f20626520736574207570a165627a7a72305820045b0d0a32d16dd230e7ca1f355fd46d44ddc5dacffe327b30b77e752337c8f70029
Deployed Bytecode
0x608060405260043610610438576000357c0100000000000000000000000000000000000000000000000000000000900480635fa66b321161023b5780639a95ac4b11610140578063cda4beef116100c8578063eab31fc911610097578063eab31fc914611a59578063f20e5e3514611a89578063f2fde38b14611ab3578063f343d68314611ae6578063f5074f4114611afb57610438565b8063cda4beef1461197d578063d939c13a146119b3578063e985e9c5146119e6578063ea0a977314611a2157610438565b8063b3a03a261161010f578063b3a03a26146115a4578063b88d4fde146115d7578063c4d74d50146116aa578063c87b56dd14611899578063cb33420b146118c357610438565b80639a95ac4b1461147d5780639ace64961461149a578063a22cb46514611554578063b047fb501461158f57610438565b80638ab8d19e116101c35780638f288644116101925780638f2886441461139e57806391ef4c7e146113c857806393ac36381461140257806395d89b4114611435578063997f8b0a1461144a57610438565b80638ab8d19e146112fc5780638c267b971461132f5780638d59767c146113445780638da5cb5b1461138957610438565b806379b58a631161020a57806379b58a6314610ef95780638121bfef1461127a57806383197ef0146112a45780638456cb59146112b9578063889f22cb146112ce57610438565b80635fa66b3214610e555780636352211e14610e8757806370a0823114610eb1578063715018a614610ee457610438565b80632ba73c15116103415780634e0a3379116102c95780635387253f116102985780635387253f14610c6f5780635b89a38a14610d295780635c975abb14610de35780635e1e100414610df85780635f4968de14610e2b57610438565b80634e0a337914610bad5780634f6ccce714610be0578063515371a314610c0a57806352238fdd14610c3457610438565b80632f745c59116103105780632f745c5914610a085780632fba521114610a415780633f4ba83a14610b2857806340d7ce1414610b3d57806342842e0e14610b6a57610438565b80632ba73c15146108dc5780632bc334e41461090f5780632c4b4a29146109245780632e584ade1461094e57610438565b80631dc9fc61116103c457806323b872dd1161039357806323b872dd1461072857806327d328721461076b57806327d7874c146107b55780632a1d0b16146107e85780632ba27019146108a257610438565b80631dc9fc611461069e5780632072863b146106cb578063215f02f4146106fe57806321d354fd1461071357610438565b8063095ea7b31161040b578063095ea7b31461057c5780630a0f8168146105b557806311229c53146105ca578063134e89f0146105f457806318160ddd1461067757610438565b806301ffc9a71461043a5780630519ce791461049757806306fdde03146104c8578063081812fc14610552575b005b34801561044657600080fd5b506104836004803603602081101561045d57600080fd5b50357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916611b2e565b604080519115158252519081900360200190f35b3480156104a357600080fd5b506104ac611b62565b60408051600160a060020a039092168252519081900360200190f35b3480156104d457600080fd5b506104dd611b71565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105175781810151838201526020016104ff565b50505050905090810190601f1680156105445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055e57600080fd5b506104ac6004803603602081101561057557600080fd5b5035611c08565b34801561058857600080fd5b506104386004803603604081101561059f57600080fd5b50600160a060020a038135169060200135611c3a565b3480156105c157600080fd5b506104ac611ce3565b3480156105d657600080fd5b506104dd600480360360208110156105ed57600080fd5b5035611cf2565b34801561060057600080fd5b506106276004803603602081101561061757600080fd5b5035600160a060020a0316611dcb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066357818101518382015260200161064b565b505050509050019250505060405180910390f35b34801561068357600080fd5b5061068c611e8e565b60408051918252519081900360200190f35b3480156106aa57600080fd5b50610438600480360360208110156106c157600080fd5b503560ff16611e94565b3480156106d757600080fd5b50610438600480360360208110156106ee57600080fd5b5035600160a060020a0316611f65565b34801561070a57600080fd5b506104ac612040565b34801561071f57600080fd5b5061068c6120e0565b34801561073457600080fd5b506104386004803603606081101561074b57600080fd5b50600160a060020a0381358116916020810135909116906040013561216f565b34801561077757600080fd5b506107956004803603602081101561078e57600080fd5b503561235c565b6040805160ff938416815291909216602082015281519081900390910190f35b3480156107c157600080fd5b50610438600480360360208110156107d857600080fd5b5035600160a060020a03166123c4565b3480156107f457600080fd5b506104386004803603604081101561080b57600080fd5b8135919081019060408101602082013564010000000081111561082d57600080fd5b82018360208201111561083f57600080fd5b8035906020019184600183028401116401000000008311171561086157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061245e945050505050565b3480156108ae57600080fd5b50610438600480360360408110156108c557600080fd5b508035906020013567ffffffffffffffff1661253b565b3480156108e857600080fd5b50610438600480360360208110156108ff57600080fd5b5035600160a060020a031661262a565b34801561091b57600080fd5b506104ac612705565b34801561093057600080fd5b506104836004803603602081101561094757600080fd5b5035612714565b34801561095a57600080fd5b506104386004803603604081101561097157600080fd5b8135919081019060408101602082013564010000000081111561099357600080fd5b8201836020820111156109a557600080fd5b803590602001918460018302840111640100000000831117156109c757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612940945050505050565b348015610a1457600080fd5b5061068c60048036036040811015610a2b57600080fd5b50600160a060020a038135169060200135612a50565b348015610a4d57600080fd5b50610a6b60048036036020811015610a6457600080fd5b5035612a9d565b604051808760ff1660ff1681526020018667ffffffffffffffff1667ffffffffffffffff168152602001858152602001806020018415151515815260200183151515158152602001828103825285818151815260200191508051906020019080838360005b83811015610ae8578181015183820152602001610ad0565b50505050905090810190601f168015610b155780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b348015610b3457600080fd5b50610438612c41565b348015610b4957600080fd5b5061043860048036036020811015610b6057600080fd5b503560ff16612d0b565b348015610b7657600080fd5b5061043860048036036060811015610b8d57600080fd5b50600160a060020a03813581169160208101359091169060400135612dc9565b348015610bb957600080fd5b5061043860048036036020811015610bd057600080fd5b5035600160a060020a0316612de5565b348015610bec57600080fd5b5061068c60048036036020811015610c0357600080fd5b5035612ec0565b348015610c1657600080fd5b506104ac60048036036020811015610c2d57600080fd5b5035612ef5565b610c5160048036036020811015610c4a57600080fd5b5035612f8c565b60408051938452602084019290925282820152519081900360600190f35b348015610c7b57600080fd5b5061043860048036036040811015610c9257600080fd5b81359190810190604081016020820135640100000000811115610cb457600080fd5b820183602082011115610cc657600080fd5b80359060200191846001830284011164010000000083111715610ce857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613043945050505050565b348015610d3557600080fd5b5061043860048036036040811015610d4c57600080fd5b81359190810190604081016020820135640100000000811115610d6e57600080fd5b820183602082011115610d8057600080fd5b80359060200191846001830284011164010000000083111715610da257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061311b945050505050565b348015610def57600080fd5b506104836131df565b348015610e0457600080fd5b5061043860048036036020811015610e1b57600080fd5b5035600160a060020a03166131ef565b348015610e3757600080fd5b506104ac60048036036020811015610e4e57600080fd5b5035613275565b348015610e6157600080fd5b5061043860048036036040811015610e7857600080fd5b50803590602001351515613290565b348015610e9357600080fd5b506104ac60048036036020811015610eaa57600080fd5b503561335a565b348015610ebd57600080fd5b5061068c60048036036020811015610ed457600080fd5b5035600160a060020a0316613384565b348015610ef057600080fd5b506104386133b7565b348015610f0557600080fd5b506104386004803603610160811015610f1d57600080fd5b810190602081018135640100000000811115610f3857600080fd5b820183602082011115610f4a57600080fd5b80359060200191846001830284011164010000000083111715610f6c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610fbf57600080fd5b820183602082011115610fd157600080fd5b80359060200191846001830284011164010000000083111715610ff357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561104657600080fd5b82018360208201111561105857600080fd5b8035906020019184600183028401116401000000008311171561107a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156110cd57600080fd5b8201836020820111156110df57600080fd5b8035906020019184600183028401116401000000008311171561110157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561115457600080fd5b82018360208201111561116657600080fd5b8035906020019184600183028401116401000000008311171561118857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156111db57600080fd5b8201836020820111156111ed57600080fd5b8035906020019184600183028401116401000000008311171561120f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505067ffffffffffffffff60208301358116926040810135909116915060ff60608201351690608001351515613418565b34801561128657600080fd5b506104ac6004803603602081101561129d57600080fd5b503561344a565b3480156112b057600080fd5b50610438613465565b3480156112c557600080fd5b50610438613518565b3480156112da57600080fd5b506112e3613583565b6040805163ffffffff9092168252519081900360200190f35b34801561130857600080fd5b506104386004803603602081101561131f57600080fd5b5035600160a060020a03166135aa565b34801561133b57600080fd5b506104ac613659565b34801561135057600080fd5b506104836004803603608081101561136757600080fd5b50803590600160a060020a036020820135169060408101359060600135613668565b34801561139557600080fd5b506104ac613904565b3480156113aa57600080fd5b5061068c600480360360208110156113c157600080fd5b5035613913565b3480156113d457600080fd5b50610438600480360360408110156113eb57600080fd5b508035906020013567ffffffffffffffff16613978565b34801561140e57600080fd5b506104386004803603602081101561142557600080fd5b5035600160a060020a0316613a53565b34801561144157600080fd5b506104dd613ad9565b34801561145657600080fd5b5061068c6004803603602081101561146d57600080fd5b5035600160a060020a0316613b3a565b6104386004803603602081101561149357600080fd5b5035613b4c565b3480156114a657600080fd5b50610483600480360360408110156114bd57600080fd5b813591908101906040810160208201356401000000008111156114df57600080fd5b8201836020820111156114f157600080fd5b8035906020019184600183028401116401000000008311171561151357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613da4945050505050565b34801561156057600080fd5b506104386004803603604081101561157757600080fd5b50600160a060020a0381351690602001351515613e89565b34801561159b57600080fd5b506104ac613f0d565b3480156115b057600080fd5b50610438600480360360408110156115c757600080fd5b508035906020013560ff16613f1c565b3480156115e357600080fd5b50610438600480360360808110156115fa57600080fd5b600160a060020a0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561163557600080fd5b82018360208201111561164757600080fd5b8035906020019184600183028401116401000000008311171561166957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613ffd945050505050565b3480156116b657600080fd5b506116d4600480360360208110156116cd57600080fd5b5035614025565b60405180806020018060200180602001806020018667ffffffffffffffff1667ffffffffffffffff16815260200185810385528a818151815260200191508051906020019080838360005b8381101561173757818101518382015260200161171f565b50505050905090810190601f1680156117645780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b8381101561179757818101518382015260200161177f565b50505050905090810190601f1680156117c45780820380516001836020036101000a031916815260200191505b5085810383528851815288516020918201918a019080838360005b838110156117f75781810151838201526020016117df565b50505050905090810190601f1680156118245780820380516001836020036101000a031916815260200191505b50858103825287518152875160209182019189019080838360005b8381101561185757818101518382015260200161183f565b50505050905090810190601f1680156118845780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156118a557600080fd5b506104dd600480360360208110156118bc57600080fd5b5035614326565b3480156118cf57600080fd5b50610438600480360360408110156118e657600080fd5b8135919081019060408101602082013564010000000081111561190857600080fd5b82018360208201111561191a57600080fd5b8035906020019184600183028401116401000000008311171561193c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506143db945050505050565b34801561198957600080fd5b50610438600480360360608110156119a057600080fd5b50803590602081013590604001356144b3565b3480156119bf57600080fd5b50610438600480360360408110156119d657600080fd5b508035906020013560ff16614648565b3480156119f257600080fd5b5061048360048036036040811015611a0957600080fd5b50600160a060020a0381358116916020013516614729565b61043860048036036080811015611a3757600080fd5b5080359060208101359060408101359060600135600160a060020a0316614757565b348015611a6557600080fd5b5061043860048036036040811015611a7c57600080fd5b5080359060200135614884565b348015611a9557600080fd5b5061068c60048036036020811015611aac57600080fd5b5035614939565b348015611abf57600080fd5b5061043860048036036020811015611ad657600080fd5b5035600160a060020a03166149d6565b348015611af257600080fd5b506104ac6149f9565b348015611b0757600080fd5b5061043860048036036020811015611b1e57600080fd5b5035600160a060020a0316614a08565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600e54600160a060020a031681565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611bfd5780601f10611bd257610100808354040283529160200191611bfd565b820191906000526020600020905b815481529060010190602001808311611be057829003601f168201915b505050505090505b90565b6000611c1382614ab9565b1515611c1e57600080fd5b50600090815260026020526040902054600160a060020a031690565b6000611c458261335a565b9050600160a060020a038381169082161415611c6057600080fd5b33600160a060020a0382161480611c7c5750611c7c8133614729565b1515611c8757600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600d54600160a060020a031681565b6000818152601460205260409020546060908290600160a060020a03163314611d1a57600080fd5b6013805484908110611d2857fe5b60009182526020918290206003600a9092020101805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015611dbe5780601f10611d9357610100808354040283529160200191611dbe565b820191906000526020600020905b815481529060010190602001808311611da157829003601f168201915b5050505050915050919050565b6060806015600084600160a060020a0316600160a060020a0316815260200190815260200160002054604051908082528060200260200182016040528015611e1d578160200160208202803883390190505b5090506000805b601354811015611e8557600081815260146020526040902054600160a060020a0386811691161415611e7d57808383815181101515611e5f57fe5b60209081029091010152611e7a82600163ffffffff614ad616565b91505b600101611e24565b50909392505050565b60075490565b600f54600160a060020a0316331480611eb75750600d54600160a060020a031633145b80611ecc5750600e54600160a060020a031633145b80611ee15750601254600160a060020a031633145b1515611f215760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b6012805460ff90921675010000000000000000000000000000000000000000000275ff00000000000000000000000000000000000000000019909216919091179055565b600f54600160a060020a0316331480611f885750600d54600160a060020a031633145b80611f9d5750600e54600160a060020a031633145b80611fb25750601254600160a060020a031633145b1515611ff25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561200957600080fd5b600160a060020a038116151561201e57600080fd5b60108054600160a060020a031916600160a060020a0392909216919091179055565b600f54600090600160a060020a03163314806120665750600d54600160a060020a031633145b8061207b5750600e54600160a060020a031633145b806120905750601254600160a060020a031633145b15156120d05760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b50601154600160a060020a031690565b601954604080517f0d9005ae0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691630d9005ae916004808301926020929190829003018186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d602081101561216857600080fd5b5051905090565b600c5460a060020a900460ff161561218657600080fd5b601954604080517f89accba5000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a0316916389accba5916024808301926020929190829003018186803b1580156121eb57600080fd5b505afa1580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b5051601954604080517ff20e5e35000000000000000000000000000000000000000000000000000000008152600481018490529051929350600092600160a060020a039092169163f20e5e359160248082019260a092909190829003018186803b15801561228257600080fd5b505afa158015612296573d6000803e3d6000fd5b505050506040513d60a08110156122ac57600080fd5b50608001519050600181146122c057600080fd5b6122cb858585614ae3565b6122d6858585614b71565b601754604080517f84991fa8000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916384991fa891602480830192600092919082900301818387803b15801561233d57600080fd5b505af1158015612351573d6000803e3d6000fd5b505050505050505050565b60008060138381548110151561236e57fe5b90600052602060002090600a020160050160089054906101000a900460ff1660138481548110151561239c57fe5b90600052602060002090600a020160050160099054906101000a900460ff1691509150915091565b600d54600160a060020a031633146124105760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561242757600080fd5b600160a060020a038116151561243c57600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600f54600160a060020a03163314806124815750600d54600160a060020a031633145b806124965750600e54600160a060020a031633145b806124ab5750601254600160a060020a031633145b15156124eb5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561250257600080fd5b8060138381548110151561251257fe5b90600052602060002090600a02016000019080519060200190612536929190615c53565b505050565b600f54600160a060020a031633148061255e5750600d54600160a060020a031633145b806125735750600e54600160a060020a031633145b806125885750601254600160a060020a031633145b15156125c85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156125df57600080fd5b806013838154811015156125ef57fe5b90600052602060002090600a020160050160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600f54600160a060020a031633148061264d5750600d54600160a060020a031633145b806126625750600e54600160a060020a031633145b806126775750601254600160a060020a031633145b15156126b75760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156126ce57600080fd5b600160a060020a03811615156126e357600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b601154600160a060020a031681565b600f54600090600160a060020a031633148061273a5750600d54600160a060020a031633145b8061274f5750600e54600160a060020a031633145b806127645750601254600160a060020a031633145b15156127a45760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156127bb57600080fd5b8160006127c782612a9d565b50945050505081151560011490506127de57600080fd5b60008481526014602090815260408083208054600160a060020a03198116909155600160a060020a031680845260159092529091205461282590600163ffffffff614d6116565b600160a060020a0382166000908152601560205260409020556128488186614d73565b601380548690811061285657fe5b600091825260208220600a90910201906128708282615cd1565b61287e600183016000615cd1565b61288c600283016000615cd1565b61289a600383016000615cd1565b6128a8600483016000615cd1565b60058201805469ffffffffffffffffffff1916905560068201805468ffffffffffffffffff191681556000600784018190556128e76008850182615cd1565b50600301805461ffff19169055505060408051600160a060020a0383168152905186917fbdfa951bad4bf2b0fd50f185e31e2dd8a65886d3c650d38151d30fcaabca46e8919081900360200190a2506001949350505050565b600f54600160a060020a03163314806129635750600d54600160a060020a031633145b806129785750600e54600160a060020a031633145b8061298d5750601254600160a060020a031633145b15156129cd5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156129e457600080fd5b806013838154811015156129f457fe5b90600052602060002090600a02016003019080519060200190612a18929190615c53565b506040805183815290517f6c6e7adf43b1b050caae0d2e59b2e5bd7dea7978e49178adb602129c505ce4c59181900360200190a15050565b6000612a5b83613384565b8210612a6657600080fd5b600160a060020a0383166000908152600560205260409020805483908110612a8a57fe5b9060005260206000200154905092915050565b60008060006060600080601387815481101515612ab657fe5b600091825260209091206006600a9092020101546013805460ff9092169189908110612ade57fe5b90600052602060002090600a020160060160000160019054906101000a900467ffffffffffffffff16601389815481101515612b1657fe5b90600052602060002090600a02016006016001015460138a815481101515612b3a57fe5b90600052602060002090600a020160060160020160138b815481101515612b5d57fe5b600091825260209091206009600a9092020101546013805460ff909216918d908110612b8557fe5b6000918252602091829020600a9190910201600901548354604080516002610100600185161581026000190190941604601f81018690048602820186019092528181529190920460ff169290918591830182828015612c255780601f10612bfa57610100808354040283529160200191612c25565b820191906000526020600020905b815481529060010190602001808311612c0857829003601f168201915b5050505050925095509550955095509550955091939550919395565b600d54600160a060020a03163314612c8d5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161515612ca557600080fd5b600d54600160a060020a03161515612cbc57600080fd5b601954600160a060020a03161515612cd357600080fd5b601754600160a060020a03161515612cea57600080fd5b601154600160a060020a03161515612d0157600080fd5b612d09614dbf565b565b600f54600160a060020a0316331480612d2e5750600d54600160a060020a031633145b80612d435750600e54600160a060020a031633145b80612d585750601254600160a060020a031633145b1515612d985760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b6012805460ff90921660a060020a0274ff000000000000000000000000000000000000000019909216919091179055565b6125368383836020604051908101604052806000815250613ffd565b600f54600160a060020a0316331480612e085750600d54600160a060020a031633145b80612e1d5750600e54600160a060020a031633145b80612e325750601254600160a060020a031633145b1515612e725760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615612e8957600080fd5b600160a060020a0381161515612e9e57600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b6000612eca611e8e565b8210612ed557600080fd5b6007805483908110612ee357fe5b90600052602060002001549050919050565b601954604080517f5fe36b81000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a031691635fe36b81916024808301926020929190829003018186803b158015612f5a57600080fd5b505afa158015612f6e573d6000803e3d6000fd5b505050506040513d6020811015612f8457600080fd5b505192915050565b600c546000908190819060a060020a900460ff1615612faa57600080fd5b6000606434601387815481101515612fbe57fe5b60009182526020909120600a90910201600501546901000000000000000000900460ff1602811515612fec57fe5b049050600060643460138881548110151561300357fe5b60009182526020909120600a909102016005015468010000000000000000900460ff160281151561303057fe5b9297920495505084860134039350915050565b600f54600160a060020a03163314806130665750600d54600160a060020a031633145b8061307b5750600e54600160a060020a031633145b806130905750601254600160a060020a031633145b15156130d05760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156130e757600080fd5b806013838154811015156130f757fe5b90600052602060002090600a02016002019080519060200190612536929190615c53565b600f54600160a060020a031633148061313e5750600d54600160a060020a031633145b806131535750600e54600160a060020a031633145b806131685750601254600160a060020a031633145b15156131a85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b806013838154811015156131b857fe5b90600052602060002090600a02016006016002019080519060200190612536929190615c53565b600c5460a060020a900460ff1681565b600d54600160a060020a0316331461323b5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff16151561325357600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b601660205260009081526040902054600160a060020a031681565b600f54600160a060020a03163314806132b35750600d54600160a060020a031633145b806132c85750600e54600160a060020a031633145b806132dd5750601254600160a060020a031633145b151561331d5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b8060138381548110151561332d57fe5b600091825260209091206009600a909202010180549115156101000261ff00199092169190911790555050565b600081815260016020526040812054600160a060020a031680151561337e57600080fd5b92915050565b6000600160a060020a038216151561339b57600080fd5b50600160a060020a031660009081526003602052604090205490565b600c54600160a060020a031633146133ce57600080fd5b600c54604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600c8054600160a060020a0319169055565b61342b8b8b8b8b8b8b8b8b8b8b8b614ead565b60135461343d90339060001901615388565b5050505050505050505050565b601460205260009081526040902054600160a060020a031681565b600f54600160a060020a03163314806134885750600d54600160a060020a031633145b8061349d5750600e54600160a060020a031633145b806134b25750601254600160a060020a031633145b15156134f25760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16151561350a57600080fd5b601254600160a060020a0316ff5b600d54600160a060020a031633146135645760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561357b57600080fd5b612d096153d7565b60125477010000000000000000000000000000000000000000000000900463ffffffff1681565b600f54600160a060020a03163314806135cd5750600d54600160a060020a031633145b806135e25750600e54600160a060020a031633145b806135f75750601254600160a060020a031633145b15156136375760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b601054600160a060020a031681565b600f54600090600160a060020a031633148061368e5750600d54600160a060020a031633145b806136a35750600e54600160a060020a031633145b806136b85750601254600160a060020a031633145b15156136f85760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561370f57600080fd5b601954604080517ff20e5e35000000000000000000000000000000000000000000000000000000008152600481018890529051600092600160a060020a03169163f20e5e359160248083019260a0929190829003018186803b15801561377457600080fd5b505afa158015613788573d6000803e3d6000fd5b505050506040513d60a081101561379e57600080fd5b50516013805491925090829081106137b257fe5b60009182526020909120600a9091020160060154610100900467ffffffffffffffff168410156137e157600080fd5b6137eb8582611c3a565b601954604080517f04b40f6900000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a03888116602483015260448201889052915191909216916304b40f6991606480830192600092919082900301818387803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b5050601754604080517f0d498b61000000000000000000000000000000000000000000000000000000008152600481018890529051600160a060020a039092169350630d498b61925060248082019260009290919082900301818387803b1580156138de57600080fd5b505af11580156138f2573d6000803e3d6000fd5b5050505060019150505b949350505050565b601254600160a060020a031681565b601954604080517f4b554954000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a031691634b554954916024808301926020929190829003018186803b158015612f5a57600080fd5b600f54600160a060020a031633148061399b5750600d54600160a060020a031633145b806139b05750600e54600160a060020a031633145b806139c55750601254600160a060020a031633145b1515613a055760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b80601383815481101515613a1557fe5b90600052602060002090600a020160060160000160016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600d54600160a060020a03163314613a9f5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161515613ab757600080fd5b60198054600160a060020a031916600160a060020a0392909216919091179055565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611bfd5780601f10611bd257610100808354040283529160200191611bfd565b60156020526000908152604090205481565b601954604080517f83e2e0a800000000000000000000000000000000000000000000000000000000815260048101849052336024820152905160009283928392600160a060020a03909216916383e2e0a891604480820192606092909190829003018186803b158015613bbe57600080fd5b505afa158015613bd2573d6000803e3d6000fd5b505050506040513d6060811015613be857600080fd5b50805160208201516040909201519094509092509050600080613c0b8484615442565b5091509150823410151515613c1f57600080fd5b6000613c31348463ffffffff614d6116565b90506000613c45348463ffffffff614d6116565b601154909150600160a060020a03166108fc613c67348563ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015613c8f573d6000803e3d6000fd5b50600160a060020a0387166108fc613cad348463ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015613cd5573d6000803e3d6000fd5b50601754604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015613d10573d6000803e3d6000fd5b50601954604080517f6d25e48e000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a0390921691636d25e48e9160248082019260009290919082900301818387803b158015613d7757600080fd5b505af1158015613d8b573d6000803e3d6000fd5b50505050613d9a87338861216f565b5050505050505050565b600f54600090600160a060020a0316331480613dca5750600d54600160a060020a031633145b80613ddf5750600e54600160a060020a031633145b80613df45750601254600160a060020a031633145b1515613e345760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615613e4b57600080fd5b81601384815481101515613e5b57fe5b90600052602060002090600a02016004019080519060200190613e7f929190615c53565b5060019392505050565b600160a060020a038216331415613e9f57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600f54600160a060020a031681565b600f54600160a060020a0316331480613f3f5750600d54600160a060020a031633145b80613f545750600e54600160a060020a031633145b80613f695750601254600160a060020a031633145b1515613fa95760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615613fc057600080fd5b80601383815481101515613fd057fe5b90600052602060002090600a020160050160086101000a81548160ff021916908360ff1602179055505050565b61400884848461216f565b614014848484846154fa565b151561401f57600080fd5b50505050565b606080606080600060138681548110151561403c57fe5b90600052602060002090600a020160000160138781548110151561405c57fe5b90600052602060002090600a020160010160138881548110151561407c57fe5b90600052602060002090600a020160020160138981548110151561409c57fe5b90600052602060002090600a020160040160138a8154811015156140bc57fe5b60009182526020918290206005600a909202010154855460408051601f6002600019600186161561010002019094169390930492830185900485028101850190915281815267ffffffffffffffff909216928791908301828280156141625780601f1061413757610100808354040283529160200191614162565b820191906000526020600020905b81548152906001019060200180831161414557829003601f168201915b5050875460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959a50899450925084019050828280156141f05780601f106141c5576101008083540402835291602001916141f0565b820191906000526020600020905b8154815290600101906020018083116141d357829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529599508894509250840190508282801561427e5780601f106142535761010080835404028352916020019161427e565b820191906000526020600020905b81548152906001019060200180831161426157829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529598508794509250840190508282801561430c5780601f106142e15761010080835404028352916020019161430c565b820191906000526020600020905b8154815290600101906020018083116142ef57829003601f168201915b505050505091509450945094509450945091939590929450565b606061433182614ab9565b151561433c57600080fd5b6000828152600b602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156143cf5780601f106143a4576101008083540402835291602001916143cf565b820191906000526020600020905b8154815290600101906020018083116143b257829003601f168201915b50505050509050919050565b600f54600160a060020a03163314806143fe5750600d54600160a060020a031633145b806144135750600e54600160a060020a031633145b806144285750601254600160a060020a031633145b15156144685760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161561447f57600080fd5b8060138381548110151561448f57fe5b90600052602060002090600a02016001019080519060200190612536929190615c53565b600c5460a060020a900460ff16156144ca57600080fd5b336144d48461335a565b600160a060020a03161461451c5760405160e560020a62461bcd028152600401808060200182810382526031815260200180615e7e6031913960400191505060405180910390fd5b601380548490811061452a57fe5b60009182526020909120600a9091020160060154610100900467ffffffffffffffff1682101561455957600080fd5b601954604080517f819c9e4c0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490523360648201529051600160a060020a039092169163819c9e4c9160848082019260009290919082900301818387803b1580156145d357600080fd5b505af11580156145e7573d6000803e3d6000fd5b50506012546146039250600160a060020a031690506001613e89565b600d5461461a90600160a060020a03166001613e89565b600e5461463190600160a060020a03166001613e89565b600f5461253690600160a060020a03166001613e89565b600f54600160a060020a031633148061466b5750600d54600160a060020a031633145b806146805750600e54600160a060020a031633145b806146955750601254600160a060020a031633145b15156146d55760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff16156146ec57600080fd5b806013838154811015156146fc57fe5b90600052602060002090600a020160050160096101000a81548160ff021916908360ff1602179055505050565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c5460a060020a900460ff161561476e57600080fd5b8383018201348111156147b55760405160e560020a62461bcd028152600401808060200182810382526038815260200180615eaf6038913960400191505060405180910390fd5b601154600160a060020a03166108fc6147d4348863ffffffff614d6116565b6040518115909202916000818181858888f193505050501580156147fc573d6000803e3d6000fd5b50600160a060020a0382166108fc61481a348763ffffffff614d6116565b6040518115909202916000818181858888f19350505050158015614842573d6000803e3d6000fd5b50601754604051600160a060020a03909116903480156108fc02916000818181858888f1935050505015801561487c573d6000803e3d6000fd5b505050505050565b600f54600160a060020a03163314806148a75750600d54600160a060020a031633145b806148bc5750600e54600160a060020a031633145b806148d15750601254600160a060020a031633145b15156149115760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b8060138381548110151561492157fe5b600091825260209091206007600a9092020101555050565b601954604080517ff20e5e350000000000000000000000000000000000000000000000000000000081526004810184905290516000928392600160a060020a039091169163f20e5e359160248082019260a092909190829003018186803b1580156149a357600080fd5b505afa1580156149b7573d6000803e3d6000fd5b505050506040513d60a08110156149cd57600080fd5b50519392505050565b600c54600160a060020a031633146149ed57600080fd5b6149f681615676565b50565b601754600160a060020a031681565b600f54600160a060020a0316331480614a2b5750600d54600160a060020a031633145b80614a405750600e54600160a060020a031633145b80614a555750601254600160a060020a031633145b1515614a955760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161515614aad57600080fd5b80600160a060020a0316ff5b600090815260016020526040902054600160a060020a0316151590565b8181018281101561337e57fe5b614aed33826156e7565b1515614af857600080fd5b600160a060020a0382161515614b0d57600080fd5b614b17838261573e565b614b2183826157a0565b614b2b82826158a2565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600160a060020a038216600090815260156020526040902054614b9b90600163ffffffff614ad616565b600160a060020a038084166000908152601560205260408082209390935590851681522054614bd190600163ffffffff614d6116565b600160a060020a0384811660009081526015602090815260408083209490945584825260149052919091208054600160a060020a0319169184169190911790556013805482908110614c1f57fe5b600091825260209091206009600a90920201015460ff1615614cb0576060601382815481101515614c4c57fe5b90600052602060002090600a020160050160086101000a81548160ff021916908360ff1602179055506003601382815481101515614c8657fe5b90600052602060002090600a020160050160096101000a81548160ff021916908360ff1602179055505b6000601382815481101515614cc157fe5b60009182526020909120600a90910201600901805460ff19169115159190911790556013805482908110614cf157fe5b60009182526020918290206005600a90920201015460408051600160a060020a038088168252861693810193909352805167ffffffffffffffff9092169284927f23f50d55776d8003622a982ade45a6c7f083116c8dbbcd980f59942f440badb1929181900390910190a3505050565b600082821115614d6d57fe5b50900390565b614d7d82826158e8565b6000818152600b60205260409020546002600019610100600184161502019091160415614dbb576000818152600b60205260408120614dbb91615cd1565b5050565b600f54600160a060020a0316331480614de25750600d54600160a060020a031633145b80614df75750600e54600160a060020a031633145b80614e0c5750601254600160a060020a031633145b1515614e4c5760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff161515614e6457600080fd5b600c805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b601254600060a060020a90910460ff1611614efc5760405160e560020a62461bcd028152600401808060200182810382526021815260200180615ee76021913960400191505060405180910390fd5b6012546000750100000000000000000000000000000000000000000090910460ff1611614f5d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180615e25602b913960400191505060405180910390fd5b600c5460a060020a900460ff1615614f7457600080fd5b614f7c615d15565b506040805160c08101825260ff8416815267ffffffffffffffff85166020820152908101869052606081018890526001608082015281151560a0820152614fc1615d49565b5060408051610120810182528d815260208082018e90529181018c9052606081018b90526080810189905267ffffffffffffffff871660a082015260125460ff75010000000000000000000000000000000000000000008204811660c084015260a060020a9091041660e0820152610100810183905260138054600181810180845560009384528451805195969495929491938793600a9091027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090019261508c928492910190615c53565b5060208281015180516150a59260018501920190615c53565b50604082015180516150c1916002840191602090910190615c53565b50606082015180516150dd916003840191602090910190615c53565b50608082015180516150f9916004840191602090910190615c53565b5060a082015160058201805460c085015160e086015167ffffffffffffffff1990921667ffffffffffffffff9485161768ff000000000000000019166801000000000000000060ff928316021769ff00000000000000000019166901000000000000000000928216929092029190911790915561010080850151805160068601805460208085015160ff19909216939096169290921768ffffffffffffffff0019169190951690920291909117835560408101516007850155606081015180519193926151ce92600887019290910190615c53565b5060808201516003909101805460a09093015115156101000261ff001992151560ff19909416939093179190911691909117905550500360008181526014602090815260408083208054600160a060020a031916339081179091558352601590915290205490915061524790600163ffffffff614ad616565b6015600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507fcde99b9efee390265235bbcaf4265100bf0707838094ed6b2c22384636581746818f8f604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156152db5781810151838201526020016152c3565b50505050905090810190601f1680156153085780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561533b578181015183820152602001615323565b50505050905090810190601f1680156153685780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050505050505050565b61539282826159a1565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b600d54600160a060020a031633146154235760405160e560020a62461bcd02815260040180806020018281038252602e815260200180615e50602e913960400191505060405180910390fd5b600c5460a060020a900460ff161561543a57600080fd5b612d096159fc565b600c546000908190819060a060020a900460ff161561546057600080fd5b600060648560138881548110151561547457fe5b60009182526020909120600a90910201600501546901000000000000000000900460ff16028115156154a257fe5b04905060006064866013898154811015156154b957fe5b60009182526020909120600a909102016005015468010000000000000000900460ff16028115156154e657fe5b929892049650508587019094039392505050565b600061550e84600160a060020a0316615aef565b151561551c575060016138fc565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b838110156155af578181015183820152602001615597565b50505050905090810190601f1680156155dc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156155fe57600080fd5b505af1158015615612573d6000803e3d6000fd5b505050506040513d602081101561562857600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f150b7a020000000000000000000000000000000000000000000000000000000014915050949350505050565b600160a060020a038116151561568b57600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000806156f38361335a565b905080600160a060020a031684600160a060020a0316148061572e575083600160a060020a031661572384611c08565b600160a060020a0316145b806138fc57506138fc8185614729565b81600160a060020a03166157518261335a565b600160a060020a03161461576457600080fd5b600081815260026020526040902054600160a060020a031615614dbb5760009081526002602052604090208054600160a060020a031916905550565b6157aa8282615af7565b600081815260066020908152604080832054600160a060020a038616845260059092528220549091906157e490600163ffffffff614d6116565b600160a060020a0385166000908152600560205260408120805492935090918390811061580d57fe5b90600052602060002001549050806005600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561584d57fe5b6000918252602080832090910192909255600160a060020a0387168152600590915260409020805490615884906000198301615dab565b50600093845260066020526040808520859055908452909220555050565b6158ac8282615b80565b600160a060020a039091166000908152600560209081526040808320805460018101825590845282842081018590559383526006909152902055565b6158f28282615c03565b60008181526008602052604081205460075490919061591890600163ffffffff614d6116565b9050600060078281548110151561592b57fe5b906000526020600020015490508060078481548110151561594857fe5b6000918252602082200191909155600780548490811061596457fe5b6000918252602090912001556007805490615983906000198301615dab565b50600093845260086020526040808520859055908452909220555050565b600160a060020a03821615156159b657600080fd5b6159c082826158a2565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f54600160a060020a0316331480615a1f5750600d54600160a060020a031633145b80615a345750600e54600160a060020a031633145b80615a495750601254600160a060020a031633145b1515615a895760405160e560020a62461bcd02815260040180806020018281038252603f815260200180615de6603f913960400191505060405180910390fd5b600c5460a060020a900460ff1615615aa057600080fd5b600c805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000903b1190565b81600160a060020a0316615b0a8261335a565b600160a060020a031614615b1d57600080fd5b600160a060020a038216600090815260036020526040902054615b4790600163ffffffff614d6116565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b600081815260016020526040902054600160a060020a031615615ba257600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054615be391614ad6565b600160a060020a0390921660009081526003602052604090209190915550565b615c0d828261573e565b615c1782826157a0565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615c9457805160ff1916838001178555615cc1565b82800160010185558215615cc1579182015b82811115615cc1578251825591602001919060010190615ca6565b50615ccd929150615dcb565b5090565b50805460018160011615610100020316600290046000825580601f10615cf757506149f6565b601f0160209004906000526020600020908101906149f69190615dcb565b6040805160c0810182526000808252602082018190529181018290526060808201526080810182905260a081019190915290565b6101c0604051908101604052806060815260200160608152602001606081526020016060815260200160608152602001600067ffffffffffffffff168152602001600060ff168152602001600060ff168152602001615da6615d15565b905290565b815481835581811115612536576000838152602090206125369181019083015b611c0591905b80821115615ccd5760008155600101615dd156fe596f75206e65656420746f20626520746865206f776e6572206f72206120436c6576656c204042414520746f2063616c6c20746869732066756e6374696f6e5265717569726573206120616e2061727469737420666565206c6576656c20746f206265207365742075704f6e6c79206f75722043454f20616464726573732063616e206578656375746520746869732066756e6374696f6e596f752063616e2774207472616e7366657220616e206172747069656365207768696368206973206e6f7420796f75727356616c7565206d75737420626520657175616c206f722067726561746572207468616e2074686520636f7374206f662074686520666565735265717569726573206120666565206c6576656c20746f20626520736574207570a165627a7a72305820045b0d0a32d16dd230e7ca1f355fd46d44ddc5dacffe327b30b77e752337c8f70029
Swarm Source
bzzr://045b0d0a32d16dd230e7ca1f355fd46d44ddc5dacffe327b30b77e752337c8f7
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.