Overview
TokenID
62096
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
CryptoTitties
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-11-07 */ pragma solidity ^0.5.12; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring '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; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } /** * Utility library of inline functions on addresses */ 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. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids * * Include with `using Counter for Counter.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function set(Counter storage counter, uint256 value) internal returns (uint256) { counter._value = value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ 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 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } /** * @title CryptoTitties Implementation of ERC721 * @dev ERC721, ERC721Meta plus custom market implementation. */ contract CryptoTitties { using SafeMath for uint; using Address for address; using Counters for Counters.Counter; // ---------------------------------------------------------------------------- // Contract ownership // ---------------------------------------------------------------------------- // - variables address public _ownershipOwner; address public _ownershipNewOwner; // - events event OwnershipTransferred(address indexed _from, address indexed _to); // - modifiers modifier onlyOwner { require(msg.sender == _ownershipOwner, "Only contract owner is allowed."); _; } // - functions /** * @notice Initialize contract ownership transfer * @dev This function can be called only by current contract owner, * to initialize ownership transfer to other address. * @param newOwner The address of desired new owner */ function ownershipTransfer(address newOwner) public onlyOwner { _ownershipNewOwner = newOwner; } /** * @notice Finish contract ownership transfer * @dev This function can be called only by new contract owner, * to accept ownership transfer. */ function ownershipAccept() public { require(msg.sender == _ownershipNewOwner, "Only new contract owner is allowed to accept."); emit OwnershipTransferred(_ownershipOwner, _ownershipNewOwner); _ownershipOwner = _ownershipNewOwner; _ownershipNewOwner = address(0); } // ---------------------------------------------------------------------------- // ERC165 // ---------------------------------------------------------------------------- // - variables bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; mapping(bytes4 => bool) private _supportedInterfaces; // - functions function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff); _supportedInterfaces[interfaceId] = true; } function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } // ---------------------------------------------------------------------------- // ERC721 // based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // ---------------------------------------------------------------------------- // - variables // 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 => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; // - events event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); // - functions /** * @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].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "Token does not exists."); return _ownerOf(tokenId); } /** * @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(!_marketOfferExists(tokenId), "Token is offered on market can't be transfered."); require(!_marketAuctionExists(tokenId), "Token is in auction can't be transfered."); _transferFrom(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 {IERC721Receiver-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 { 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 {IERC721Receiver-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 _msgSender() 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); require(_checkOnERC721Received(from, to, tokenId, _data)); } // ---------------------------------------------------------------------------- // ERC721 Meta // based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721Metadata.sol // ---------------------------------------------------------------------------- // - variables // Token name string private _name; // Token symbol string private _symbol; // Base uri to generate tokenURI string private _baseTokenURI; //hash to prove token images not changes in time string private _imagesJsonHash; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; // - functions /** * @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. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return string(abi.encodePacked(_baseTokenURI, uint2str(tokenId))); } /** * @dev Returns saved hash. * Throws if the token ID does not exist. */ function imagesJsonHash() external view returns (string memory){ return _imagesJsonHash; } // ---------------------------------------------------------------------------- // ERC721 Meta Total suply // added totalSuply functionality // ---------------------------------------------------------------------------- // - vars //total suply uint256 private _totalSupply; // - functions /** * @dev Returns totalSupply. */ function totalSupply() public view returns (uint256 _supply) { return _totalSupply; } // ---------------------------------------------------------------------------- // Build In Market // ---------------------------------------------------------------------------- // - types /** * @title MarketOffer * @dev Stores information about token market offer. */ struct MarketOffer { bool isOffer; address owner; uint256 price; } /** * @title MarketAuction * @dev Stores information about token market auction. */ struct MarketAuction { bool isAuction; address highestBidder; uint256 highestBid; uint256 initPrice; uint endTime; } // - variables // Mapping from token ID to MarketOffer mapping (uint256 => MarketOffer) private _marketOffers; // Mapping from token ID to MarketAuction mapping (uint256 => MarketAuction) private _marketAuctions; // Mapping from address to marketBalance (ETH) mapping (address => uint256) private _marketBalances; //Mapping from token ID to First owner of token mapping (uint256 => address) private _tokenFirstOwner; //Address allowed to place tokens owned by contract to auction address private _auctionsAddress; //Address allowed to gift (transfer) tokens owned by contract address private _giftsAddress; // - events event MarketOfferCreated(address indexed _from, uint256 _tokenId, uint256 _price); event MarketOfferRemoved(address indexed _from, uint256 _tokenId); event MarketOfferSold(address indexed _owner, address indexed _buyer, uint256 _tokenId, uint256 _price); event MarketAuctionCreated(uint256 _tokenId, uint256 _initPrice, uint256 _starttime, uint256 _endtime); event MarketAuctionBid(uint256 _tokenId, uint256 _bid, address _bidder, address _old_bidder); event MarketAuctionClaimed(uint256 _tokenId, uint256 _bid, address _bidder); // - functions /** * @dev Sets new _auctionsAddress allowed to place tokens owned by * contract to auction. * Requires the msg.sender to be the contract owner * @param auctionsAddress new _auctionsAddress */ function setAuctionAddress(address auctionsAddress) public onlyOwner { _auctionsAddress = auctionsAddress; } /** * @dev Sets new _giftsAddress allowed to place tokens owned by * contract to auction. * Requires the msg.sender to be the contract owner * @param giftsAddress new _giftsAddress */ function setGiftsAddress(address giftsAddress) public onlyOwner { _giftsAddress = giftsAddress; } /** * @dev Gets token market price, returns 0 for tokens not on market. * Requires token existence * @param _tokenId uint256 ID of the token */ function marketOfferGetTokenPrice(uint256 _tokenId) public view returns (uint256 _price) { require(_exists(_tokenId), "Token does not exists."); return _marketOfferGetTokenPrice(_tokenId); } /** * @dev Gets token market price, returns 0 for tokens not on market. * Internal implementation. For tokens owned by address(0), gets token * not from price _marketOffers[_tokenId], but from function * _countBasePrice(_tokenId) * @param _tokenId uint256 ID of the token */ function _marketOfferGetTokenPrice(uint256 _tokenId) private view returns (uint256 _price) { if(_tokenOwner[_tokenId]==address(0)){ return _countBasePrice(_tokenId); } return _marketOffers[_tokenId].price; } /** * @dev Returns whatever token is offered on market or not. * Requires token existence * @param _tokenId uint256 ID of the token */ function marketOfferExists(uint256 _tokenId) public view returns (bool) { require(_exists(_tokenId), "Token does not exists."); return _marketOfferExists(_tokenId); } /** * @dev Returns whatever token is offered on market or not. * Internal implementation. For tokens owned by address(0), gets token * not from price _marketOffers[_tokenId], but from function * _baseIsOnMarket(_tokenId) * @param _tokenId uint256 ID of the token */ function _marketOfferExists(uint256 _tokenId) private view returns (bool) { if(_tokenOwner[_tokenId]==address(0)){ return _baseIsOnMarket(_tokenId); } return _marketOffers[_tokenId].isOffer; } /** * @dev Places token on internal market. * Requires token existence. Requires token not offered and not in auction. * Requires owner of token == msg.sender * @param _tokenId uint256 ID of the token * @param _price uint256 token price */ function marketOfferCreate(uint256 _tokenId, uint256 _price) public { require(_exists(_tokenId), "Token does not exists."); require(!_marketOfferExists(_tokenId), "Token is allready offered."); require(!_marketAuctionExists(_tokenId), "Token is allready in auction."); address _owner = _ownerOf(_tokenId); require(_owner==msg.sender, "Sender is not authorized."); _marketOffers[_tokenId].isOffer = true; _marketOffers[_tokenId].owner = _owner; _marketOffers[_tokenId].price = _price; if(_tokenOwner[_tokenId]==address(0)){ _tokenOwner[_tokenId] = _owner; } emit MarketOfferCreated(_owner, _tokenId, _price); } /** * @dev Removes token from internal market. * Requires token existence. Requires token is offered . * Requires owner of token == msg.sender * @param _tokenId uint256 ID of the token */ function marketOfferRemove(uint256 _tokenId) public { require(_exists(_tokenId), "Token does not exists."); address _owner = _ownerOf(_tokenId); require(_owner==msg.sender, "Sender is not authorized."); require(_marketOfferExists(_tokenId), "Token is not offered."); _marketOffers[_tokenId].isOffer = false; _marketOffers[_tokenId].owner = address(0); _marketOffers[_tokenId].price = 0; if(_tokenOwner[_tokenId]==address(0)){ _tokenOwner[_tokenId] = _owner; } //marketOffers[_tokenId] = MarketOffer(false, address(0),0); emit MarketOfferRemoved(_owner, _tokenId); } /** * @dev Buy token from internal market. * Requires token existence. Requires token is offered. * Requires owner of msg.value >= token price. * @param _tokenId uint256 ID of the token */ function marketOfferBuy(uint256 _tokenId) public payable { require(_exists(_tokenId), "Token does not exists."); require(_marketOfferExists(_tokenId), "Token is not offered."); uint256 _price = _marketOfferGetTokenPrice(_tokenId); uint256 _finalprice = _price; uint256 _payed = msg.value; address _buyer = msg.sender; address _owner = _ownerOf(_tokenId); uint256 fee_price = 0; uint256 charger_fee = 0; uint256 charity_fee = 0; uint256 charity_price = 0; require(_price<=_payed, "Payed price is lower than market price."); //return balance to buyer if send more than price if(_payed>_price){ _marketBalances[_buyer] = _marketBalances[_buyer].add(_payed.sub(_price)); } if((_tokenOwner[_tokenId]==address(0)) || (_tokenOwner[_tokenId]==_ownershipOwner)){ // Primary market if(_isCharityToken(_tokenId)){ //charity token //full price payed to _charityOwnerAddress charity_price = _price; //charity sets as first owner _tokenFirstOwner[_tokenId] = _charityOwnerAddress; }else{ //contract token //10% to charity charity_fee = _price.div(10); //90% to charger charger_fee = _price.sub(charity_fee); } }else{ //Secondary market //calculate 1 % fee_price = _price.div(100); //1% to charity - final price subtracted by 1% charity_fee = fee_price; _finalprice = _finalprice.sub(fee_price); //1% to first owner if(_tokenFirstOwner[_tokenId]!=address(0)){ //added 1% to first owner _marketBalances[_tokenFirstOwner[_tokenId]] = _marketBalances[_tokenFirstOwner[_tokenId]].add(fee_price); //final price subtracted by 1% _finalprice = _finalprice.sub(fee_price); } //1% to charger - final price subtracted by 1% charger_fee = fee_price; _finalprice = _finalprice.sub(fee_price); //add final price to market balances of seller 97 or 98% _marketBalances[_owner] = _marketBalances[_owner].add(_finalprice); } //remove from market _marketOffers[_tokenId].isOffer = false; _marketOffers[_tokenId].owner = address(0); _marketOffers[_tokenId].price = 0; //actual token transfer _transferFrom(_owner, _buyer, _tokenId); //eth transfers to _chargerAddress, _charityAddress, and _charityOwnerAddress _charityAddBalance(charity_fee); _chargerAddBalance(charger_fee); _charityOwnerAddBalance(charity_price); //emit market sold event emit MarketOfferSold(_owner, _buyer, _tokenId, _price); } /** * @dev Places token on internal auction. * Requires token existence. * Requires token not offered and not in auction. * Requires owner of token == msg.sender or if contract token _auctionsAddress == msg.sender. * Requires _initPrice > 0. * @param _tokenId uint256 ID of the token * @param _initPrice uint256 initial (minimal bid) price * @param _duration uint256 auction duration in secconds */ function marketAuctionCreate(uint256 _tokenId, uint256 _initPrice, uint _duration) public { require(_exists(_tokenId), "Token does not exists."); require(!_marketOfferExists(_tokenId), "Token is allready offered."); require(!_marketAuctionExists(_tokenId), "Token is allready in auction."); address _owner = _ownerOf(_tokenId); //requre msg.sender to be owner if(_owner!=msg.sender){ //OR require owner == _ownershipOwner require(_owner==_ownershipOwner, "Sender is not authorized."); //AND msg.sender == _auctionsAddress require(_auctionsAddress==msg.sender, "Sender is not authorized."); } require(_initPrice>0, "Auction Init price has to be bigger than 0."); //set auction parameters _marketAuctions[_tokenId].isAuction = true; _marketAuctions[_tokenId].highestBidder = address(0); _marketAuctions[_tokenId].highestBid = 0; _marketAuctions[_tokenId].initPrice = _initPrice; _marketAuctions[_tokenId].endTime = block.timestamp+_duration; //emits MarketAuctionCreated emit MarketAuctionCreated(_tokenId, _initPrice, block.timestamp, block.timestamp+_duration); } /** * @dev Bids on token in internal auction. * Requires token existence. * Requires token in auction. * Requires bid >= _initPrice. * Requires bid > highestBid. * @param _tokenId uint256 ID of the token */ function marketAuctionBid(uint256 _tokenId) public payable { require(_exists(_tokenId), "Token does not exists."); require(_marketAuctionExists(_tokenId), "Token is not in auction."); require(_marketAuctions[_tokenId].highestBid < msg.value, "Bid has to be bigger than the current highest bid."); require(_marketAuctions[_tokenId].initPrice <= msg.value, "Bid has to be at least initPrice value."); address oldBidder = _marketAuctions[_tokenId].highestBidder; address bidder = msg.sender; uint256 bidValue = msg.value; //return old bidder bid his to market balances if(oldBidder!=address(0)){ _marketBalances[oldBidder] += _marketAuctions[_tokenId].highestBid; } //set new highest bid _marketAuctions[_tokenId].highestBidder = bidder; _marketAuctions[_tokenId].highestBid = bidValue; //emits MarketAuctionBid emit MarketAuctionBid(_tokenId, bidValue, bidder, oldBidder); } /** * @dev Resolved internal auction. Auction can not be resolved automatically after * duration expires. Transfer token to auction winner (if someone bids) and * remove token from auction. * Requires token existence. * Requires _marketAuctions[_tokenId].isAuction. * Requires _marketAuctions[_tokenId].endTime < block.timestamp - duration expired. * @param _tokenId uint256 ID of the token */ function marketAuctionClaim(uint256 _tokenId) public { require(_exists(_tokenId), "Token does not exists."); require(_marketAuctions[_tokenId].isAuction, "Token is not in auction."); require(_marketAuctions[_tokenId].endTime < block.timestamp, "Auction not finished yet."); uint256 fee_price = 0; uint256 charger_fee = 0; uint256 charity_fee = 0; uint256 charity_price = 0; uint256 _price = _marketAuctions[_tokenId].highestBid; uint256 _finalprice = _price; address _buyer = _marketAuctions[_tokenId].highestBidder; address _owner = _ownerOf(_tokenId); // if winner exist (if someone bids) if(_buyer != address(0)){ if(_tokenOwner[_tokenId]==address(0)){ // Primary market if(_isCharityToken(_tokenId)){ //charity token //full price payed to _charityOwnerAddress charity_price = _price; //charity sets as first owner _tokenFirstOwner[_tokenId] = _charityOwnerAddress; }else{ //contract token //10% to charity charity_fee = _price.div(10); //90% to charger charger_fee = _price.sub(charity_fee); } }else{ //Secondary market //calculate 1 % fee_price = _price.div(100); //1% to charity - final price subtracted by 1% charity_fee = fee_price; _finalprice = _finalprice.sub(fee_price); //1% to first owner if(_tokenFirstOwner[_tokenId]!=address(0)){ //added 1% to first owner _marketBalances[_tokenFirstOwner[_tokenId]] = _marketBalances[_tokenFirstOwner[_tokenId]].add(fee_price); //final price subtracted by 1% _finalprice = _finalprice.sub(fee_price); } //1% to charger - final price subtracted by 1% charger_fee = fee_price; _finalprice = _finalprice.sub(fee_price); //add final price to market balances of seller 97 or 98% _marketBalances[_owner] = _marketBalances[_owner].add(_finalprice); } //actual transfer to winner _transferFrom(_owner, _buyer, _tokenId); //emit MarketAuctionClaimed emit MarketAuctionClaimed(_tokenId, _price, _buyer); }else{ //emit MarketAuctionClaimed - when no bidder/winner emit MarketAuctionClaimed(_tokenId, 0, address(0)); } //remove auction _marketAuctions[_tokenId].isAuction = false; _marketAuctions[_tokenId].highestBidder = address(0); _marketAuctions[_tokenId].highestBid = 0; //eth transfers to _chargerAddress, _charityAddress, and _charityOwnerAddress _charityAddBalance(charity_fee); _chargerAddBalance(charger_fee); _charityOwnerAddBalance(charity_price); } /** * @dev Gets current highest bid, returns 0 for tokens not in auction. * Requires token existence * @param _tokenId uint256 ID of the token */ function marketAuctionGetTokenPrice(uint256 _tokenId) public view returns (uint256 _price) { require(_exists(_tokenId), "Token does not exists."); return _marketAuctions[_tokenId].highestBid; } /** * @dev Gets address of current highest bidder, returns addres(0) for tokens not in auction. * Requires token existence * @param _tokenId uint256 ID of the token */ function marketAuctionGetHighestBidder(uint256 _tokenId) public view returns (address _bidder) { require(_exists(_tokenId), "Token does not exists."); return _marketAuctions[_tokenId].highestBidder; } /** * @dev Returns whatever token is in auction or not. * @param _tokenId uint256 ID of the token */ function marketAuctionExists(uint256 _tokenId) public view returns(bool _exists){ return _marketAuctionExists(_tokenId); } /** * @dev Returns whatever token is in auction or not. * Internal implementation. Check if endTime not expired. * @param _tokenId uint256 ID of the token */ function _marketAuctionExists(uint256 _tokenId) private view returns(bool _exists){ if(_marketAuctions[_tokenId].endTime < block.timestamp){ return false; } return _marketAuctions[_tokenId].isAuction; } /** * @dev Transfers market balance of msg.sender. * Requires _marketBalances[msg.sender]>0 */ function marketWithdrawBalance() public { uint amount = _marketBalances[msg.sender]; require(amount>0, "Sender has no market balance to withdraw."); _marketBalances[msg.sender] = 0; msg.sender.transfer(amount); } /** * @dev Get ammount of _owner. * @param _owner address Requested address; */ function marketGetBalance(address _owner) public view returns(uint256 _balance){ return _marketBalances[_owner]; } /** * @dev Send/transfer token. * Requires token exist. * Requires token is not offered or in auction. * Requires token is owned by _ownershipOwner * Requires msq.sender==_giftsAddress * @param _tokenId uint256 ID of the token to send * @param _to address to send token */ function marketSendGift(uint256 _tokenId, address _to) public { require(_exists(_tokenId), "Token does not exists."); require(!_marketOfferExists(_tokenId), "Token is offered."); require(!_marketAuctionExists(_tokenId), "Token is in auction."); require(_ownerOf(_tokenId)==_ownershipOwner, "Sender is not authorized."); require(_giftsAddress==msg.sender, "Sender is not authorized."); _transferFrom(_ownerOf(_tokenId), _to, _tokenId); } // -------------------------- // Safe transfers functions (transefer to kown adresses) // ------------------------- address payable private _chargeAddress; address payable private _charityAddress; address payable private _charityOwnerAddress; /** * @dev Transfers eth to _charityAddress * @param _balance uint256 Ammount to transfer */ function _charityAddBalance(uint256 _balance) internal { if(_balance>0){ _charityAddress.transfer(_balance); } } /** * @dev Transfers eth to _charityOwnerAddress * @param _balance uint256 Ammount to transfer */ function _charityOwnerAddBalance(uint256 _balance) internal { if(_balance>0){ _charityOwnerAddress.transfer(_balance); } } /** * @dev Transfers eth to _chargeAddress * @param _balance uint256 Ammount to transfer */ function _chargerAddBalance(uint256 _balance) internal { if(_balance>0){ _chargeAddress.transfer(_balance); } } // -------------------------- // Internal functions // ------------------------- /** * @dev Internal function return owner of token _tokenOwner[_tokenId]. * if _tokenOwner[_tokenId] == address(0), owner is _charityOwnerAddress * OR _ownershipOwner (based on _isCharityToken(_tokenId)) * @param _tokenId uint256 ID of the token */ function _ownerOf(uint256 _tokenId) internal view returns (address _owner) { if(_tokenOwner[_tokenId]==address(0)){ //token has no owner - owner is _charityOwnerAddress OR _ownershipOwner; if(_isCharityToken(_tokenId)){ //owner is _charityOwnerAddress return _charityOwnerAddress; } //owner is _ownershipOwner return _ownershipOwner; } //owner is _tokenOwner[_tokenId] return _tokenOwner[_tokenId]; } /** * @dev Returns whatever token is charity token or not * @param _tokenId uint256 ID of the token */ function _isCharityToken(uint256 _tokenId) internal pure returns (bool _isCharity) { if(_tokenId>720 && _tokenId<=1320){ return true; } return false; } /** * @dev Returns whether the specified token exists. * @param _tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 _tokenId) internal view returns(bool _tokenExistence) { //all tokens lower then supply exists return (_tokenId <= _totalSupply); } /** * @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); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @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) internal { require(_ownerOf(tokenId) == from); require(to != address(0)); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); if(_tokenFirstOwner[tokenId]==address(0)){ _tokenFirstOwner[tokenId] = to; } _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This function is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } /** * @dev Converts uint256 number to string * @param i uint256 */ function uint2str(uint256 i) internal pure returns (string memory){ uint256 _tmpN = i; if (_tmpN == 0) { return "0"; } uint256 j = _tmpN; uint256 length = 0; while (j != 0){ length++; j /= 10; } bytes memory bstr = new bytes(length); uint256 k = length - 1; while (_tmpN != 0) { bstr[k--] = byte(uint8(48 + _tmpN % 10)); _tmpN /= 10; } return string(bstr); } /** * @dev Returns market price of token based on its id. * Only used if tokenOwner == address(0) * @param _tokenId uint256 id of token * @return uint256 marketPrice */ function _countBasePrice(uint256 _tokenId) internal pure returns (uint256 _price) { if(_tokenId<=720){ //reserved for gifts and auctions return 0; } if(_tokenId>720 && _tokenId<=1320){ //charity owned on market return 100 * (uint256(10) ** 15); } if(_tokenId>1320 && _tokenId<=8020){ // price 5 return 34 * (uint256(10) ** 15); } if(_tokenId>=8021 && _tokenId<10920){ // price 6 return 40 * (uint256(10) ** 15); } if(_tokenId>=10920 && _tokenId<17720){ // price 7 return 47 * (uint256(10) ** 15); } if(_tokenId>=17720 && _tokenId<22920){ // price 8 return 54* (uint256(10) ** 15); } if(_tokenId>=22920 && _tokenId<29470){ // price 10 return 67 * (uint256(10) ** 15); } if(_tokenId>=29470 && _tokenId<30320){ // price 11 return 74 * (uint256(10) ** 15); } if(_tokenId>=30320 && _tokenId<32470){ // price 12 return 80 * (uint256(10) ** 15); } if(_tokenId>=32470 && _tokenId<35120){ // price 13 return 87 * (uint256(10) ** 15); } if(_tokenId>=35120 && _tokenId<35520){ // price 14 return 94 * (uint256(10) ** 15); } if(_tokenId>=35520 && _tokenId<42370){ // price 15 return 100 * (uint256(10) ** 15); } if(_tokenId>=42370 && _tokenId<46370){ // price 18 return 120 * (uint256(10) ** 15); } if(_tokenId>=46370 && _tokenId<55920){ // price 20 return 134 * (uint256(10) ** 15); } if(_tokenId>=55920 && _tokenId<59820){ // price 22 return 147 * (uint256(10) ** 15); } if(_tokenId>=59820 && _tokenId<63120){ // price 25 return 167 * (uint256(10) ** 15); } if(_tokenId>=63120 && _tokenId<78870){ // price 30 return 200 * (uint256(10) ** 15); } if(_tokenId>=78870 && _tokenId<79010){ // price 35 return 234 * (uint256(10) ** 15); } if(_tokenId>=79010 && _tokenId<84505){ // price 40 return 267 * (uint256(10) ** 15); } if(_tokenId>=84505 && _tokenId<84645){ // price 45 return 300 * (uint256(10) ** 15); } if(_tokenId>=84645 && _tokenId<85100){ // price 50 return 334 * (uint256(10) ** 15); } if(_tokenId>=85100 && _tokenId<85165){ // price 60 return 400 * (uint256(10) ** 15); } if(_tokenId>=85165 && _tokenId<85175){ // price 65 return 434 * (uint256(10) ** 15); } if(_tokenId>=85175 && _tokenId<85205){ // price 70 return 467 * (uint256(10) ** 15); } if(_tokenId>=85205 && _tokenId<85235){ // price 80 return 534 * (uint256(10) ** 15); } if(_tokenId>=85235 && _tokenId<85319){ // price 90 return 600 * (uint256(10) ** 15); } if(_tokenId>=85319 && _tokenId<85427){ // price 100 return 667 * (uint256(10) ** 15); } if(_tokenId>=85427 && _tokenId<85441){ // price 110 return 734 * (uint256(10) ** 15); } if(_tokenId>=85441 && _tokenId<85457){ // price 120 return 800 * (uint256(10) ** 15); } if(_tokenId>=85457 && _tokenId<85464){ // price 130 return 867 * (uint256(10) ** 15); } if(_tokenId>=85464 && _tokenId<85465){ // price 140 return 934 * (uint256(10) ** 15); } if(_tokenId>=85465 && _tokenId<85502){ // price 150 return 1000 * (uint256(10) ** 15); } if(_tokenId>=85502 && _tokenId<85506){ // price 160 return 1067 * (uint256(10) ** 15); } if(_tokenId==85506){ // price 170 return 1134 * (uint256(10) ** 15); } if(_tokenId==85507){ // price 180 return 1200 * (uint256(10) ** 15); } if(_tokenId>=85508 && _tokenId<85516){ // price 200 return 1334 * (uint256(10) ** 15); } if(_tokenId>=85516 && _tokenId<85518){ // price 230 return 1534 * (uint256(10) ** 15); } if(_tokenId>=85518 && _tokenId<85571){ // price 250 return 1667 * (uint256(10) ** 15); } if(_tokenId>=85571 && _tokenId<85587){ // price 300 return 2000 * (uint256(10) ** 15); } if(_tokenId>=85587 && _tokenId<85594){ // price 350 return 2334 * (uint256(10) ** 15); } if(_tokenId>=85594 && _tokenId<85597){ // price 400 return 2667 * (uint256(10) ** 15); } if(_tokenId>=85597 && _tokenId<85687){ // price 500 return 3334 * (uint256(10) ** 15); } if(_tokenId==85687){ // price 550 return 3667 * (uint256(10) ** 15); } if(_tokenId>=85688 && _tokenId<85692){ // price 600 return 4000 * (uint256(10) ** 15); } if(_tokenId==85692){ // price 680 return 4534 * (uint256(10) ** 15); } if(_tokenId>=85693 && _tokenId<85698){ // price 700 return 4667 * (uint256(10) ** 15); } if(_tokenId>=85698 && _tokenId<85700){ // price 750 return 5000 * (uint256(10) ** 15); } if(_tokenId==85700){ // price 800 return 5334 * (uint256(10) ** 15); } if(_tokenId==85701){ // price 900 return 6000 * (uint256(10) ** 15); } if(_tokenId>=85702 && _tokenId<85776){ // price 1000 return 6667 * (uint256(10) ** 15); } if(_tokenId==85776){ // price 1100 return 7334 * (uint256(10) ** 15); } if(_tokenId>=85777 && _tokenId<85788){ // price 1500 return 10000 * (uint256(10) ** 15); } if(_tokenId>=85788 && _tokenId<85795){ // price 2000 return 13334 * (uint256(10) ** 15); } if(_tokenId>=85795 && _tokenId<85798){ // price 2500 return 16667 * (uint256(10) ** 15); } if(_tokenId>=85798 && _tokenId<85803){ // price 3000 return 20000 * (uint256(10) ** 15); } if(_tokenId>=85803 && _tokenId<85806){ // price 5000 return 33334 * (uint256(10) ** 15); } if(_tokenId>=85806 && _tokenId<85807){ // price 10000 return 66667 * (uint256(10) ** 15); } if(_tokenId==85807){ // price 50000 return 333334 * (uint256(10) ** 15); } } /** * @dev Returns whatever token is offerd on market. * Only used if tokenOwner == address(0) * @param _tokenId uint256 id of token */ function _baseIsOnMarket(uint256 _tokenId) internal pure returns (bool _isOnMarket) { if(_tokenId<=720){ //reserved for gits and auctions return false; } if(_tokenId>720 && _tokenId<=1320){ //charity owned on market return true; } if(_tokenId>1320){ //other on market return true; } } /** * @dev Constructor */ constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC165); _registerInterface(_INTERFACE_ID_ERC721); //set metadata values _name = "Crypto Tittiez"; _symbol = "CTT"; // register the supported interfaces to conform to ERC721 ERC721_METADATA _registerInterface(_INTERFACE_ID_ERC721_METADATA); //set metadata values _baseTokenURI = "https://cryptotittiez.com/api/tokeninfo/"; _totalSupply = 85807; //after tokens creation (allmost) all tokens pretends are owned by _ownershipOwner. Look at function _ownerOf _ownedTokensCount[msg.sender].set(85207); //sets known addresse _chargeAddress = address(0x03559A5AFC7F55F3d71619523d45889a6b0905c0); _charityAddress = address(0x40497Be989B8d6fb532a6A2f0Dbf759F5d644e76); _charityOwnerAddress = address(0x949577b216ee2D44d70d6DB210422275694cbA27); _auctionsAddress = address(0x6800B4f9A80a1fbA4674a5716A5554f3869b57Bf); _giftsAddress = address(0x3990e05DA96EFfF38b0aC9ddD495F41BB82Bf9a9); //after tokens creation 600 tokens pretends are owned by _charityOwnerAddress. Look at function _ownerOf _ownedTokensCount[_charityOwnerAddress].set(600); //sets json hash to prove images not change _imagesJsonHash = "2485dabaebe62276c976e55b290438799f2b60cdb845c50053e2c2be43fa6fce"; //set contract owner _ownershipOwner = msg.sender; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"address","name":"_old_bidder","type":"address"}],"name":"MarketAuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"}],"name":"MarketAuctionClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_initPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_starttime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endtime","type":"uint256"}],"name":"MarketAuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MarketOfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MarketOfferRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MarketOfferSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"_ownershipNewOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_ownershipOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"imagesJsonHash","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionBid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_initPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"marketAuctionCreate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionExists","outputs":[{"internalType":"bool","name":"_exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionGetHighestBidder","outputs":[{"internalType":"address","name":"_bidder","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketAuctionGetTokenPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"marketGetBalance","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferBuy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"marketOfferCreate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferGetTokenPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"marketOfferRemove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"marketSendGift","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"marketWithdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ownershipAccept","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"ownershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"auctionsAddress","type":"address"}],"name":"setAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"giftsAddress","type":"address"}],"name":"setGiftsAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200002a6301ffc9a760e01b6200042c60201b60201c565b620000426380ac58cd60e01b6200042c60201b60201c565b6040518060400160405280600e81526020017f43727970746f205469747469657a000000000000000000000000000000000000815250600790805190602001906200008f929190620004de565b506040518060400160405280600381526020017f435454000000000000000000000000000000000000000000000000000000000081525060089080519060200190620000dd929190620004de565b50620000f6635b5e139f60e01b6200042c60201b60201c565b60405180606001604052806028815260200162005fc6602891396009908051906020019062000127929190620004de565b5062014f2f600b819055506200018d62014cd7600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004cd60201b6200584b1790919060201c565b507303559a5afc7f55f3d71619523d45889a6b0905c0601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507340497be989b8d6fb532a6a2f0dbf759f5d644e76601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073949577b216ee2d44d70d6db210422275694cba27601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550736800b4f9a80a1fba4674a5716a5554f3869b57bf601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733990e05da96efff38b0ac9ddd495f41bb82bf9a9601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003b361025860056000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004cd60201b6200584b1790919060201c565b5060405180606001604052806040815260200162005f8660409139600a9080519060200190620003e5929190620004de565b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200058d565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200046057600080fd5b600160026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600081836000018190555092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052157805160ff191683800117855562000552565b8280016001018555821562000552579182015b828111156200055157825182559160200191906001019062000534565b5b50905062000561919062000565565b5090565b6200058a91905b80821115620005865760008160009055506001016200056c565b5090565b90565b6159e9806200059d6000396000f3fe6080604052600436106102045760003560e01c8063642ca8a511610118578063a22cb465116100a0578063c8ab84d81161006f578063c8ab84d814610db1578063d1290c1614610df6578063d3a417a214610e0d578063e985e9c514610e5e578063fd353c7b14610ee757610204565b8063a22cb46514610b33578063b77568fb14610b90578063b88d4fde14610beb578063c87b56dd14610cfd57610204565b806393ac3638116100e757806393ac36381461099b57806393adac6e146109ec578063942cb80014610a3b57806395d89b4114610a52578063a064101e14610ae257610204565b8063642ca8a5146108045780636ab0704c1461089457806370a08231146108e757806386e7e3761461094c57610204565b8063277da51c1161019b57806332cf83301161016a57806332cf83301461060357806342842e0e146106685780634ec7c45b146106e357806358c612cb146107325780636352211e1461078957610204565b8063277da51c1461051557806327b3f0d81461056c5780632d8645861461059a5780633175a0e9146105d557610204565b8063095ea7b3116101d7578063095ea7b3146103c157806316ed488e1461041c57806318160ddd1461046f57806323b872dd1461049a57610204565b806301ffc9a71461020957806306fdde031461027b578063081812fc1461030b57806308b3036314610386575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f62565b604051808215151515815260200191505060405180910390f35b34801561028757600080fd5b50610290610fca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d05780820151818401526020810190506102b5565b50505050905090810190601f1680156102fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061106c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b506103bf600480360360208110156103a957600080fd5b81019080803590602001909291905050506110bb565b005b3480156103cd57600080fd5b5061041a600480360360408110156103e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061183d565b005b34801561042857600080fd5b506104556004803603602081101561043f57600080fd5b810190808035906020019092919050505061197e565b604051808215151515815260200191505060405180910390f35b34801561047b57600080fd5b50610484611990565b6040518082815260200191505060405180910390f35b3480156104a657600080fd5b50610513600480360360608110156104bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061199a565b005b34801561052157600080fd5b5061052a611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105986004803603602081101561058257600080fd5b8101908080359060200190929190505050611aa1565b005b3480156105a657600080fd5b506105d3600480360360208110156105bd57600080fd5b810190808035906020019092919050505061221e565b005b610601600480360360208110156105eb57600080fd5b8101908080359060200190929190505050612570565b005b34801561060f57600080fd5b506106526004803603602081101561062657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b34801561067457600080fd5b506106e16004803603606081101561068b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612986565b005b3480156106ef57600080fd5b5061071c6004803603602081101561070657600080fd5b81019080803590602001909291905050506129a6565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b50610747612a41565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079557600080fd5b506107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612a66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561081057600080fd5b50610819612af3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085957808201518184015260208101905061083e565b50505050905090810190601f1680156108865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a057600080fd5b506108cd600480360360208110156108b757600080fd5b8101908080359060200190929190505050612b95565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b506109366004803603602081101561090a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c22565b6040518082815260200191505060405180910390f35b34801561095857600080fd5b506109996004803603606081101561096f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612cab565b005b3480156109a757600080fd5b506109ea600480360360208110156109be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061316d565b005b3480156109f857600080fd5b50610a2560048036036020811015610a0f57600080fd5b8101908080359060200190929190505050613273565b6040518082815260200191505060405180910390f35b348015610a4757600080fd5b50610a50613300565b005b348015610a5e57600080fd5b50610a676134e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa7578082015181840152602081019050610a8c565b50505050905090810190601f168015610ad45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610aee57600080fd5b50610b3160048036036020811015610b0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358b565b005b348015610b3f57600080fd5b50610b8e60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613691565b005b348015610b9c57600080fd5b50610be960048036036040811015610bb357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137cb565b005b348015610bf757600080fd5b50610cfb60048036036080811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c7557600080fd5b820183602082011115610c8757600080fd5b80359060200191846001830284011164010000000083111715610ca957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613ae2565b005b348015610d0957600080fd5b50610d3660048036036020811015610d2057600080fd5b8101908080359060200190929190505050613b08565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d76578082015181840152602081019050610d5b565b50505050905090810190601f168015610da35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dbd57600080fd5b50610df460048036036040811015610dd457600080fd5b810190808035906020019092919080359060200190929190505050613bf2565b005b348015610e0257600080fd5b50610e0b613fc8565b005b348015610e1957600080fd5b50610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140f4565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141fa565b604051808215151515815260200191505060405180910390f35b348015610ef357600080fd5b50610f2060048036036020811015610f0a57600080fd5b810190808035906020019092919050505061428e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b600061107782614349565b61108057600080fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110c481614349565b611136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600082815260200190815260200160002060000160009054906101000a900460ff166111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b42600d60008381526020019081526020016000206003015410611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41756374696f6e206e6f742066696e6973686564207965742e0000000000000081525060200191505060405180910390fd5b60008090506000809050600080905060008090506000600d600087815260200190815260200160002060010154905060008190506000600d600089815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006112d189614358565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461170157600073ffffffffffffffffffffffffffffffffffffffff16600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561142a576113788961445e565b156113f957839450601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b61140d600a8561448b90919063ffffffff16565b955061142286856144b190919063ffffffff16565b96505b61167e565b61143e60648561448b90919063ffffffff16565b975087955061145688846144b190919063ffffffff16565b9250600073ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d05761154488600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cd88846144b190919063ffffffff16565b92505b8796506115e688846144b190919063ffffffff16565b925061163a83600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61168981838b6144f0565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d54898584604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1611776565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d5489600080604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a15b6000600d60008b815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d60008b815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008b8152602001908152602001600020600101819055506118208661476e565b611829876147e4565b6118328561485a565b505050505050505050565b600061184882614358565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118c357506118c281336141fa565b5b6118cc57600080fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611989826148d0565b9050919050565b6000600b54905090565b6119a43382614925565b6119ad57600080fd5b6119b6816149ba565b15611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615908602f913960400191505060405180910390fd5b611a15816148d0565b15611a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061598d6028913960400191505060405180910390fd5b611a768383836144f0565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aaa81614349565b611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b611b25816149ba565b611b97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000611ba282614a5f565b90506000819050600034905060003390506000611bbe86614358565b9050600080905060008090506000809050600080905086891115611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806158e16027913960400191505060405180910390fd5b88871115611cdd57611c99611c4b8a896144b190919063ffffffff16565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611dca57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611e8a57611dd88a61445e565b15611e5957889050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e85565b611e6d600a8a61448b90919063ffffffff16565b9150611e82828a6144b190919063ffffffff16565b92505b6120de565b611e9e60648a61448b90919063ffffffff16565b9350839150611eb684896144b190919063ffffffff16565b9750600073ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461203057611fa484600e6000600f60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d84896144b190919063ffffffff16565b97505b83925061204684896144b190919063ffffffff16565b975061209a88600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600c60008c815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c60008c815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008c81526020019081526020016000206001018190555061218a85878c6144f0565b6121938261476e565b61219c836147e4565b6121a58161485a565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f093818ad4ae8e39f3d8eb90213f45dde273486ca619ccc887ae2c71dca97f8c68c8c604051808381526020018281526020019250505060405180910390a350505050505050505050565b61222781614349565b612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b60006122a482614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b612350826149ba565b6123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000600c600084815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c600084815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c600084815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561251e57806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167f68668e20038684f5370d273dcbcfda23cca7fd1443999a51aabd7b97eff068f2836040518082815260200191505060405180910390a25050565b61257981614349565b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6125f4816148d0565b612666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b34600d600083815260200190815260200160002060010154106126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158846032913960400191505060405180910390fd5b34600d6000838152602001908152602001600020600201541115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061585d6027913960400191505060405180910390fd5b6000600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000349050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461282057600d600085815260200190815260200160002060010154600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b81600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d6000868152602001908152602001600020600101819055507f2f2a2da0cd94316f3c2c6d23d063501f65cf91d4975931d95ac932ee88ba9aea84828486604051808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129a183838360405180602001604052806000815250613ae2565b505050565b60006129b182614349565b612a23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d6000838152602001908152602001600020600101549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a7182614349565b612ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612aec82614358565b9050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b8b5780601f10612b6057610100808354040283529160200191612b8b565b820191906000526020600020905b815481529060010190602001808311612b6e57829003601f168201915b5050505050905090565b6000612ba082614349565b612c12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612c1b826149ba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5d57600080fd5b612ca4600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614af7565b9050919050565b612cb483614349565b612d26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612d2f836149ba565b15612da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b612dab836148d0565b15612e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000612e2984614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fe4576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b5b6000831161303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806158b6602b913960400191505060405180910390fd5b6001600d600086815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008681526020019081526020016000206001018190555082600d600086815260200190815260200160002060020181905550814201600d6000868152602001908152602001600020600301819055507f5819773cd5756d683b919e60b4b79368d9da2abe37cdd2d8ecb19eb3c1931c6a8484428542016040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061327e82614349565b6132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6132f982614a5f565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615960602d913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135815780601f1061355657610100808354040283529160200191613581565b820191906000526020600020905b81548152906001019060200180831161356457829003601f168201915b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461364d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ca57600080fd5b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6137d482614349565b613846576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b61384f826149ba565b156138c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6b656e206973206f6666657265642e00000000000000000000000000000081525060200191505060405180910390fd5b6138cb826148d0565b1561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20697320696e2061756374696f6e2e00000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661397f83614358565b73ffffffffffffffffffffffffffffffffffffffff1614613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b613ade613ad783614358565b82846144f0565b5050565b613aed84848461199a565b613af984848484614b05565b613b0257600080fd5b50505050565b6060613b1382614349565b613b1c57600080fd5b6009613b2783614cee565b6040516020018083805460018160011615610100020316600290048015613b855780601f10613b63576101008083540402835291820191613b85565b820191906000526020600020905b815481529060010190602001808311613b71575b505082805190602001908083835b60208310613bb65780518252602082019150602081019050602083039250613b93565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b613bfb82614349565b613c6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b613c76826149ba565b15613ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b613cf2826148d0565b15613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000613d7083614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b6001600c600085815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080600c600085815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c600085815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613f6d57806003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167fde2d7c25012eb9ea5d9068fde6060e7bee67f37bbd82c3233239a147d3ec4bc58484604051808381526020018281526020019250505060405180910390a2505050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111614065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806159376029913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156140f0573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146141b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061429982614349565b61430b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b548211159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614422576143ca8261445e565b156143f957601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b60006102d08211801561447357506105288211155b156144815760019050614486565b600090505b919050565b600080821161449957600080fd5b60008284816144a457fe5b0490508091505092915050565b6000828211156144c057600080fd5b600082840390508091505092915050565b6000808284019050838110156144e657600080fd5b8091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661451082614358565b73ffffffffffffffffffffffffffffffffffffffff161461453057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561456a57600080fd5b61457381614e25565b6145ba600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ee3565b614601600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f06565b600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156146bc5781600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008111156147e157601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156147df573d6000803e3d6000fd5b505b50565b600081111561485757601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614855573d6000803e3d6000fd5b505b50565b60008111156148cd57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156148cb573d6000803e3d6000fd5b505b50565b600042600d60008481526020019081526020016000206003015410156148f95760009050614920565b600d600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008061493183614358565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806149a057508373ffffffffffffffffffffffffffffffffffffffff166149888461106c565b73ffffffffffffffffffffffffffffffffffffffff16145b806149b157506149b081856141fa565b5b91505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614a3357614a2c82614f1c565b9050614a5a565b600c600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614ad857614ad182614f6a565b9050614af2565b600c60008381526020019081526020016000206001015490505b919050565b600081600001549050919050565b6000614b268473ffffffffffffffffffffffffffffffffffffffff16615838565b614b335760019050614ce6565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c0e578082015181840152602081019050614bf3565b50505050905090810190601f168015614c3b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c5d57600080fd5b505af1158015614c71573d6000803e3d6000fd5b505050506040513d6020811015614c8757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b606060008290506000811415614d3c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050614e20565b600081905060008090505b60008214614d69578080600101915050600a8281614d6157fe5b049150614d47565b6060816040519080825280601f01601f191660200182016040528015614d9e5781602001600182028038833980820191505090505b50905060006001830390505b60008514614e1757600a8581614dbc57fe5b0660300160f81b82828060019003935081518110614dd657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581614e0f57fe5b049450614daa565b81955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614ee05760006004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b614efb600182600001546144b190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006102d08211614f305760009050614f65565b6102d082118015614f4357506105288211155b15614f515760019050614f65565b610528821115614f645760019050614f65565b5b919050565b60006102d08211614f7e5760009050615833565b6102d082118015614f9157506105288211155b15614fa557600f600a0a6064029050615833565b61052882118015614fb85750611f548211155b15614fcc57600f600a0a6022029050615833565b611f558210158015614fdf5750612aa882105b15614ff357600f600a0a6028029050615833565b612aa88210158015615006575061453882105b1561501a57600f600a0a602f029050615833565b614538821015801561502d575061598882105b1561504157600f600a0a6036029050615833565b6159888210158015615054575061731e82105b1561506857600f600a0a6043029050615833565b61731e821015801561507b575061767082105b1561508f57600f600a0a604a029050615833565b61767082101580156150a25750617ed682105b156150b657600f600a0a6050029050615833565b617ed682101580156150c9575061893082105b156150dd57600f600a0a6057029050615833565b61893082101580156150f05750618ac082105b1561510457600f600a0a605e029050615833565b618ac08210158015615117575061a58282105b1561512b57600f600a0a6064029050615833565b61a582821015801561513e575061b52282105b1561515257600f600a0a6078029050615833565b61b5228210158015615165575061da7082105b1561517957600f600a0a6086029050615833565b61da70821015801561518c575061e9ac82105b156151a057600f600a0a6093029050615833565b61e9ac82101580156151b3575061f69082105b156151c757600f600a0a60a7029050615833565b61f69082101580156151db57506201341682105b156151ef57600f600a0a60c8029050615833565b6201341682101580156152045750620134a282105b1561521857600f600a0a60ea029050615833565b620134a2821015801561522d575062014a1982105b1561524257600f600a0a61010b029050615833565b62014a198210158015615257575062014aa582105b1561526c57600f600a0a61012c029050615833565b62014aa58210158015615281575062014c6c82105b1561529657600f600a0a61014e029050615833565b62014c6c82101580156152ab575062014cad82105b156152c057600f600a0a610190029050615833565b62014cad82101580156152d5575062014cb782105b156152ea57600f600a0a6101b2029050615833565b62014cb782101580156152ff575062014cd582105b1561531457600f600a0a6101d3029050615833565b62014cd58210158015615329575062014cf382105b1561533e57600f600a0a610216029050615833565b62014cf38210158015615353575062014d4782105b1561536857600f600a0a610258029050615833565b62014d47821015801561537d575062014db382105b1561539257600f600a0a61029b029050615833565b62014db382101580156153a7575062014dc182105b156153bc57600f600a0a6102de029050615833565b62014dc182101580156153d1575062014dd182105b156153e657600f600a0a610320029050615833565b62014dd182101580156153fb575062014dd882105b1561541057600f600a0a610363029050615833565b62014dd88210158015615425575062014dd982105b1561543a57600f600a0a6103a6029050615833565b62014dd9821015801561544f575062014dfe82105b1561546457600f600a0a6103e8029050615833565b62014dfe8210158015615479575062014e0282105b1561548e57600f600a0a61042b029050615833565b62014e028214156154a957600f600a0a61046e029050615833565b62014e038214156154c457600f600a0a6104b0029050615833565b62014e0482101580156154d9575062014e0c82105b156154ee57600f600a0a610536029050615833565b62014e0c8210158015615503575062014e0e82105b1561551857600f600a0a6105fe029050615833565b62014e0e821015801561552d575062014e4382105b1561554257600f600a0a610683029050615833565b62014e438210158015615557575062014e5382105b1561556c57600f600a0a6107d0029050615833565b62014e538210158015615581575062014e5a82105b1561559657600f600a0a61091e029050615833565b62014e5a82101580156155ab575062014e5d82105b156155c057600f600a0a610a6b029050615833565b62014e5d82101580156155d5575062014eb782105b156155ea57600f600a0a610d06029050615833565b62014eb782141561560557600f600a0a610e53029050615833565b62014eb8821015801561561a575062014ebc82105b1561562f57600f600a0a610fa0029050615833565b62014ebc82141561564a57600f600a0a6111b6029050615833565b62014ebd821015801561565f575062014ec282105b1561567457600f600a0a61123b029050615833565b62014ec28210158015615689575062014ec482105b1561569e57600f600a0a611388029050615833565b62014ec48214156156b957600f600a0a6114d6029050615833565b62014ec58214156156d457600f600a0a611770029050615833565b62014ec682101580156156e9575062014f1082105b156156fe57600f600a0a611a0b029050615833565b62014f1082141561571957600f600a0a611ca6029050615833565b62014f11821015801561572e575062014f1c82105b1561574357600f600a0a612710029050615833565b62014f1c8210158015615758575062014f2382105b1561576d57600f600a0a613416029050615833565b62014f238210158015615782575062014f2682105b1561579757600f600a0a61411b029050615833565b62014f2682101580156157ac575062014f2b82105b156157c157600f600a0a614e20029050615833565b62014f2b82101580156157d6575062014f2e82105b156157eb57600f600a0a618236029050615833565b62014f2e8210158015615800575062014f2f82105b1561581657600f600a0a6201046b029050615833565b62014f2f82141561583257600f600a0a62051616029050615833565b5b919050565b600080823b905060008111915050919050565b60008183600001819055509291505056fe4269642068617320746f206265206174206c6561737420696e697450726963652076616c75652e4269642068617320746f20626520626967676572207468616e207468652063757272656e742068696768657374206269642e41756374696f6e20496e69742070726963652068617320746f20626520626967676572207468616e20302e5061796564207072696365206973206c6f776572207468616e206d61726b65742070726963652e546f6b656e206973206f666665726564206f6e206d61726b65742063616e2774206265207472616e7366657265642e53656e64657220686173206e6f206d61726b65742062616c616e636520746f2077697468647261772e4f6e6c79206e657720636f6e7472616374206f776e657220697320616c6c6f77656420746f206163636570742e546f6b656e20697320696e2061756374696f6e2063616e2774206265207472616e7366657265642ea265627a7a7231582015750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc56454364736f6c634300050c00323234383564616261656265363232373663393736653535623239303433383739396632623630636462383435633530303533653263326265343366613666636568747470733a2f2f63727970746f7469747469657a2e636f6d2f6170692f746f6b656e696e666f2f
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063642ca8a511610118578063a22cb465116100a0578063c8ab84d81161006f578063c8ab84d814610db1578063d1290c1614610df6578063d3a417a214610e0d578063e985e9c514610e5e578063fd353c7b14610ee757610204565b8063a22cb46514610b33578063b77568fb14610b90578063b88d4fde14610beb578063c87b56dd14610cfd57610204565b806393ac3638116100e757806393ac36381461099b57806393adac6e146109ec578063942cb80014610a3b57806395d89b4114610a52578063a064101e14610ae257610204565b8063642ca8a5146108045780636ab0704c1461089457806370a08231146108e757806386e7e3761461094c57610204565b8063277da51c1161019b57806332cf83301161016a57806332cf83301461060357806342842e0e146106685780634ec7c45b146106e357806358c612cb146107325780636352211e1461078957610204565b8063277da51c1461051557806327b3f0d81461056c5780632d8645861461059a5780633175a0e9146105d557610204565b8063095ea7b3116101d7578063095ea7b3146103c157806316ed488e1461041c57806318160ddd1461046f57806323b872dd1461049a57610204565b806301ffc9a71461020957806306fdde031461027b578063081812fc1461030b57806308b3036314610386575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f62565b604051808215151515815260200191505060405180910390f35b34801561028757600080fd5b50610290610fca565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d05780820151818401526020810190506102b5565b50505050905090810190601f1680156102fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031757600080fd5b506103446004803603602081101561032e57600080fd5b810190808035906020019092919050505061106c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b506103bf600480360360208110156103a957600080fd5b81019080803590602001909291905050506110bb565b005b3480156103cd57600080fd5b5061041a600480360360408110156103e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061183d565b005b34801561042857600080fd5b506104556004803603602081101561043f57600080fd5b810190808035906020019092919050505061197e565b604051808215151515815260200191505060405180910390f35b34801561047b57600080fd5b50610484611990565b6040518082815260200191505060405180910390f35b3480156104a657600080fd5b50610513600480360360608110156104bd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061199a565b005b34801561052157600080fd5b5061052a611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105986004803603602081101561058257600080fd5b8101908080359060200190929190505050611aa1565b005b3480156105a657600080fd5b506105d3600480360360208110156105bd57600080fd5b810190808035906020019092919050505061221e565b005b610601600480360360208110156105eb57600080fd5b8101908080359060200190929190505050612570565b005b34801561060f57600080fd5b506106526004803603602081101561062657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b34801561067457600080fd5b506106e16004803603606081101561068b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612986565b005b3480156106ef57600080fd5b5061071c6004803603602081101561070657600080fd5b81019080803590602001909291905050506129a6565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b50610747612a41565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079557600080fd5b506107c2600480360360208110156107ac57600080fd5b8101908080359060200190929190505050612a66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561081057600080fd5b50610819612af3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561085957808201518184015260208101905061083e565b50505050905090810190601f1680156108865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a057600080fd5b506108cd600480360360208110156108b757600080fd5b8101908080359060200190929190505050612b95565b604051808215151515815260200191505060405180910390f35b3480156108f357600080fd5b506109366004803603602081101561090a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c22565b6040518082815260200191505060405180910390f35b34801561095857600080fd5b506109996004803603606081101561096f57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612cab565b005b3480156109a757600080fd5b506109ea600480360360208110156109be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061316d565b005b3480156109f857600080fd5b50610a2560048036036020811015610a0f57600080fd5b8101908080359060200190929190505050613273565b6040518082815260200191505060405180910390f35b348015610a4757600080fd5b50610a50613300565b005b348015610a5e57600080fd5b50610a676134e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa7578082015181840152602081019050610a8c565b50505050905090810190601f168015610ad45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610aee57600080fd5b50610b3160048036036020811015610b0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061358b565b005b348015610b3f57600080fd5b50610b8e60048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613691565b005b348015610b9c57600080fd5b50610be960048036036040811015610bb357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506137cb565b005b348015610bf757600080fd5b50610cfb60048036036080811015610c0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c7557600080fd5b820183602082011115610c8757600080fd5b80359060200191846001830284011164010000000083111715610ca957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613ae2565b005b348015610d0957600080fd5b50610d3660048036036020811015610d2057600080fd5b8101908080359060200190929190505050613b08565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d76578082015181840152602081019050610d5b565b50505050905090810190601f168015610da35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dbd57600080fd5b50610df460048036036040811015610dd457600080fd5b810190808035906020019092919080359060200190929190505050613bf2565b005b348015610e0257600080fd5b50610e0b613fc8565b005b348015610e1957600080fd5b50610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140f4565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141fa565b604051808215151515815260200191505060405180910390f35b348015610ef357600080fd5b50610f2060048036036020811015610f0a57600080fd5b810190808035906020019092919050505061428e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060026000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b600061107782614349565b61108057600080fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6110c481614349565b611136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600082815260200190815260200160002060000160009054906101000a900460ff166111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b42600d60008381526020019081526020016000206003015410611257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41756374696f6e206e6f742066696e6973686564207965742e0000000000000081525060200191505060405180910390fd5b60008090506000809050600080905060008090506000600d600087815260200190815260200160002060010154905060008190506000600d600089815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006112d189614358565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461170157600073ffffffffffffffffffffffffffffffffffffffff16600360008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561142a576113788961445e565b156113f957839450601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b61140d600a8561448b90919063ffffffff16565b955061142286856144b190919063ffffffff16565b96505b61167e565b61143e60648561448b90919063ffffffff16565b975087955061145688846144b190919063ffffffff16565b9250600073ffffffffffffffffffffffffffffffffffffffff16600f60008b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d05761154488600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008d815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cd88846144b190919063ffffffff16565b92505b8796506115e688846144b190919063ffffffff16565b925061163a83600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61168981838b6144f0565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d54898584604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1611776565b7fe8b17ecf2f817707095b9668c71c27857ac5fd8ab281253d411944ced3fb9d5489600080604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a15b6000600d60008b815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d60008b815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008b8152602001908152602001600020600101819055506118208661476e565b611829876147e4565b6118328561485a565b505050505050505050565b600061184882614358565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118c357506118c281336141fa565b5b6118cc57600080fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611989826148d0565b9050919050565b6000600b54905090565b6119a43382614925565b6119ad57600080fd5b6119b6816149ba565b15611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615908602f913960400191505060405180910390fd5b611a15816148d0565b15611a6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061598d6028913960400191505060405180910390fd5b611a768383836144f0565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611aaa81614349565b611b1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b611b25816149ba565b611b97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000611ba282614a5f565b90506000819050600034905060003390506000611bbe86614358565b9050600080905060008090506000809050600080905086891115611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806158e16027913960400191505060405180910390fd5b88871115611cdd57611c99611c4b8a896144b190919063ffffffff16565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611dca57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611e8a57611dd88a61445e565b15611e5957889050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e85565b611e6d600a8a61448b90919063ffffffff16565b9150611e82828a6144b190919063ffffffff16565b92505b6120de565b611e9e60648a61448b90919063ffffffff16565b9350839150611eb684896144b190919063ffffffff16565b9750600073ffffffffffffffffffffffffffffffffffffffff16600f60008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461203057611fa484600e6000600f60008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e6000600f60008e815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d84896144b190919063ffffffff16565b97505b83925061204684896144b190919063ffffffff16565b975061209a88600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546144d190919063ffffffff16565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600c60008c815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c60008c815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60008c81526020019081526020016000206001018190555061218a85878c6144f0565b6121938261476e565b61219c836147e4565b6121a58161485a565b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f093818ad4ae8e39f3d8eb90213f45dde273486ca619ccc887ae2c71dca97f8c68c8c604051808381526020018281526020019250505060405180910390a350505050505050505050565b61222781614349565b612299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b60006122a482614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b612350826149ba565b6123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f546f6b656e206973206e6f74206f6666657265642e000000000000000000000081525060200191505060405180910390fd5b6000600c600084815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600c600084815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c600084815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561251e57806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167f68668e20038684f5370d273dcbcfda23cca7fd1443999a51aabd7b97eff068f2836040518082815260200191505060405180910390a25050565b61257981614349565b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6125f4816148d0565b612666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f546f6b656e206973206e6f7420696e2061756374696f6e2e000000000000000081525060200191505060405180910390fd5b34600d600083815260200190815260200160002060010154106126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806158846032913960400191505060405180910390fd5b34600d6000838152602001908152602001600020600201541115612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061585d6027913960400191505060405180910390fd5b6000600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000349050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461282057600d600085815260200190815260200160002060010154600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b81600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d6000868152602001908152602001600020600101819055507f2f2a2da0cd94316f3c2c6d23d063501f65cf91d4975931d95ac932ee88ba9aea84828486604051808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a150505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129a183838360405180602001604052806000815250613ae2565b505050565b60006129b182614349565b612a23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d6000838152602001908152602001600020600101549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612a7182614349565b612ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612aec82614358565b9050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b8b5780601f10612b6057610100808354040283529160200191612b8b565b820191906000526020600020905b815481529060010190602001808311612b6e57829003601f168201915b5050505050905090565b6000612ba082614349565b612c12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612c1b826149ba565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5d57600080fd5b612ca4600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614af7565b9050919050565b612cb483614349565b612d26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b612d2f836149ba565b15612da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b612dab836148d0565b15612e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000612e2984614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fe4576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b5b6000831161303d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806158b6602b913960400191505060405180910390fd5b6001600d600086815260200190815260200160002060000160006101000a81548160ff0219169083151502179055506000600d600086815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60008681526020019081526020016000206001018190555082600d600086815260200190815260200160002060020181905550814201600d6000868152602001908152602001600020600301819055507f5819773cd5756d683b919e60b4b79368d9da2abe37cdd2d8ecb19eb3c1931c6a8484428542016040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061327e82614349565b6132f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b6132f982614a5f565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615960602d913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135815780601f1061355657610100808354040283529160200191613581565b820191906000526020600020905b81548152906001019060200180831161356457829003601f168201915b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461364d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ca57600080fd5b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6137d482614349565b613846576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b61384f826149ba565b156138c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6b656e206973206f6666657265642e00000000000000000000000000000081525060200191505060405180910390fd5b6138cb826148d0565b1561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e20697320696e2061756374696f6e2e00000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661397f83614358565b73ffffffffffffffffffffffffffffffffffffffff1614613a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b613ade613ad783614358565b82846144f0565b5050565b613aed84848461199a565b613af984848484614b05565b613b0257600080fd5b50505050565b6060613b1382614349565b613b1c57600080fd5b6009613b2783614cee565b6040516020018083805460018160011615610100020316600290048015613b855780601f10613b63576101008083540402835291820191613b85565b820191906000526020600020905b815481529060010190602001808311613b71575b505082805190602001908083835b60208310613bb65780518252602082019150602081019050602083039250613b93565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b613bfb82614349565b613c6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b613c76826149ba565b15613ce9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f546f6b656e20697320616c6c7265616479206f6666657265642e00000000000081525060200191505060405180910390fd5b613cf2826148d0565b15613d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546f6b656e20697320616c6c726561647920696e2061756374696f6e2e00000081525060200191505060405180910390fd5b6000613d7083614358565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f53656e646572206973206e6f7420617574686f72697a65642e0000000000000081525060200191505060405180910390fd5b6001600c600085815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080600c600085815260200190815260200160002060000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c600085815260200190815260200160002060010181905550600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613f6d57806003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8073ffffffffffffffffffffffffffffffffffffffff167fde2d7c25012eb9ea5d9068fde6060e7bee67f37bbd82c3233239a147d3ec4bc58484604051808381526020018281526020019250505060405180910390a2505050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111614065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806159376029913960400191505060405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156140f0573d6000803e3d6000fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146141b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f7765642e0081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061429982614349565b61430b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f546f6b656e20646f6573206e6f74206578697374732e0000000000000000000081525060200191505060405180910390fd5b600d600083815260200190815260200160002060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b548211159050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614422576143ca8261445e565b156143f957601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614459565b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b60006102d08211801561447357506105288211155b156144815760019050614486565b600090505b919050565b600080821161449957600080fd5b60008284816144a457fe5b0490508091505092915050565b6000828211156144c057600080fd5b600082840390508091505092915050565b6000808284019050838110156144e657600080fd5b8091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661451082614358565b73ffffffffffffffffffffffffffffffffffffffff161461453057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561456a57600080fd5b61457381614e25565b6145ba600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614ee3565b614601600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f06565b600073ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156146bc5781600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008111156147e157601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156147df573d6000803e3d6000fd5b505b50565b600081111561485757601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614855573d6000803e3d6000fd5b505b50565b60008111156148cd57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156148cb573d6000803e3d6000fd5b505b50565b600042600d60008481526020019081526020016000206003015410156148f95760009050614920565b600d600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008061493183614358565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806149a057508373ffffffffffffffffffffffffffffffffffffffff166149888461106c565b73ffffffffffffffffffffffffffffffffffffffff16145b806149b157506149b081856141fa565b5b91505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614a3357614a2c82614f1c565b9050614a5a565b600c600083815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614ad857614ad182614f6a565b9050614af2565b600c60008381526020019081526020016000206001015490505b919050565b600081600001549050919050565b6000614b268473ffffffffffffffffffffffffffffffffffffffff16615838565b614b335760019050614ce6565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c0e578082015181840152602081019050614bf3565b50505050905090810190601f168015614c3b5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c5d57600080fd5b505af1158015614c71573d6000803e3d6000fd5b505050506040513d6020811015614c8757600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b606060008290506000811415614d3c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250915050614e20565b600081905060008090505b60008214614d69578080600101915050600a8281614d6157fe5b049150614d47565b6060816040519080825280601f01601f191660200182016040528015614d9e5781602001600182028038833980820191505090505b50905060006001830390505b60008514614e1757600a8581614dbc57fe5b0660300160f81b82828060019003935081518110614dd657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8581614e0f57fe5b049450614daa565b81955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614ee05760006004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b614efb600182600001546144b190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006102d08211614f305760009050614f65565b6102d082118015614f4357506105288211155b15614f515760019050614f65565b610528821115614f645760019050614f65565b5b919050565b60006102d08211614f7e5760009050615833565b6102d082118015614f9157506105288211155b15614fa557600f600a0a6064029050615833565b61052882118015614fb85750611f548211155b15614fcc57600f600a0a6022029050615833565b611f558210158015614fdf5750612aa882105b15614ff357600f600a0a6028029050615833565b612aa88210158015615006575061453882105b1561501a57600f600a0a602f029050615833565b614538821015801561502d575061598882105b1561504157600f600a0a6036029050615833565b6159888210158015615054575061731e82105b1561506857600f600a0a6043029050615833565b61731e821015801561507b575061767082105b1561508f57600f600a0a604a029050615833565b61767082101580156150a25750617ed682105b156150b657600f600a0a6050029050615833565b617ed682101580156150c9575061893082105b156150dd57600f600a0a6057029050615833565b61893082101580156150f05750618ac082105b1561510457600f600a0a605e029050615833565b618ac08210158015615117575061a58282105b1561512b57600f600a0a6064029050615833565b61a582821015801561513e575061b52282105b1561515257600f600a0a6078029050615833565b61b5228210158015615165575061da7082105b1561517957600f600a0a6086029050615833565b61da70821015801561518c575061e9ac82105b156151a057600f600a0a6093029050615833565b61e9ac82101580156151b3575061f69082105b156151c757600f600a0a60a7029050615833565b61f69082101580156151db57506201341682105b156151ef57600f600a0a60c8029050615833565b6201341682101580156152045750620134a282105b1561521857600f600a0a60ea029050615833565b620134a2821015801561522d575062014a1982105b1561524257600f600a0a61010b029050615833565b62014a198210158015615257575062014aa582105b1561526c57600f600a0a61012c029050615833565b62014aa58210158015615281575062014c6c82105b1561529657600f600a0a61014e029050615833565b62014c6c82101580156152ab575062014cad82105b156152c057600f600a0a610190029050615833565b62014cad82101580156152d5575062014cb782105b156152ea57600f600a0a6101b2029050615833565b62014cb782101580156152ff575062014cd582105b1561531457600f600a0a6101d3029050615833565b62014cd58210158015615329575062014cf382105b1561533e57600f600a0a610216029050615833565b62014cf38210158015615353575062014d4782105b1561536857600f600a0a610258029050615833565b62014d47821015801561537d575062014db382105b1561539257600f600a0a61029b029050615833565b62014db382101580156153a7575062014dc182105b156153bc57600f600a0a6102de029050615833565b62014dc182101580156153d1575062014dd182105b156153e657600f600a0a610320029050615833565b62014dd182101580156153fb575062014dd882105b1561541057600f600a0a610363029050615833565b62014dd88210158015615425575062014dd982105b1561543a57600f600a0a6103a6029050615833565b62014dd9821015801561544f575062014dfe82105b1561546457600f600a0a6103e8029050615833565b62014dfe8210158015615479575062014e0282105b1561548e57600f600a0a61042b029050615833565b62014e028214156154a957600f600a0a61046e029050615833565b62014e038214156154c457600f600a0a6104b0029050615833565b62014e0482101580156154d9575062014e0c82105b156154ee57600f600a0a610536029050615833565b62014e0c8210158015615503575062014e0e82105b1561551857600f600a0a6105fe029050615833565b62014e0e821015801561552d575062014e4382105b1561554257600f600a0a610683029050615833565b62014e438210158015615557575062014e5382105b1561556c57600f600a0a6107d0029050615833565b62014e538210158015615581575062014e5a82105b1561559657600f600a0a61091e029050615833565b62014e5a82101580156155ab575062014e5d82105b156155c057600f600a0a610a6b029050615833565b62014e5d82101580156155d5575062014eb782105b156155ea57600f600a0a610d06029050615833565b62014eb782141561560557600f600a0a610e53029050615833565b62014eb8821015801561561a575062014ebc82105b1561562f57600f600a0a610fa0029050615833565b62014ebc82141561564a57600f600a0a6111b6029050615833565b62014ebd821015801561565f575062014ec282105b1561567457600f600a0a61123b029050615833565b62014ec28210158015615689575062014ec482105b1561569e57600f600a0a611388029050615833565b62014ec48214156156b957600f600a0a6114d6029050615833565b62014ec58214156156d457600f600a0a611770029050615833565b62014ec682101580156156e9575062014f1082105b156156fe57600f600a0a611a0b029050615833565b62014f1082141561571957600f600a0a611ca6029050615833565b62014f11821015801561572e575062014f1c82105b1561574357600f600a0a612710029050615833565b62014f1c8210158015615758575062014f2382105b1561576d57600f600a0a613416029050615833565b62014f238210158015615782575062014f2682105b1561579757600f600a0a61411b029050615833565b62014f2682101580156157ac575062014f2b82105b156157c157600f600a0a614e20029050615833565b62014f2b82101580156157d6575062014f2e82105b156157eb57600f600a0a618236029050615833565b62014f2e8210158015615800575062014f2f82105b1561581657600f600a0a6201046b029050615833565b62014f2f82141561583257600f600a0a62051616029050615833565b5b919050565b600080823b905060008111915050919050565b60008183600001819055509291505056fe4269642068617320746f206265206174206c6561737420696e697450726963652076616c75652e4269642068617320746f20626520626967676572207468616e207468652063757272656e742068696768657374206269642e41756374696f6e20496e69742070726963652068617320746f20626520626967676572207468616e20302e5061796564207072696365206973206c6f776572207468616e206d61726b65742070726963652e546f6b656e206973206f666665726564206f6e206d61726b65742063616e2774206265207472616e7366657265642e53656e64657220686173206e6f206d61726b65742062616c616e636520746f2077697468647261772e4f6e6c79206e657720636f6e7472616374206f776e657220697320616c6c6f77656420746f206163636570742e546f6b656e20697320696e2061756374696f6e2063616e2774206265207472616e7366657265642ea265627a7a7231582015750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc56454364736f6c634300050c0032
Deployed Bytecode Sourcemap
5828:49013:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7971:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7971:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7971:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17028:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17028:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17028:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12203:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12203:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12203:154:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32003:3420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32003:3420:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32003:3420:0;;;;;;;;;;;;;;;;;:::i;:::-;;11610:300;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11610:300:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11610:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36387:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36387:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36387:136:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18310:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18310:99:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13799:379;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13799:379:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13799:379:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6230:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6230:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25230:3238;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25230:3238:0;;;;;;;;;;;;;;;;;:::i;:::-;;24298:699;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24298:699:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24298:699:0;;;;;;;;;;;;;;;;;:::i;:::-;;30493:1050;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30493:1050:0;;;;;;;;;;;;;;;;;:::i;:::-;;37463:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37463:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37463:128:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14840:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14840:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14840:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35607:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35607:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35607:218:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6193:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6193:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11010:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11010:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11010:169:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17799:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17799:101:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17799:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22276:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22276:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22276:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10621:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10621:163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10621:163:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28936:1294;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28936:1294:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28936:1294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20663:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20663:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20663:122:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;21309:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21309:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21309:213:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7109:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7109:305:0;;;:::i;:::-;;17228:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17228:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17228:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21013:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21013:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;12658:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12658:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12658:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37925:511;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37925:511:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37925:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15711:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15711:214:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;15711:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15711:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15711:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15711:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15711:214:0;;;;;;;;;;;;;;;:::i;:::-;;17496:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17496:193:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17496:193:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17496:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23326:741;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23326:741:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23326:741:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37097:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37097:255:0;;;:::i;:::-;;6814:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6814:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6814:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13205:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13205:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13205:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36030:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36030:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36030:225:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7971:135;8041:4;8065:20;:33;8086:11;8065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;8058:40;;7971:135;;;:::o;17028:85::-;17067:13;17100:5;17093:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17028:85;:::o;12203:154::-;12262:7;12290:16;12298:7;12290;:16::i;:::-;12282:25;;;;;;12325:15;:24;12341:7;12325:24;;;;;;;;;;;;;;;;;;;;;12318:31;;12203:154;;;:::o;32003:3420::-;32075:17;32083:8;32075:7;:17::i;:::-;32067:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32138:15;:25;32154:8;32138:25;;;;;;;;;;;:35;;;;;;;;;;;;32130:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32257:15;32221;:25;32237:8;32221:25;;;;;;;;;;;:33;;;:51;32213:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32315:17;32335:1;32315:21;;32347:19;32369:1;32347:23;;32381:19;32403:1;32381:23;;32415:21;32439:1;32415:25;;32451:14;32468:15;:25;32484:8;32468:25;;;;;;;;;;;:36;;;32451:53;;32515:19;32537:6;32515:28;;32554:14;32571:15;:25;32587:8;32571:25;;;;;;;;;;;:39;;;;;;;;;;;;32554:56;;32621:14;32638:18;32647:8;32638;:18::i;:::-;32621:35;;32744:1;32726:20;;:6;:20;;;32723:2275;;32798:1;32767:33;;:11;:21;32779:8;32767:21;;;;;;;;;;;;;;;;;;;;;:33;;;32764:1842;;;32858:25;32874:8;32858:15;:25::i;:::-;32855:592;;;33042:6;33026:22;;33153:20;;;;;;;;;;;33124:16;:26;33141:8;33124:26;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;32855:592;;;33313:14;33324:2;33313:6;:10;;:14;;;;:::i;:::-;33299:28;;33404:23;33415:11;33404:6;:10;;:23;;;;:::i;:::-;33390:37;;32855:592;32764:1842;;;33584:15;33595:3;33584:6;:10;;:15;;;;:::i;:::-;33572:27;;33714:9;33700:23;;33756:26;33772:9;33756:11;:15;;:26;;;;:::i;:::-;33742:40;;33896:1;33860:38;;:16;:26;33877:8;33860:26;;;;;;;;;;;;;;;;;;;;;:38;;;33857:374;;34016:58;34064:9;34016:15;:43;34032:16;:26;34049:8;34032:26;;;;;;;;;;;;;;;;;;;;;34016:43;;;;;;;;;;;;;;;;:47;;:58;;;;:::i;:::-;33970:15;:43;33986:16;:26;34003:8;33986:26;;;;;;;;;;;;;;;;;;;;;33970:43;;;;;;;;;;;;;;;:104;;;;34185:26;34201:9;34185:11;:15;;:26;;;;:::i;:::-;34171:40;;33857:374;34345:9;34331:23;;34387:26;34403:9;34387:11;:15;;:26;;;;:::i;:::-;34373:40;;34550;34578:11;34550:15;:23;34566:6;34550:23;;;;;;;;;;;;;;;;:27;;:40;;;;:::i;:::-;34524:15;:23;34540:6;34524:23;;;;;;;;;;;;;;;:66;;;;32764:1842;34692:39;34706:6;34714;34722:8;34692:13;:39::i;:::-;34794:46;34815:8;34825:6;34833;34794:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32723:2275;;;34941:45;34962:8;34972:1;34983;34941:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32723:2275;35074:5;35036:15;:25;35052:8;35036:25;;;;;;;;;;;:35;;;:43;;;;;;;;;;;;;;;;;;35140:1;35090:15;:25;35106:8;35090:25;;;;;;;;;;;:39;;;:52;;;;;;;;;;;;;;;;;;35192:1;35153:15;:25;35169:8;35153:25;;;;;;;;;;;:36;;:40;;;;35293:31;35312:11;35293:18;:31::i;:::-;35335;35354:11;35335:18;:31::i;:::-;35377:38;35401:13;35377:23;:38::i;:::-;32003:3420;;;;;;;;;:::o;11610:300::-;11674:13;11690:17;11699:7;11690:8;:17::i;:::-;11674:33;;11732:5;11726:11;;:2;:11;;;;11718:20;;;;;;11771:5;11757:19;;:10;:19;;;:58;;;;11780:35;11797:5;11804:10;11780:16;:35::i;:::-;11757:58;11749:67;;;;;;11856:2;11829:15;:24;11845:7;11829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11894:7;11890:2;11874:28;;11883:5;11874:28;;;;;;;;;;;;11610:300;;;:::o;36387:136::-;36454:12;36485:30;36506:8;36485:20;:30::i;:::-;36478:37;;36387:136;;;:::o;18310:99::-;18354:15;18389:12;;18382:19;;18310:99;:::o;13799:379::-;13890:39;13909:10;13921:7;13890:18;:39::i;:::-;13882:48;;;;;;13944:27;13963:7;13944:18;:27::i;:::-;13943:28;13935:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14043:29;14064:7;14043:20;:29::i;:::-;14042:30;14034:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14138:32;14152:4;14158:2;14162:7;14138:13;:32::i;:::-;13799:379;;;:::o;6230:33::-;;;;;;;;;;;;;:::o;25230:3238::-;25306:17;25314:8;25306:7;:17::i;:::-;25298:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25369:28;25388:8;25369:18;:28::i;:::-;25361:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25446:14;25464:35;25490:8;25464:25;:35::i;:::-;25446:53;;25510:19;25532:6;25510:28;;25549:14;25566:9;25549:26;;25586:14;25603:10;25586:27;;25624:14;25641:18;25650:8;25641;:18::i;:::-;25624:35;;25670:17;25690:1;25670:21;;25702:19;25724:1;25702:23;;25736:19;25758:1;25736:23;;25770:21;25794:1;25770:25;;25824:6;25816;:14;;25808:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25964:6;25957;:13;25954:117;;;26012:47;26040:18;26051:6;26040;:10;;:18;;;;:::i;:::-;26012:15;:23;26028:6;26012:23;;;;;;;;;;;;;;;;:27;;:47;;;;:::i;:::-;25986:15;:23;26002:6;25986:23;;;;;;;;;;;;;;;:73;;;;25954:117;26128:1;26097:33;;:11;:21;26109:8;26097:21;;;;;;;;;;;;;;;;;;;;;:33;;;26096:79;;;;26159:15;;;;;;;;;;;26136:38;;:11;:21;26148:8;26136:21;;;;;;;;;;;;;;;;;;;;;:38;;;26096:79;26093:1780;;;26225:25;26241:8;26225:15;:25::i;:::-;26222:543;;;26397:6;26381:22;;26500:20;;;;;;;;;;;26471:16;:26;26488:8;26471:26;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;26222:543;;;26643:14;26654:2;26643:6;:10;;:14;;;;:::i;:::-;26629:28;;26726:23;26737:11;26726:6;:10;;:23;;;;:::i;:::-;26712:37;;26222:543;26093:1780;;;26908:15;26919:3;26908:6;:10;;:15;;;;:::i;:::-;26896:27;;27026:9;27012:23;;27076:26;27092:9;27076:11;:15;;:26;;;;:::i;:::-;27062:40;;27204:1;27168:38;;:16;:26;27185:8;27168:26;;;;;;;;;;;;;;;;;;;;;:38;;;27165:365;;27331:58;27379:9;27331:15;:43;27347:16;:26;27364:8;27347:26;;;;;;;;;;;;;;;;;;;;;27331:43;;;;;;;;;;;;;;;;:47;;:58;;;;:::i;:::-;27285:15;:43;27301:16;:26;27318:8;27301:26;;;;;;;;;;;;;;;;;;;;;27285:43;;;;;;;;;;;;;;;:104;;;;27488:26;27504:9;27488:11;:15;;:26;;;;:::i;:::-;27474:40;;27165:365;27632:9;27618:23;;27670:26;27686:9;27670:11;:15;;:26;;;;:::i;:::-;27656:40;;27821;27849:11;27821:15;:23;27837:6;27821:23;;;;;;;;;;;;;;;;:27;;:40;;;;:::i;:::-;27795:15;:23;27811:6;27795:23;;;;;;;;;;;;;;;:66;;;;26093:1780;27949:5;27915:13;:23;27929:8;27915:23;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;28005:1;27965:13;:23;27979:8;27965:23;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;28050:1;28018:13;:23;28032:8;28018:23;;;;;;;;;;;:29;;:33;;;;28097:39;28111:6;28119;28127:8;28097:13;:39::i;:::-;28237:31;28256:11;28237:18;:31::i;:::-;28279;28298:11;28279:18;:31::i;:::-;28321:38;28345:13;28321:23;:38::i;:::-;28435:6;28411:49;;28427:6;28411:49;;;28443:8;28453:6;28411:49;;;;;;;;;;;;;;;;;;;;;;;;25230:3238;;;;;;;;;;:::o;24298:699::-;24369:17;24377:8;24369:7;:17::i;:::-;24361:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24426:14;24443:18;24452:8;24443;:18::i;:::-;24426:35;;24490:10;24482:18;;:6;:18;;;24474:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24549:28;24568:8;24549:18;:28::i;:::-;24541:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24650:5;24616:13;:23;24630:8;24616:23;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;24706:1;24666:13;:23;24680:8;24666:23;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;24751:1;24719:13;:23;24733:8;24719:23;;;;;;;;;;;:29;;:33;;;;24807:1;24776:33;;:11;:21;24788:8;24776:21;;;;;;;;;;;;;;;;;;;;;:33;;;24773:91;;;24846:6;24822:11;:21;24834:8;24822:21;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;24773:91;24972:6;24953:36;;;24980:8;24953:36;;;;;;;;;;;;;;;;;;24298:699;;:::o;30493:1050::-;30571:17;30579:8;30571:7;:17::i;:::-;30563:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30634:30;30655:8;30634:20;:30::i;:::-;30626:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30759:9;30720:15;:25;30736:8;30720:25;;;;;;;;;;;:36;;;:48;30712:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30882:9;30843:15;:25;30859:8;30843:25;;;;;;;;;;;:35;;;:48;;30835:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30948:17;30968:15;:25;30984:8;30968:25;;;;;;;;;;;:39;;;;;;;;;;;;30948:59;;31018:14;31035:10;31018:27;;31056:16;31075:9;31056:28;;31175:1;31156:21;;:9;:21;;;31153:118;;31223:15;:25;31239:8;31223:25;;;;;;;;;;;:36;;;31193:15;:26;31209:9;31193:26;;;;;;;;;;;;;;;;:66;;;;;;;;;;;31153:118;31356:6;31314:15;:25;31330:8;31314:25;;;;;;;;;;;:39;;;:48;;;;;;;;;;;;;;;;;;31412:8;31373:15;:25;31389:8;31373:25;;;;;;;;;;;:36;;:47;;;;31472:55;31489:8;31499;31509:6;31517:9;31472:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30493:1050;;;;:::o;37463:128::-;37525:16;37560:15;:23;37576:6;37560:23;;;;;;;;;;;;;;;;37553:30;;37463:128;;;:::o;14840:134::-;14927:39;14944:4;14950:2;14954:7;14927:39;;;;;;;;;;;;:16;:39::i;:::-;14840:134;;;:::o;35607:218::-;35682:14;35717:17;35725:8;35717:7;:17::i;:::-;35709:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35781:15;:25;35797:8;35781:25;;;;;;;;;;;:36;;;35774:43;;35607:218;;;:::o;6193:30::-;;;;;;;;;;;;;:::o;11010:169::-;11065:7;11093:16;11101:7;11093;:16::i;:::-;11085:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11154:17;11163:7;11154:8;:17::i;:::-;11147:24;;11010:169;;;:::o;17799:101::-;17848:13;17877:15;17870:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17799:101;:::o;22276:199::-;22342:4;22367:17;22375:8;22367:7;:17::i;:::-;22359:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22439:28;22458:8;22439:18;:28::i;:::-;22432:35;;22276:199;;;:::o;10621:163::-;10676:7;10721:1;10704:19;;:5;:19;;;;10696:28;;;;;;10742:34;:17;:24;10760:5;10742:24;;;;;;;;;;;;;;;:32;:34::i;:::-;10735:41;;10621:163;;;:::o;28936:1294::-;29045:17;29053:8;29045:7;:17::i;:::-;29037:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29109:28;29128:8;29109:18;:28::i;:::-;29108:29;29100:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29188:30;29209:8;29188:20;:30::i;:::-;29187:31;29179:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29265:14;29282:18;29291:8;29282;:18::i;:::-;29265:35;;29365:10;29357:18;;:6;:18;;;29354:304;;29458:15;;;;;;;;;;;29450:23;;:6;:23;;;29442:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29606:10;29588:28;;:16;;;;;;;;;;;:28;;;29580:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29354:304;29689:1;29678:10;:12;29670:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29831:4;29793:15;:25;29809:8;29793:25;;;;;;;;;;;:35;;;:42;;;;;;;;;;;;;;;;;;29896:1;29846:15;:25;29862:8;29846:25;;;;;;;;;;;:39;;;:52;;;;;;;;;;;;;;;;;;29948:1;29909:15;:25;29925:8;29909:25;;;;;;;;;;;:36;;:40;;;;29998:10;29960:15;:25;29976:8;29960:25;;;;;;;;;;;:35;;:48;;;;30071:9;30055:15;:25;30019:15;:25;30035:8;30019:25;;;;;;;;;;;:33;;:61;;;;30136:86;30157:8;30167:10;30179:15;30212:9;30196:15;:25;30136:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28936:1294;;;;:::o;20663:122::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20762:15;20743:16;;:34;;;;;;;;;;;;;;;;;;20663:122;:::o;21309:213::-;21382:14;21417:17;21425:8;21417:7;:17::i;:::-;21409:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21479:35;21505:8;21479:25;:35::i;:::-;21472:42;;21309:213;;;:::o;7109:305::-;7176:18;;;;;;;;;;;7162:32;;:10;:32;;;7154:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7298:18;;;;;;;;;;;7260:57;;7281:15;;;;;;;;;;;7260:57;;;;;;;;;;;;7346:18;;;;;;;;;;;7328:15;;:36;;;;;;;;;;;;;;;;;;7404:1;7375:18;;:31;;;;;;;;;;;;;;;;;;7109:305::o;17228:89::-;17269:13;17302:7;17295:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17228:89;:::o;21013:111::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21104:12;21088:13;;:28;;;;;;;;;;;;;;;;;;21013:111;:::o;12658:217::-;12744:10;12738:16;;:2;:16;;;;12730:25;;;;;;12803:8;12766:18;:30;12785:10;12766:30;;;;;;;;;;;;;;;:34;12797:2;12766:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;12854:2;12827:40;;12842:10;12827:40;;;12858:8;12827:40;;;;;;;;;;;;;;;;;;;;;;12658:217;;:::o;37925:511::-;38006:17;38014:8;38006:7;:17::i;:::-;37998:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38070:28;38089:8;38070:18;:28::i;:::-;38069:29;38061:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38140:30;38161:8;38140:20;:30::i;:::-;38139:31;38131:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38236:15;;;;;;;;;;;38216:35;;:18;38225:8;38216;:18::i;:::-;:35;;;38208:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38327:10;38312:25;;:13;;;;;;;;;;;:25;;;38304:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38380:48;38394:18;38403:8;38394;:18::i;:::-;38414:3;38419:8;38380:13;:48::i;:::-;37925:511;;:::o;15711:214::-;15818:31;15831:4;15837:2;15841:7;15818:12;:31::i;:::-;15868:48;15891:4;15897:2;15901:7;15910:5;15868:22;:48::i;:::-;15860:57;;;;;;15711:214;;;;:::o;17496:193::-;17554:13;17588:16;17596:7;17588;:16::i;:::-;17580:25;;;;;;17647:13;17662:17;17671:7;17662:8;:17::i;:::-;17630:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17630:50:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17630:50:0;;;17616:65;;17496:193;;;:::o;23326:741::-;23413:17;23421:8;23413:7;:17::i;:::-;23405:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23477:28;23496:8;23477:18;:28::i;:::-;23476:29;23468:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23556:30;23577:8;23556:20;:30::i;:::-;23555:31;23547:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23633:14;23650:18;23659:8;23650;:18::i;:::-;23633:35;;23697:10;23689:18;;:6;:18;;;23681:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23784:4;23750:13;:23;23764:8;23750:23;;;;;;;;;;;:31;;;:38;;;;;;;;;;;;;;;;;;23831:6;23799:13;:23;23813:8;23799:23;;;;;;;;;;;:29;;;:38;;;;;;;;;;;;;;;;;;23880:6;23848:13;:23;23862:8;23848:23;;;;;;;;;;;:29;;:38;;;;23941:1;23910:33;;:11;:21;23922:8;23910:21;;;;;;;;;;;;;;;;;;;;;:33;;;23907:91;;;23980:6;23956:11;:21;23968:8;23956:21;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;23907:91;24034:6;24015:44;;;24042:8;24052:6;24015:44;;;;;;;;;;;;;;;;;;;;;;;;23326:741;;;:::o;37097:255::-;37148:11;37162:15;:27;37178:10;37162:27;;;;;;;;;;;;;;;;37148:41;;37215:1;37208:6;:8;37200:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37305:1;37275:15;:27;37291:10;37275:27;;;;;;;;;;;;;;;:31;;;;37317:10;:19;;:27;37337:6;37317:27;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37317:27:0;37097:255;:::o;6814:110::-;6448:15;;;;;;;;;;;6434:29;;:10;:29;;;6426:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:8;6887:18;;:29;;;;;;;;;;;;;;;;;;6814:110;:::o;13205:147::-;13285:4;13309:18;:25;13328:5;13309:25;;;;;;;;;;;;;;;:35;13335:8;13309:35;;;;;;;;;;;;;;;;;;;;;;;;;13302:42;;13205:147;;;;:::o;36030:225::-;36108:15;36144:17;36152:8;36144:7;:17::i;:::-;36136:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36208:15;:25;36224:8;36208:25;;;;;;;;;;;:39;;;;;;;;;;;;36201:46;;36030:225;;;:::o;41028:178::-;41085:20;41185:12;;41173:8;:24;;41165:33;;41028:178;;;:::o;39944:550::-;40003:14;40074:1;40043:33;;:11;:21;40055:8;40043:21;;;;;;;;;;;;;;;;;;;;;:33;;;40040:366;;;40181:25;40197:8;40181:15;:25::i;:::-;40178:140;;;40282:20;;;;;;;;;;;40275:27;;;;40178:140;40379:15;;;;;;;;;;;40372:22;;;;40040:366;40465:11;:21;40477:8;40465:21;;;;;;;;;;;;;;;;;;;;;40458:28;;39944:550;;;;:::o;40628:196::-;40694:15;40734:3;40725:8;:12;:30;;;;;40751:4;40741:8;:14;;40725:30;40722:72;;;40778:4;40771:11;;;;40722:72;40811:5;40804:12;;40628:196;;;;:::o;810:303::-;868:7;967:1;963;:5;955:14;;;;;;980:9;996:1;992;:5;;;;;;980:17;;1104:1;1097:8;;;810:303;;;;:::o;1251:150::-;1309:7;1342:1;1337;:6;;1329:15;;;;;;1355:9;1371:1;1367;:5;1355:17;;1392:1;1385:8;;;1251:150;;;;:::o;1489:::-;1547:7;1567:9;1583:1;1579;:5;1567:17;;1608:1;1603;:6;;1595:15;;;;;;1630:1;1623:8;;;1489:150;;;;:::o;42212:462::-;42327:4;42306:25;;:17;42315:7;42306:8;:17::i;:::-;:25;;;42298:34;;;;;;42365:1;42351:16;;:2;:16;;;;42343:25;;;;;;42381:23;42396:7;42381:14;:23::i;:::-;42417:35;:17;:23;42435:4;42417:23;;;;;;;;;;;;;;;:33;:35::i;:::-;42463:33;:17;:21;42481:2;42463:21;;;;;;;;;;;;;;;:31;:33::i;:::-;42541:1;42506:37;;:16;:25;42523:7;42506:25;;;;;;;;;;;;;;;;;;;;;:37;;;42503:83;;;42578:2;42550:16;:25;42567:7;42550:25;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;42503:83;42619:2;42596:11;:20;42608:7;42596:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;42658:7;42654:2;42639:27;;42648:4;42639:27;;;;;;;;;;;;42212:462;;;:::o;38843:148::-;38921:1;38912:8;:10;38909:75;;;38938:15;;;;;;;;;;;:24;;:34;38963:8;38938:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38938:34:0;38909:75;38843:148;:::o;39401:147::-;39479:1;39470:8;:10;39467:74;;;39496:14;;;;;;;;;;;:23;;:33;39520:8;39496:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39496:33:0;39467:74;39401:147;:::o;39120:158::-;39203:1;39194:8;:10;39191:80;;;39220:20;;;;;;;;;;;:29;;:39;39250:8;39220:39;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39220:39:0;39191:80;39120:158;:::o;36724:247::-;36793:12;36856:15;36820;:25;36836:8;36820:25;;;;;;;;;;;:33;;;:51;36817:94;;;36894:5;36887:12;;;;36817:94;36928:15;:25;36944:8;36928:25;;;;;;;;;;;:35;;;;;;;;;;;;36921:42;;36724:247;;;;:::o;41576:250::-;41661:4;41678:13;41694:17;41703:7;41694:8;:17::i;:::-;41678:33;;41741:5;41730:16;;:7;:16;;;:51;;;;41774:7;41750:31;;:20;41762:7;41750:11;:20::i;:::-;:31;;;41730:51;:87;;;;41785:32;41802:5;41809:7;41785:16;:32::i;:::-;41730:87;41722:96;;;41576:250;;;;:::o;22796:241::-;22864:4;22917:1;22886:33;;:11;:21;22898:8;22886:21;;;;;;;;;;;;;;;;;;;;;:33;;;22883:96;;;22942:25;22958:8;22942:15;:25::i;:::-;22935:32;;;;22883:96;22998:13;:23;23012:8;22998:23;;;;;;;;;;;:31;;;;;;;;;;;;22991:38;;22796:241;;;;:::o;21852:252::-;21927:14;21988:1;21957:33;;:11;:21;21969:8;21957:21;;;;;;;;;;;;;;;;;;;;;:33;;;21954:96;;;22013:25;22029:8;22013:15;:25::i;:::-;22006:32;;;;21954:96;22067:13;:23;22081:8;22067:23;;;;;;;;;;;:29;;;22060:36;;21852:252;;;;:::o;4042:114::-;4107:7;4134;:14;;;4127:21;;4042:114;;;:::o;43280:356::-;43402:4;43429:15;:2;:13;;;:15::i;:::-;43424:60;;43468:4;43461:11;;;;43424:60;43496:13;43528:2;43512:36;;;43549:10;43561:4;43567:7;43576:5;43512:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43512:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43512:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43512:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43512:70:0;;;;;;;;;;;;;;;;43496:86;;8665:10;43611:16;;43601:26;;;:6;:26;;;;43593:35;;;43280:356;;;;;;;:::o;44081:548::-;44133:13;44158;44174:1;44158:17;;44201:1;44192:5;:10;44188:53;;;44219:10;;;;;;;;;;;;;;;;;;;;;;44188:53;44253:9;44265:5;44253:17;;44281:14;44298:1;44281:18;;44312:71;44324:1;44319;:6;44312:71;;44341:8;;;;;;;44369:2;44364:7;;;;;;;;;44312:71;;;44395:17;44425:6;44415:17;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;44415:17:0;;;;44395:37;;44443:9;44464:1;44455:6;:10;44443:22;;44478:112;44494:1;44485:5;:10;44478:112;;44548:2;44540:5;:10;;;;;;44535:2;:15;44524:28;;44512:4;44517:3;;;;;;;44512:9;;;;;;;;;;;:40;;;;;;;;;;;44576:2;44567:11;;;;;;;;;44478:112;;;44616:4;44602:19;;;;;;;44081:548;;;;:::o;43804:175::-;43904:1;43868:38;;:15;:24;43884:7;43868:24;;;;;;;;;;;;;;;;;;;;;:38;;;43864:108;;43958:1;43923:15;:24;43939:7;43923:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43864:108;43804:175;:::o;4396:110::-;4477:21;4496:1;4477:7;:14;;;:18;;:21;;;;:::i;:::-;4460:7;:14;;:38;;;;4396:110;:::o;4297:91::-;4379:1;4361:7;:14;;;:19;;;;;;;;;;;4297:91;:::o;52735:423::-;52801:16;52843:3;52833:8;:13;52830:102;;52915:5;52908:12;;;;52830:102;52954:3;52945:8;:12;:30;;;;;52971:4;52961:8;:14;;52945:30;52942:111;;;53037:4;53030:11;;;;52942:111;53077:4;53068:8;:13;53065:86;;;53135:4;53128:11;;;;53065:86;52735:423;;;;:::o;44847:7714::-;44913:14;44961:3;44951:8;:13;44948:99;;45034:1;45027:8;;;;44948:99;45069:3;45060:8;:12;:30;;;;;45086:4;45076:8;:14;;45060:30;45057:132;;;45174:2;45167;45159:17;45152:3;:25;45145:32;;;;45057:132;45213:4;45204:8;:13;:31;;;;;45231:4;45221:8;:14;;45204:31;45201:117;;;45303:2;45296;45288:17;45282:2;:24;45275:31;;;;45201:117;45343:4;45333:8;:14;;:32;;;;;45360:5;45351:8;:14;45333:32;45330:118;;;45433:2;45426;45418:17;45412:2;:24;45405:31;;;;45330:118;45473:5;45463:8;:15;;:33;;;;;45491:5;45482:8;:14;45463:33;45460:119;;;45564:2;45557;45549:17;45543:2;:24;45536:31;;;;45460:119;45604:5;45594:8;:15;;:33;;;;;45622:5;45613:8;:14;45594:33;45591:118;;;45694:2;45687;45679:17;45674:2;:23;45667:30;;;;45591:118;45734:5;45724:8;:15;;:33;;;;;45752:5;45743:8;:14;45724:33;45721:120;;;45826:2;45819;45811:17;45805:2;:24;45798:31;;;;45721:120;45866:5;45856:8;:15;;:33;;;;;45884:5;45875:8;:14;45856:33;45853:120;;;45958:2;45951;45943:17;45937:2;:24;45930:31;;;;45853:120;45998:5;45988:8;:15;;:33;;;;;46016:5;46007:8;:14;45988:33;45985:120;;;46090:2;46083;46075:17;46069:2;:24;46062:31;;;;45985:120;46130:5;46120:8;:15;;:33;;;;;46148:5;46139:8;:14;46120:33;46117:120;;;46222:2;46215;46207:17;46201:2;:24;46194:31;;;;46117:120;46262:5;46252:8;:15;;:33;;;;;46280:5;46271:8;:14;46252:33;46249:120;;;46354:2;46347;46339:17;46333:2;:24;46326:31;;;;46249:120;46394:5;46384:8;:15;;:33;;;;;46412:5;46403:8;:14;46384:33;46381:121;;;46487:2;46480;46472:17;46465:3;:25;46458:32;;;;46381:121;46527:5;46517:8;:15;;:33;;;;;46545:5;46536:8;:14;46517:33;46514:121;;;46620:2;46613;46605:17;46598:3;:25;46591:32;;;;46514:121;46660:5;46650:8;:15;;:33;;;;;46678:5;46669:8;:14;46650:33;46647:121;;;46753:2;46746;46738:17;46731:3;:25;46724:32;;;;46647:121;46793:5;46783:8;:15;;:33;;;;;46811:5;46802:8;:14;46783:33;46780:121;;;46886:2;46879;46871:17;46864:3;:25;46857:32;;;;46780:121;46926:5;46916:8;:15;;:33;;;;;46944:5;46935:8;:14;46916:33;46913:121;;;47019:2;47012;47004:17;46997:3;:25;46990:32;;;;46913:121;47059:5;47049:8;:15;;:33;;;;;47077:5;47068:8;:14;47049:33;47046:121;;;47152:2;47145;47137:17;47130:3;:25;47123:32;;;;47046:121;47192:5;47182:8;:15;;:33;;;;;47210:5;47201:8;:14;47182:33;47179:121;;;47285:2;47278;47270:17;47263:3;:25;47256:32;;;;47179:121;47325:5;47315:8;:15;;:33;;;;;47343:5;47334:8;:14;47315:33;47312:121;;;47418:2;47411;47403:17;47396:3;:25;47389:32;;;;47312:121;47458:5;47448:8;:15;;:33;;;;;47476:5;47467:8;:14;47448:33;47445:121;;;47551:2;47544;47536:17;47529:3;:25;47522:32;;;;47445:121;47591:5;47581:8;:15;;:33;;;;;47609:5;47600:8;:14;47581:33;47578:121;;;47684:2;47677;47669:17;47662:3;:25;47655:32;;;;47578:121;47724:5;47714:8;:15;;:33;;;;;47742:5;47733:8;:14;47714:33;47711:121;;;47817:2;47810;47802:17;47795:3;:25;47788:32;;;;47711:121;47857:5;47847:8;:15;;:33;;;;;47875:5;47866:8;:14;47847:33;47844:121;;;47950:2;47943;47935:17;47928:3;:25;47921:32;;;;47844:121;47990:5;47980:8;:15;;:33;;;;;48008:5;47999:8;:14;47980:33;47977:121;;;48083:2;48076;48068:17;48061:3;:25;48054:32;;;;47977:121;48123:5;48113:8;:15;;:33;;;;;48141:5;48132:8;:14;48113:33;48110:121;;;48216:2;48209;48201:17;48194:3;:25;48187:32;;;;48110:121;48256:5;48246:8;:15;;:33;;;;;48274:5;48265:8;:14;48246:33;48243:121;;;48349:2;48342;48334:17;48327:3;:25;48320:32;;;;48243:121;48389:5;48379:8;:15;;:33;;;;;48407:5;48398:8;:14;48379:33;48376:122;;;48483:2;48476;48468:17;48461:3;:25;48454:32;;;;48376:122;48523:5;48513:8;:15;;:33;;;;;48541:5;48532:8;:14;48513:33;48510:122;;;48617:2;48610;48602:17;48595:3;:25;48588:32;;;;48510:122;48657:5;48647:8;:15;;:33;;;;;48675:5;48666:8;:14;48647:33;48644:122;;;48751:2;48744;48736:17;48729:3;:25;48722:32;;;;48644:122;48791:5;48781:8;:15;;:33;;;;;48809:5;48800:8;:14;48781:33;48778:122;;;48885:2;48878;48870:17;48863:3;:25;48856:32;;;;48778:122;48925:5;48915:8;:15;;:33;;;;;48943:5;48934:8;:14;48915:33;48912:122;;;49019:2;49012;49004:17;48997:3;:25;48990:32;;;;48912:122;49059:5;49049:8;:15;;:33;;;;;49077:5;49068:8;:14;49049:33;49046:123;;;49154:2;49147;49139:17;49131:4;:26;49124:33;;;;49046:123;49194:5;49184:8;:15;;:33;;;;;49212:5;49203:8;:14;49184:33;49181:123;;;49289:2;49282;49274:17;49266:4;:26;49259:33;;;;49181:123;49329:5;49319:8;:15;49316:105;;;49406:2;49399;49391:17;49383:4;:26;49376:33;;;;49316:105;49446:5;49436:8;:15;49433:105;;;49523:2;49516;49508:17;49500:4;:26;49493:33;;;;49433:105;49563:5;49553:8;:15;;:33;;;;;49581:5;49572:8;:14;49553:33;49550:123;;;49658:2;49651;49643:17;49635:4;:26;49628:33;;;;49550:123;49698:5;49688:8;:15;;:33;;;;;49716:5;49707:8;:14;49688:33;49685:123;;;49793:2;49786;49778:17;49770:4;:26;49763:33;;;;49685:123;49833:5;49823:8;:15;;:33;;;;;49851:5;49842:8;:14;49823:33;49820:123;;;49928:2;49921;49913:17;49905:4;:26;49898:33;;;;49820:123;49968:5;49958:8;:15;;:33;;;;;49986:5;49977:8;:14;49958:33;49955:123;;;50063:2;50056;50048:17;50040:4;:26;50033:33;;;;49955:123;50103:5;50093:8;:15;;:33;;;;;50121:5;50112:8;:14;50093:33;50090:123;;;50198:2;50191;50183:17;50175:4;:26;50168:33;;;;50090:123;50238:5;50228:8;:15;;:33;;;;;50256:5;50247:8;:14;50228:33;50225:123;;;50333:2;50326;50318:17;50310:4;:26;50303:33;;;;50225:123;50373:5;50363:8;:15;;:33;;;;;50391:5;50382:8;:14;50363:33;50360:123;;;50468:2;50461;50453:17;50445:4;:26;50438:33;;;;50360:123;50508:5;50498:8;:15;50495:105;;;50585:2;50578;50570:17;50562:4;:26;50555:33;;;;50495:105;50625:5;50615:8;:15;;:33;;;;;50643:5;50634:8;:14;50615:33;50612:123;;;50720:2;50713;50705:17;50697:4;:26;50690:33;;;;50612:123;50760:5;50750:8;:15;50747:105;;;50837:2;50830;50822:17;50814:4;:26;50807:33;;;;50747:105;50877:5;50867:8;:15;;:33;;;;;50895:5;50886:8;:14;50867:33;50864:123;;;50972:2;50965;50957:17;50949:4;:26;50942:33;;;;50864:123;51012:5;51002:8;:15;;:33;;;;;51030:5;51021:8;:14;51002:33;50999:123;;;51107:2;51100;51092:17;51084:4;:26;51077:33;;;;50999:123;51147:5;51137:8;:15;51134:105;;;51224:2;51217;51209:17;51201:4;:26;51194:33;;;;51134:105;51264:5;51254:8;:15;51251:105;;;51341:2;51334;51326:17;51318:4;:26;51311:33;;;;51251:105;51381:5;51371:8;:15;;:33;;;;;51399:5;51390:8;:14;51371:33;51368:124;;;51477:2;51470;51462:17;51454:4;:26;51447:33;;;;51368:124;51517:5;51507:8;:15;51504:106;;;51595:2;51588;51580:17;51572:4;:26;51565:33;;;;51504:106;51635:5;51625:8;:15;;:33;;;;;51653:5;51644:8;:14;51625:33;51622:125;;;51732:2;51725;51717:17;51708:5;:27;51701:34;;;;51622:125;51772:5;51762:8;:15;;:33;;;;;51790:5;51781:8;:14;51762:33;51759:125;;;51869:2;51862;51854:17;51845:5;:27;51838:34;;;;51759:125;51909:5;51899:8;:15;;:33;;;;;51927:5;51918:8;:14;51899:33;51896:125;;;52006:2;51999;51991:17;51982:5;:27;51975:34;;;;51896:125;52046:5;52036:8;:15;;:33;;;;;52064:5;52055:8;:14;52036:33;52033:125;;;52143:2;52136;52128:17;52119:5;:27;52112:34;;;;52033:125;52183:5;52173:8;:15;;:33;;;;;52201:5;52192:8;:14;52173:33;52170:125;;;52280:2;52273;52265:17;52256:5;:27;52249:34;;;;52170:125;52320:5;52310:8;:15;;:33;;;;;52338:5;52329:8;:14;52310:33;52307:126;;;52418:2;52411;52403:17;52394:5;:27;52387:34;;;;52307:126;52458:5;52448:8;:15;52445:109;;;52539:2;52532;52524:17;52514:6;:28;52507:35;;;;52445:109;44847:7714;;;;:::o;2382:627::-;2442:4;2459:12;2966:7;2954:20;2946:28;;3000:1;2993:4;:8;2986:15;;;2382:627;;;:::o;4168:121::-;4239:7;4276:5;4259:7;:14;;:22;;;;4168:121;;;;:::o
Swarm Source
bzzr://15750935f59bf9a7781823efde62e214425dc257fb8701d412a4bf2cdc564543
Loading...
Loading
Loading...
Loading
[ 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.