ETH Price: $2,725.87 (+12.53%)
 

Overview

Max Total Supply

256 CTN

Holders

0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
yangcs.eth
Balance
1 CTN
0x26f128ca082cc1c28670000e6274f275723c8f1e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoToon

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-18
*/

pragma solidity ^0.4.24;

contract ERC721Basic {
    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    function balanceOf(address _owner) public view returns (uint256 _balance);

    function ownerOf(uint256 _tokenId) public view returns (address _owner);

    function exists(uint256 _tokenId) public view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) public;

    function getApproved(uint256 _tokenId) public view returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) public;

    function isApprovedForAll(address _owner, address _operator) public view returns (bool);

    function transferFrom(address _from, address _to, uint256 _tokenId) public;

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;

    //    function safeTransferFrom(
    //        address _from,
    //        address _to,
    //        uint256 _tokenId,
    //        bytes _data
    //    )
    //    public;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
    function totalSupply() public view returns (uint256);

    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);

    function tokenByIndex(uint256 _index) public view returns (uint256);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
    function name() public view returns (string _name);

    function symbol() public view returns (string _symbol);

    function tokenURI(uint256 _tokenId) public view returns (string);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

contract ToonInterface is ERC721 {

    function isToonInterface() external pure returns (bool);

    /**
    * @notice   Returns an address of the toon author. 0x0 if
    *           the toon has been created by us.
    */
    function authorAddress() external view returns (address);

    /**
    * @notice   Returns maximum supply. In other words there will
    *           be never more toons that that number. It has to
    *           be constant.
    *           If there is no limit function returns 0.
    */
    function maxSupply() external view returns (uint256);

    function getToonInfo(uint _id) external view returns (
        uint genes,
        uint birthTime,
        address owner
    );

}

contract Ownable {
    address public owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }


    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }


    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}

contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;


    /**
     * @dev modifier to allow actions only when the contract IS paused
     */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
     * @dev modifier to allow actions only when the contract IS NOT paused
     */
    modifier whenPaused {
        require(paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyOwner whenNotPaused returns (bool) {
        paused = true;
        emit Pause();
        return true;
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyOwner whenPaused returns (bool) {
        paused = false;
        emit Unpause();
        return true;
    }
}

contract Withdrawable {

    mapping(address => uint) private pendingWithdrawals;

    event Withdrawal(address indexed receiver, uint amount);
    event BalanceChanged(address indexed _address, uint oldBalance, uint newBalance);

    /**
    * Returns amount of wei that given address is able to withdraw.
    */
    function getPendingWithdrawal(address _address) public view returns (uint) {
        return pendingWithdrawals[_address];
    }

    /**
    * Add pending withdrawal for an address.
    */
    function addPendingWithdrawal(address _address, uint _amount) internal {
        require(_address != 0x0);

        uint oldBalance = pendingWithdrawals[_address];
        pendingWithdrawals[_address] += _amount;

        emit BalanceChanged(_address, oldBalance, oldBalance + _amount);
    }

    /**
    * Withdraws all pending withdrawals.
    */
    function withdraw() external {
        uint amount = getPendingWithdrawal(msg.sender);
        require(amount > 0);

        pendingWithdrawals[msg.sender] = 0;
        msg.sender.transfer(amount);

        emit Withdrawal(msg.sender, amount);
        emit BalanceChanged(msg.sender, amount, 0);
    }

}

contract ClockAuctionBase is Withdrawable, Pausable {

    // Represents an auction on an NFT
    struct Auction {
        // Address of a contract
        address _contract;
        // Current owner of NFT
        address seller;
        // Price (in wei) at beginning of auction
        uint128 startingPrice;
        // Price (in wei) at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        // NOTE: 0 if this auction has been concluded
        uint64 startedAt;
    }

    // Reference to contract tracking NFT ownership
    ToonInterface[] public toonContracts;
    mapping(address => uint256) addressToIndex;

    // Cut owner takes on each auction, measured in basis points (1/100 of a percent).
    // Values 0-10,000 map to 0%-100%
    uint256 public ownerCut;

    // Values 0-10,000 map to 0%-100%
    // Author's share from the owner cut.
    uint256 public authorShare;

    // Map from token ID to their corresponding auction.
    //    mapping(uint256 => Auction) tokenIdToAuction;
    mapping(address => mapping(uint256 => Auction)) tokenToAuction;

    event AuctionCreated(address indexed _contract, uint256 indexed tokenId,
        uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(address indexed _contract, uint256 indexed tokenId,
        uint256 totalPrice, address indexed winner);
    event AuctionCancelled(address indexed _contract, uint256 indexed tokenId);

    /**
    * @notice   Adds a new toon contract.
    */
    function addToonContract(address _toonContractAddress) external onlyOwner {
        ToonInterface _interface = ToonInterface(_toonContractAddress);
        require(_interface.isToonInterface());

        uint _index = toonContracts.push(_interface) - 1;
        addressToIndex[_toonContractAddress] = _index;
    }

    /// @dev Returns true if the claimant owns the token.
    /// @param _contract - address of a toon contract
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _contract, address _claimant, uint256 _tokenId)
    internal
    view
    returns (bool) {
        ToonInterface _interface = _interfaceByAddress(_contract);
        address _owner = _interface.ownerOf(_tokenId);

        return (_owner == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// Throws if the escrow fails.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _contract, address _owner, uint256 _tokenId) internal {
        ToonInterface _interface = _interfaceByAddress(_contract);
        // it will throw if transfer fails
        _interface.transferFrom(_owner, this, _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// Returns true if the transfer succeeds.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _contract, address _receiver, uint256 _tokenId) internal {
        ToonInterface _interface = _interfaceByAddress(_contract);
        // it will throw if transfer fails
        _interface.transferFrom(this, _receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions. Also fires the
    ///  AuctionCreated event.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(address _contract, uint256 _tokenId, Auction _auction) internal {
        // Require that all auctions have a duration of
        // at least one minute. (Keeps our math from getting hairy!)
        require(_auction.duration >= 1 minutes);

        _isAddressSupportedContract(_contract);
        tokenToAuction[_contract][_tokenId] = _auction;

        emit AuctionCreated(
            _contract,
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(address _contract, uint256 _tokenId, address _seller) internal {
        _removeAuction(_contract, _tokenId);
        _transfer(_contract, _seller, _tokenId);
        emit AuctionCancelled(_contract, _tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    /// Does NOT transfer ownership of token.
    function _bid(address _contract, uint256 _tokenId, uint256 _bidAmount)
    internal
    returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenToAuction[_contract][_tokenId];
        ToonInterface _interface = _interfaceByAddress(auction._contract);

        // Explicitly check that this auction is currently live.
        // (Because of how Ethereum mappings work, we can't just count
        // on the lookup above failing. An invalid _tokenId will just
        // return an auction object that is all zeros.)
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        // Grab a reference to the seller before the auction struct
        // gets deleted.
        address seller = auction.seller;

        // The bid is good! Remove the auction before sending the fees
        // to the sender so we can't have a reentrancy attack.
        _removeAuction(_contract, _tokenId);

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
            // Calculate the auctioneer's cut.
            // (NOTE: _computeCut() is guaranteed to return a
            // value <= price, so this subtraction can't go negative.)
            uint256 auctioneerCut;
            uint256 authorCut;
            uint256 sellerProceeds;
            (auctioneerCut, authorCut, sellerProceeds) = _computeCut(_interface, price);

            if (authorCut > 0) {
                address authorAddress = _interface.authorAddress();
                addPendingWithdrawal(authorAddress, authorCut);
            }

            addPendingWithdrawal(owner, auctioneerCut);

            // NOTE: Doing a transfer() in the middle of a complex
            // method like this is generally discouraged because of
            // reentrancy attacks and DoS attacks if the seller is
            // a contract with an invalid fallback function. We explicitly
            // guard against reentrancy attacks by removing the auction
            // before calling transfer(), and the only thing the seller
            // can DoS is the sale of their own asset! (And if it's an
            // accident, they can call cancelAuction(). )
            seller.transfer(sellerProceeds);
        }

        // Calculate any excess funds included with the bid. If the excess
        // is anything worth worrying about, transfer it back to bidder.
        // NOTE: We checked above that the bid amount is greater than or
        // equal to the price so this cannot underflow.
        uint256 bidExcess = _bidAmount - price;

        // Return the funds. Similar to the previous transfer, this is
        // not susceptible to a re-entry attack because the auction is
        // removed before any transfers occur.
        msg.sender.transfer(bidExcess);

        // Tell the world!
        emit AuctionSuccessful(_contract, _tokenId, price, msg.sender);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(address _contract, uint256 _tokenId) internal {
        delete tokenToAuction[_contract][_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0);
    }

    /// @dev Returns current price of an NFT on auction. Broken into two
    ///  functions (this one, that computes the duration from the auction
    ///  structure, and the other that does the price computation) so we
    ///  can easily test that the price computation works correctly.
    function _currentPrice(Auction storage _auction)
    internal
    view
    returns (uint256)
    {
        uint256 secondsPassed = 0;

        // A bit of insurance against negative values (or wraparound).
        // Probably not necessary (since Ethereum guarnatees that the
        // now variable doesn't ever go backwards).
        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction. Factored out
    ///  from _currentPrice so we can run extensive unit tests.
    ///  When testing, make this function public and turn on
    ///  `Current price computation` test suite.
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
    internal
    pure
    returns (uint256)
    {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our public functions carefully cap the maximum values for
        //  time (at 64-bits) and currency (at 128-bits). _duration is
        //  also known to be non-zero (see the require() statement in
        //  _addAuction())
        if (_secondsPassed >= _duration) {
            // We've reached the end of the dynamic pricing portion
            // of the auction, just return the end price.
            return _endingPrice;
        } else {
            // Starting price can be higher than ending price (and often is!), so
            // this delta can be negative.
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            // This multiplication can't overflow, _secondsPassed will easily fit within
            // 64-bits, and totalPriceChange will easily fit within 128-bits, their product
            // will always fit within 256-bits.
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            // currentPriceChange can be negative, but if so, will have a magnitude
            // less that _startingPrice. Thus, this result will always end up positive.
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(ToonInterface _interface, uint256 _price) internal view returns (
        uint256 ownerCutValue,
        uint256 authorCutValue,
        uint256 sellerProceeds
    ) {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our entry functions carefully cap the maximum values for
        //  currency (at 128-bits), and ownerCut <= 10000 (see the require()
        //  statement in the ClockAuction constructor). The result of this
        //  function is always guaranteed to be <= _price.

        uint256 _totalCut = _price * ownerCut / 10000;
        uint256 _authorCut = 0;
        uint256 _ownerCut = 0;
        if (_interface.authorAddress() != 0x0) {
            _authorCut = _totalCut * authorShare / 10000;
        }

        _ownerCut = _totalCut - _authorCut;
        uint256 _sellerProfit = _price - _ownerCut - _authorCut;
        require(_sellerProfit + _ownerCut + _authorCut == _price);

        return (_ownerCut, _authorCut, _sellerProfit);
    }

    function _interfaceByAddress(address _address) internal view returns (ToonInterface) {
        uint _index = addressToIndex[_address];
        ToonInterface _interface = toonContracts[_index];
        require(_address == address(_interface));

        return _interface;
    }

    function _isAddressSupportedContract(address _address) internal view returns (bool) {
        uint _index = addressToIndex[_address];
        ToonInterface _interface = toonContracts[_index];
        return _address == address(_interface);
    }
}

contract ClockAuction is ClockAuctionBase {

    /// @dev The ERC-165 interface signature for ERC-721.
    ///  Ref: https://github.com/ethereum/EIPs/issues/165
    ///  Ref: https://github.com/ethereum/EIPs/issues/721
    bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);

    bool public isSaleClockAuction = true;

    /// @dev Constructor creates a reference to the NFT ownership contract
    ///  and verifies the owner cut is in the valid range.
    /// @param _ownerCut - percent cut the owner takes on each auction, must be
    ///  between 0-10,000.
    /// @param _authorShare - percent share of the author of the toon.
    ///  Calculated from the ownerCut
    constructor(uint256 _ownerCut, uint256 _authorShare) public {
        require(_ownerCut <= 10000);
        require(_authorShare <= 10000);

        ownerCut = _ownerCut;
        authorShare = _authorShare;
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        address _contract,
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
    external
    whenNotPaused
    {
        require(_isAddressSupportedContract(_contract));
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        _escrow(_contract, _seller, _tokenId);

        Auction memory auction = Auction(
            _contract,
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_contract, _tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough Ether is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(address _contract, uint256 _tokenId)
    external
    payable
    whenNotPaused
    {
        // _bid will throw if the bid or funds transfer fails
        _bid(_contract, _tokenId, msg.value);
        _transfer(_contract, msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(address _contract, uint256 _tokenId)
    external
    {
        Auction storage auction = tokenToAuction[_contract][_tokenId];
        require(_isOnAuction(auction));
        address seller = auction.seller;
        require(msg.sender == seller);
        _cancelAuction(_contract, _tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(address _contract, uint256 _tokenId)
    whenPaused
    onlyOwner
    external
    {
        Auction storage auction = tokenToAuction[_contract][_tokenId];
        require(_isOnAuction(auction));
        _cancelAuction(_contract, _tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(address _contract, uint256 _tokenId)
    external
    view
    returns
    (
        address seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt,
        uint256 currentPrice
    ) {
        Auction storage auction = tokenToAuction[_contract][_tokenId];

        if (!_isOnAuction(auction)) {
            return (0x0, 0, 0, 0, 0, 0);
        }

        return (
        auction.seller,
        auction.startingPrice,
        auction.endingPrice,
        auction.duration,
        auction.startedAt,
        getCurrentPrice(_contract, _tokenId)
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(address _contract, uint256 _tokenId)
    public
    view
    returns (uint256)
    {
        Auction storage auction = tokenToAuction[_contract][_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

}



contract AccessControl is Ownable {
    // This facet controls access control for CryptoKitties. There are four roles managed here:
    //
    //     - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart
    //         contracts. It is also the only role that can unpause the smart contract. It is initially
    //         set to the address that created the smart contract in the KittyCore constructor.
    //
    //     - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.
    //
    //     - The COO: The COO can release gen0 kitties to auction, and mint promo cats.
    //
    // It should be noted that these roles are distinct without overlap in their access abilities, the
    // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any
    // address to any role, the CEO address itself doesn't have the ability to act in those roles. This
    // restriction is intentional so that we aren't tempted to use the CEO address frequently out of
    // convenience. The less we use an address, the less likely it is that we somehow compromise the
    // account.

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public ceoAddress;
    address public cfoAddress;
    address public cooAddress;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    /// @dev Access modifier for CFO-only functionality
    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    /// @dev Access modifier for COO-only functionality
    modifier onlyCOO() {
        require(msg.sender == cooAddress);
        _;
    }

    modifier onlyCLevel() {
        require(
            msg.sender == cooAddress ||
            msg.sender == ceoAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    constructor() public {
        ceoAddress = owner;
        cfoAddress = owner;
        cooAddress = owner;
    }

    /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param _newCEO The address of the new CEO
    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.
    /// @param _newCFO The address of the new CFO
    function setCFO(address _newCFO) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    /// @dev Assigns a new address to act as the COO. Only available to the current CEO.
    /// @param _newCOO The address of the new COO
    function setCOO(address _newCOO) external onlyCEO {
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CFO or COO accounts are
    ///  compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

contract ERC165MappingImplementation is ERC165 {
    /// @dev You must not set element 0xffffffff to true
    mapping(bytes4 => bool) internal supportedInterfaces;

    constructor() internal {
        supportedInterfaces[this.supportsInterface.selector] = true;
    }

    function supportsInterface(bytes4 interfaceID) external view returns (bool) {
        return supportedInterfaces[interfaceID];
    }
}

library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }

    function toString(uint i) internal pure returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint length;
        while (j != 0){
            length++;
            j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint k = length - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }

}

library AddressUtils {

    /**
     * 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 addr address to check
     * @return whether the target address is a contract
     */
    function isContract(address addr) 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.
        assembly { size := extcodesize(addr) }  // solium-disable-line security/no-inline-assembly
        return size > 0;
    }

}

contract ERC721Receiver {
    /**
     * @dev Magic value to be returned upon successful reception of an NFT
     *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
     *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
     */
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     *  after a `safetransfer`. This function MAY throw to revert and reject the
     *  transfer. This function MUST use 50,000 gas or less. Return of other
     *  than the magic value MUST result in the transaction being reverted.
     *  Note: the contract address is always the message sender.
     * @param _from The sending address
     * @param _tokenId The NFT identifier which is being transfered
     * @param _data Additional data with no specified format
     * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
     */
    function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

contract ERC721BasicToken is ERC721Basic, ERC165MappingImplementation {
    using SafeMath for uint256;
    using AddressUtils for address;

    // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    // Mapping from token ID to owner
    mapping(uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) internal operatorApprovals;

    /**
     * @dev Guarantees msg.sender is owner of the given token
     * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
     */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender);
        _;
    }

    constructor() public {
        supportedInterfaces[0x80ac58cd] = true;
    }

    /**
     * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
     * @param _tokenId uint256 ID of the token to validate
     */
    modifier canTransfer(uint256 _tokenId) {
        require(isApprovedOrOwner(msg.sender, _tokenId));
        _;
    }

    /**
     * @dev Gets the balance of the specified address
     * @param _owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address _owner) public view returns (uint256) {
        require(_owner != address(0));
        return ownedTokensCount[_owner];
    }

    /**
     * @dev Gets the owner of the specified token ID
     * @param _tokenId uint256 ID of the token to query the owner of
     * @return owner address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0));
        return owner;
    }

    /**
     * @dev Returns whether the specified token exists
     * @param _tokenId uint256 ID of the token to query the existence of
     * @return whether the token exists
     */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * @dev The zero address indicates there is no approved address.
     * @dev There can only be one approved address per token at a given time.
     * @dev 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));

        if (getApproved(_tokenId) != address(0) || _to != address(0)) {
            tokenApprovals[_tokenId] = _to;
            emit Approval(owner, _to, _tokenId);
        }
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * @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) {
        return tokenApprovals[_tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * @dev 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
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev 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 canTransfer(_tokenId) {
        require(_from != address(0));
        require(_to != address(0));

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * @dev If the target address is a contract, it must implement `onERC721Received`,
     *  which is called upon a safe transfer, and return the magic value
     *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     *  the transfer is reverted.
     * @dev 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
    canTransfer(_tokenId)
    {
        // solium-disable-next-line arg-overflow
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * @dev If the target address is a contract, it must implement `onERC721Received`,
     *  which is called upon a safe transfer, and return the magic value
     *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     *  the transfer is reverted.
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
    public
    canTransfer(_tokenId)
    {
        transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
    }

    /**
     * @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 mint a new token
     * @dev Reverts if the given token ID already exists
     * @param _to The address that will own the minted token
     * @param _tokenId uint256 ID of the token to be minted by the msg.sender
     */
    function _mint(address _to, uint256 _tokenId) internal {
        require(_to != address(0));
        addTokenTo(_to, _tokenId);
        emit Transfer(address(0), _to, _tokenId);
    }

    /**
     * @dev Internal function to clear current approval of a given token ID
     * @dev Reverts if the given address is not indeed the owner of the token
     * @param _owner owner of the token
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require(ownerOf(_tokenId) == _owner);
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
            emit Approval(_owner, address(0), _tokenId);
        }
    }

    /**
     * @dev Internal function to add a token ID to the list of a given address
     * @param _to address representing the new owner of the given token ID
     * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        require(tokenOwner[_tokenId] == address(0));
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
    }

    /**
     * @dev Internal function to remove a token ID from the list of a given address
     * @param _from address representing the previous owner of the given token ID
     * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        require(ownerOf(_tokenId) == _from);
        ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
        tokenOwner[_tokenId] = address(0);
    }

    /**
     * @dev Internal function to invoke `onERC721Received` on a target address
     * @dev The call is not executed if the target address is not a contract
     * @param _from address representing the previous owner of the given token ID
     * @param _to target address that will receive the tokens
     * @param _tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function checkAndCallSafeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
    internal
    returns (bool)
    {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);
        return (retval == ERC721_RECEIVED);
    }
}

contract ERC721Token is ERC721, ERC721BasicToken {

    // Token name
    string internal name_;

    // Token symbol
    string internal symbol_;

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) internal ownedTokensIndex;

    /**
     * @dev Constructor function
     */
    constructor(string _name, string _symbol) public {
        supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
        supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable

        name_ = _name;
        symbol_ = _symbol;
    }

    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() public view returns (string) {
        return name_;
    }

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() public view returns (string) {
        return symbol_;
    }

    /**
     * @dev Returns an URI for a given token ID
     * @dev Throws if the token ID does not exist. May return an empty string.
     * @param _tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 _tokenId) public view returns (string);

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner
     * @param _owner address owning the tokens list to be accessed
     * @param _index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
        require(_index < balanceOf(_owner));
        return ownedTokens[_owner][_index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256);

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * @dev Reverts if the index is greater or equal to the total number of tokens
     * @param _index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require(_index < totalSupply());

        //In our case id is an index and vice versa.
        return _index;
    }

    /**
     * @dev Internal function to add a token ID to the list of a given address
     * @param _to address representing the new owner of the given token ID
     * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        super.addTokenTo(_to, _tokenId);
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
     * @dev Internal function to remove a token ID from the list of a given address
     * @param _from address representing the previous owner of the given token ID
     * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        super.removeTokenFrom(_from, _tokenId);

        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        ownedTokens[_from][lastTokenIndex] = 0;
        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        ownedTokens[_from].length--;
        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

}

library StringUtils {

    struct slice {
        uint _len;
        uint _ptr;
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string memory self) internal pure returns (slice memory) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice memory self, slice memory other) internal pure returns (string memory) {
        string memory ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }

    function memcpy(uint dest, uint src, uint len) private pure {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

}

contract ToonBase is ERC721Token, AccessControl, ToonInterface {

    using StringUtils for *;
    using SafeMath for uint;

    Toon[] private toons;
    uint public maxSupply;
    uint32 public maxPromoToons;
    address public authorAddress;

    string public endpoint = "https://mindhouse.io:3100/metadata/";

    constructor(string _name, string _symbol, uint _maxSupply, uint32 _maxPromoToons, address _author)
    public
    ERC721Token(_name, _symbol) {
        require(_maxPromoToons <= _maxSupply);

        maxSupply = _maxSupply;
        maxPromoToons = _maxPromoToons;
        authorAddress = _author;
    }

    function maxSupply() external view returns (uint) {
        return maxSupply;
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return toons.length;
    }

    /**
     * @dev Returns an URI for a given token ID
     * @dev Throws if the token ID does not exist. May return an empty string.
     * @param _tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 _tokenId) public view returns (string) {
        require(exists(_tokenId));
        string memory slash = "/";
        return endpoint.toSlice().concat(name_.toSlice()).toSlice().concat(slash.toSlice()).toSlice().concat(_tokenId.toString().toSlice());
    }

    function authorAddress() external view returns (address) {
        return authorAddress;
    }

    function changeEndpoint(string newEndpoint) external onlyOwner {
        endpoint = newEndpoint;
    }

    function isToonInterface() external pure returns (bool) {
        return true;
    }

    function _getToon(uint _id) internal view returns (Toon){
        require(_id <= totalSupply());
        return toons[_id];
    }

    function _createToon(uint _genes, address _owner) internal {
        require(totalSupply() < maxSupply);

        Toon memory _toon = Toon(_genes, now);
        uint id = toons.push(_toon) - 1;

        _mint(_owner, id);
    }

    struct Toon {
        uint256 genes;

        uint256 birthTime;
    }
}

library SafeMath32 {


    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint32 a, uint32 b) internal pure returns (uint32 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint32 a, uint32 b) internal pure returns (uint32) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint32 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint32 a, uint32 b) internal pure returns (uint32) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }

}

contract ToonMinting is ToonBase {
    using SafeMath32 for uint32;

    uint32 public promoToonsMinted = 0;

    constructor(string _name, string _symbol, uint _maxSupply, uint32 _maxPromoToons, address _author)
    public
    ToonBase(_name, _symbol, _maxSupply, _maxPromoToons, _author) {
    }

    function createPromoToon(uint _genes, address _owner) external onlyCOO {
        require(promoToonsMinted < maxPromoToons);
        address _toonOwner = _owner;
        if (_toonOwner == 0x0) {
            _toonOwner = cooAddress;
        }

        _createToon(_genes, _toonOwner);
        promoToonsMinted = promoToonsMinted.add(1);
    }

}

contract ToonAuction is ToonMinting {

    ClockAuction public saleAuction;

    constructor(string _name, string _symbol, uint _maxSupply, uint32 _maxPromoToons, address _author)
    public
    ToonMinting(_name, _symbol, _maxSupply, _maxPromoToons, _author) {
    }

    function setSaleAuctionAddress(address _address) external onlyCEO {
        ClockAuction candidateContract = ClockAuction(_address);
        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
    }

    function createSaleAuction(
        uint256 _toonId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        // Auction contract checks input sizes
        // If toon is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(ownerOf(_toonId) == msg.sender);
        approve(saleAuction, _toonId);

        // Sale auction throws if inputs are invalid and clears
        // transfer approval after escrowing the toon.
        saleAuction.createAuction(
            this,
            _toonId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

}

contract CryptoToon is ToonAuction {

    constructor(string _name, string _symbol, uint _maxSupply, uint32 _maxPromoToons, address _author)
    public
    ToonAuction(_name, _symbol, _maxSupply, _maxPromoToons, _author) {
    }

    function getToonInfo(uint _id) external view returns (
        uint genes,
        uint birthTime,
        address owner
    ) {
        Toon memory _toon = _getToon(_id);
        return (_toon.genes, _toon.birthTime, ownerOf(_id));
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"authorAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getToonInfo","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isToonInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_toonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endpoint","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newEndpoint","type":"string"}],"name":"changeEndpoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoToon","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxPromoToons","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"promoToonsMinted","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_maxSupply","type":"uint256"},{"name":"_maxPromoToons","type":"uint32"},{"name":"_author","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60806040526000600c60146101000a81548160ff021916908315150217905550606060405190810160405280602381526020017f68747470733a2f2f6d696e64686f7573652e696f3a333130302f6d657461646181526020017f74612f000000000000000000000000000000000000000000000000000000000081525060109080519060200190620000939291906200052e565b506000601160006101000a81548163ffffffff021916908363ffffffff160217905550348015620000c357600080fd5b5060405162003bf338038062003bf38339810180604052810190808051820192919060200180518201929190602001805190602001909291908051906020019092919080519060200190929190505050848484848484848484848484848484848460016000806301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008063780e9d637c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555081600590805190602001906200030f9291906200052e565b508060069080519060200190620003289291906200052e565b50505033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828263ffffffff1611151515620004ab57600080fd5b82600e8190555081600f60006101000a81548163ffffffff021916908363ffffffff16021790555080600f60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505050505050505050505050620005dd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057157805160ff1916838001178555620005a2565b82800160010185558215620005a2579182015b82811115620005a157825182559160200191906001019062000584565b5b509050620005b19190620005b5565b5090565b620005da91905b80821115620005d6576000816000905550600101620005bc565b5090565b90565b61360680620005ed6000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101f357806302a86781146102575780630519ce79146102ae57806306fdde0314610305578063081812fc14610395578063095ea7b3146104025780630a0f81681461044f57806318160ddd146104a65780631d907075146104d157806323b872dd1461054c57806327d7874c146105b95780632ba73c15146105fc5780632f745c591461063f57806335bb5fd2146106a05780633d7d3f5a146106cf5780633f4ba83a1461071a57806342842e0e146107315780634e0a33791461079e5780634f558e79146107e15780634f6ccce7146108265780635c975abb146108675780635e280f11146108965780636352211e146109265780636fbde40d1461099357806370a08231146109d65780637d01a51714610a2d5780638456cb5914610a685780638da5cb5b14610a7f57806395d89b4114610ad6578063a22cb46514610b66578063a27771a614610bb5578063ab90f85514610c02578063b047fb5014610c39578063b88d4fde14610c90578063c87b56dd14610d43578063d5abeb0114610de9578063e6cbe35114610e14578063e985e9c514610e6b578063f2fde38b14610ee6578063f42541be14610f29575b600080fd5b3480156101ff57600080fd5b5061023d60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f60565b604051808215151515815260200191505060405180910390f35b34801561026357600080fd5b5061026c610fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102ba57600080fd5b506102c3610ff1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031157600080fd5b5061031a611017565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035a57808201518184015260208101905061033f565b50505050905090810190601f1680156103875780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a157600080fd5b506103c0600480360381019080803590602001909291905050506110b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040e57600080fd5b5061044d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110f6565b005b34801561045b57600080fd5b506104646112bc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b257600080fd5b506104bb6112e2565b6040518082815260200191505060405180910390f35b3480156104dd57600080fd5b506104fc600480360381019080803590602001909291905050506112ef565b604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b34801561055857600080fd5b506105b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611328565b005b3480156105c557600080fd5b506105fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061143f565b005b34801561060857600080fd5b5061063d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061151b565b005b34801561064b57600080fd5b5061068a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f7565b6040518082815260200191505060405180910390f35b3480156106ac57600080fd5b506106b561166e565b604051808215151515815260200191505060405180910390f35b3480156106db57600080fd5b5061071860048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611677565b005b34801561072657600080fd5b5061072f611830565b005b34801561073d57600080fd5b5061079c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c4565b005b3480156107aa57600080fd5b506107df600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118fc565b005b3480156107ed57600080fd5b5061080c600480360381019080803590602001909291905050506119d8565b604051808215151515815260200191505060405180910390f35b34801561083257600080fd5b5061085160048036038101908080359060200190929190505050611a4a565b6040518082815260200191505060405180910390f35b34801561087357600080fd5b5061087c611a69565b604051808215151515815260200191505060405180910390f35b3480156108a257600080fd5b506108ab611a7c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108eb5780820151818401526020810190506108d0565b50505050905090810190601f1680156109185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561093257600080fd5b5061095160048036038101908080359060200190929190505050611b1a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099f57600080fd5b506109d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b98565b005b3480156109e257600080fd5b50610a17600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce8565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a66600480360381019080803590602001908201803590602001919091929391929390505050611d6c565b005b348015610a7457600080fd5b50610a7d611dde565b005b348015610a8b57600080fd5b50610a94611f23565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ae257600080fd5b50610aeb611f49565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b2b578082015181840152602081019050610b10565b50505050905090810190601f168015610b585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b7257600080fd5b50610bb3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611feb565b005b348015610bc157600080fd5b50610c0060048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b348015610c0e57600080fd5b50610c17612266565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610c4557600080fd5b50610c4e61227c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c9c57600080fd5b50610d41600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506122a2565b005b348015610d4f57600080fd5b50610d6e600480360381019080803590602001909291905050506122e1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dae578082015181840152602081019050610d93565b50505050905090810190601f168015610ddb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610df557600080fd5b50610dfe6124db565b6040518082815260200191505060405180910390f35b348015610e2057600080fd5b50610e296124e5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e7757600080fd5b50610ecc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061250b565b604051808215151515815260200191505060405180910390f35b348015610ef257600080fd5b50610f27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061259f565b005b348015610f3557600080fd5b50610f3e6126f7565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061110182611b1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561113e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061117e575061117d813361250b565b5b151561118957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166111aa836110b9565b73ffffffffffffffffffffffffffffffffffffffff161415806111fa5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156112b757826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d80549050905090565b60008060006112fc6134d5565b6113058561270d565b90508060000151816020015161131a87611b1a565b935093509350509193909250565b80611333338261276e565b151561133e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561137a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156113b657600080fd5b6113c08483612803565b6113ca848361296c565b6113d48383612b84565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d757600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561157757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156115b357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061160283611ce8565b8210151561160f57600080fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561165b57fe5b9060005260206000200154905092915050565b60006001905090565b600c60149054906101000a900460ff1615151561169357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116b385611b1a565b73ffffffffffffffffffffffffffffffffffffffff161415156116d557600080fd5b611701601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856110f6565b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6effbe93086868686336040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050600060405180830381600087803b15801561181257600080fd5b505af1158015611826573d6000803e3d6000fd5b5050505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188c57600080fd5b600c60149054906101000a900460ff1615156118a757600080fd5b6000600c60146101000a81548160ff021916908315150217905550565b806118cf338261276e565b15156118da57600080fd5b6118f684848460206040519081016040528060008152506122a2565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561199457600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000611a546112e2565b82101515611a6157600080fd5b819050919050565b600c60149054906101000a900460ff1681565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b125780601f10611ae757610100808354040283529160200191611b12565b820191906000526020600020905b815481529060010190602001808311611af557829003601f168201915b505050505081565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b8f57600080fd5b80915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bf657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d6020811015611c8757600080fd5b81019080805190602001909291905050501515611ca357600080fd5b80601160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d2557600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dc857600080fd5b818160109190611dd99291906134ef565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e875750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611edf5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611eea57600080fd5b600c60149054906101000a900460ff16151515611f0657600080fd5b6001600c60146101000a81548160ff021916908315150217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fe15780601f10611fb657610100808354040283529160200191611fe1565b820191906000526020600020905b815481529060010190602001808311611fc457829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561202657600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561218557600080fd5b600f60009054906101000a900463ffffffff1663ffffffff16601160009054906101000a900463ffffffff1663ffffffff161015156121c357600080fd5b81905060008173ffffffffffffffffffffffffffffffffffffffff16141561220b57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6122158382612c5b565b6122416001601160009054906101000a900463ffffffff1663ffffffff16612cec90919063ffffffff16565b601160006101000a81548163ffffffff021916908363ffffffff160217905550505050565b600f60009054906101000a900463ffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b816122ad338261276e565b15156122b857600080fd5b6122c3858585611328565b6122cf85858585612d14565b15156122da57600080fd5b5050505050565b6060806122ed836119d8565b15156122f857600080fd5b6040805190810160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525090506124d361234461233f85612f02565b613059565b6124c56124c061235385613059565b6124b26124ad6123fc60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123f25780601f106123c7576101008083540402835291602001916123f2565b820191906000526020600020905b8154815290600101906020018083116123d557829003601f168201915b5050505050613059565b61249f60108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124955780601f1061246a57610100808354040283529160200191612495565b820191906000526020600020905b81548152906001019060200180831161247857829003601f168201915b5050505050613059565b61308790919063ffffffff16565b613059565b61308790919063ffffffff16565b613059565b61308790919063ffffffff16565b915050919050565b6000600e54905090565b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125fb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561263757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160009054906101000a900463ffffffff1681565b6127156134d5565b61271d6112e2565b821115151561272b57600080fd5b600d8281548110151561273a57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250509050919050565b60008061277a83611b1a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127e957508373ffffffffffffffffffffffffffffffffffffffff166127d1846110b9565b73ffffffffffffffffffffffffffffffffffffffff16145b806127fa57506127f9818561250b565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661282382611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614151561284557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129685760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061297b8585613109565b600860008581526020019081526020016000205492506129e76001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061323890919063ffffffff16565b9150600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612a3557fe5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612a8f57fe5b90600052602060002001819055506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612aeb57fe5b9060005260206000200181905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612b4b919061356f565b50600060086000868152602001908152602001600020819055508260086000838152602001908152602001600020819055505050505050565b6000612b908383613251565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806008600084815260200190815260200160002081905550505050565b612c636134d5565b6000600e54612c706112e2565b101515612c7c57600080fd5b60408051908101604052808581526020014281525091506001600d839080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050039050612ce683826133ab565b50505050565b600081830190508263ffffffff168163ffffffff1610151515612d0b57fe5b80905092915050565b600080612d368573ffffffffffffffffffffffffffffffffffffffff1661345b565b1515612d455760019150612ef9565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e07578082015181840152602081019050612dec565b50505050905090810190601f168015612e345780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015612e5557600080fd5b505af1158015612e69573d6000803e3d6000fd5b505050506040513d6020811015612e7f57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b60606000806060600080861415612f50576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450613050565b8593505b600084141515612f7a578280600101935050600a84811515612f7257fe5b049350612f54565b826040519080825280601f01601f191660200182016040528015612fad5781602001602082028038833980820191505090505b5091506001830390505b60008614151561304c57600a86811515612fcd57fe5b066030017f01000000000000000000000000000000000000000000000000000000000000000282828060019003935081518110151561300857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681151561304457fe5b049550612fb7565b8194505b50505050919050565b61306161359b565b600060208301905060408051908101604052808451815260200182815250915050919050565b606080600083600001518560000151016040519080825280601f01601f1916602001820160405280156130c95781602001602082028038833980820191505090505b5091506020820190506130e5818660200151876000015161346e565b6130fe856000015182018560200151866000015161346e565b819250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661312982611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614151561314b57600080fd5b61319e6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323890919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082821115151561324657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156132bf57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133646001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134b990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156133e757600080fd5b6133f18282612b84565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b60005b6020821015156134965782518452602084019350602083019250602082039150613471565b6001826020036101000a0390508019835116818551168181178652505050505050565b600081830190508281101515156134cc57fe5b80905092915050565b604080519081016040528060008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061353057803560ff191683800117855561355e565b8280016001018555821561355e579182015b8281111561355d578235825591602001919060010190613542565b5b50905061356b91906135b5565b5090565b8154818355818111156135965781836000526020600020918201910161359591906135b5565b5b505050565b604080519081016040528060008152602001600081525090565b6135d791905b808211156135d35760008160009055506001016135bb565b5090565b905600a165627a7a72305820a28084ebaee280c0e7527d0689ba985b58b04c65037904fce8552b3ce122ae15002900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f6e4d6f6e6b657973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000343544e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101f357806302a86781146102575780630519ce79146102ae57806306fdde0314610305578063081812fc14610395578063095ea7b3146104025780630a0f81681461044f57806318160ddd146104a65780631d907075146104d157806323b872dd1461054c57806327d7874c146105b95780632ba73c15146105fc5780632f745c591461063f57806335bb5fd2146106a05780633d7d3f5a146106cf5780633f4ba83a1461071a57806342842e0e146107315780634e0a33791461079e5780634f558e79146107e15780634f6ccce7146108265780635c975abb146108675780635e280f11146108965780636352211e146109265780636fbde40d1461099357806370a08231146109d65780637d01a51714610a2d5780638456cb5914610a685780638da5cb5b14610a7f57806395d89b4114610ad6578063a22cb46514610b66578063a27771a614610bb5578063ab90f85514610c02578063b047fb5014610c39578063b88d4fde14610c90578063c87b56dd14610d43578063d5abeb0114610de9578063e6cbe35114610e14578063e985e9c514610e6b578063f2fde38b14610ee6578063f42541be14610f29575b600080fd5b3480156101ff57600080fd5b5061023d60048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f60565b604051808215151515815260200191505060405180910390f35b34801561026357600080fd5b5061026c610fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102ba57600080fd5b506102c3610ff1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031157600080fd5b5061031a611017565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035a57808201518184015260208101905061033f565b50505050905090810190601f1680156103875780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a157600080fd5b506103c0600480360381019080803590602001909291905050506110b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040e57600080fd5b5061044d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110f6565b005b34801561045b57600080fd5b506104646112bc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b257600080fd5b506104bb6112e2565b6040518082815260200191505060405180910390f35b3480156104dd57600080fd5b506104fc600480360381019080803590602001909291905050506112ef565b604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b34801561055857600080fd5b506105b7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611328565b005b3480156105c557600080fd5b506105fa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061143f565b005b34801561060857600080fd5b5061063d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061151b565b005b34801561064b57600080fd5b5061068a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115f7565b6040518082815260200191505060405180910390f35b3480156106ac57600080fd5b506106b561166e565b604051808215151515815260200191505060405180910390f35b3480156106db57600080fd5b5061071860048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611677565b005b34801561072657600080fd5b5061072f611830565b005b34801561073d57600080fd5b5061079c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c4565b005b3480156107aa57600080fd5b506107df600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118fc565b005b3480156107ed57600080fd5b5061080c600480360381019080803590602001909291905050506119d8565b604051808215151515815260200191505060405180910390f35b34801561083257600080fd5b5061085160048036038101908080359060200190929190505050611a4a565b6040518082815260200191505060405180910390f35b34801561087357600080fd5b5061087c611a69565b604051808215151515815260200191505060405180910390f35b3480156108a257600080fd5b506108ab611a7c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108eb5780820151818401526020810190506108d0565b50505050905090810190601f1680156109185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561093257600080fd5b5061095160048036038101908080359060200190929190505050611b1a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099f57600080fd5b506109d4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b98565b005b3480156109e257600080fd5b50610a17600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ce8565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a66600480360381019080803590602001908201803590602001919091929391929390505050611d6c565b005b348015610a7457600080fd5b50610a7d611dde565b005b348015610a8b57600080fd5b50610a94611f23565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ae257600080fd5b50610aeb611f49565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b2b578082015181840152602081019050610b10565b50505050905090810190601f168015610b585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b7257600080fd5b50610bb3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611feb565b005b348015610bc157600080fd5b50610c0060048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b348015610c0e57600080fd5b50610c17612266565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610c4557600080fd5b50610c4e61227c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c9c57600080fd5b50610d41600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506122a2565b005b348015610d4f57600080fd5b50610d6e600480360381019080803590602001909291905050506122e1565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dae578082015181840152602081019050610d93565b50505050905090810190601f168015610ddb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610df557600080fd5b50610dfe6124db565b6040518082815260200191505060405180910390f35b348015610e2057600080fd5b50610e296124e5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e7757600080fd5b50610ecc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061250b565b604051808215151515815260200191505060405180910390f35b348015610ef257600080fd5b50610f27600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061259f565b005b348015610f3557600080fd5b50610f3e6126f7565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000600f60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b5050505050905090565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061110182611b1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561113e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061117e575061117d813361250b565b5b151561118957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166111aa836110b9565b73ffffffffffffffffffffffffffffffffffffffff161415806111fa5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156112b757826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d80549050905090565b60008060006112fc6134d5565b6113058561270d565b90508060000151816020015161131a87611b1a565b935093509350509193909250565b80611333338261276e565b151561133e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561137a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156113b657600080fd5b6113c08483612803565b6113ca848361296c565b6113d48383612b84565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d757600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561157757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156115b357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061160283611ce8565b8210151561160f57600080fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561165b57fe5b9060005260206000200154905092915050565b60006001905090565b600c60149054906101000a900460ff1615151561169357600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116b385611b1a565b73ffffffffffffffffffffffffffffffffffffffff161415156116d557600080fd5b611701601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856110f6565b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6effbe93086868686336040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019650505050505050600060405180830381600087803b15801561181257600080fd5b505af1158015611826573d6000803e3d6000fd5b5050505050505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188c57600080fd5b600c60149054906101000a900460ff1615156118a757600080fd5b6000600c60146101000a81548160ff021916908315150217905550565b806118cf338261276e565b15156118da57600080fd5b6118f684848460206040519081016040528060008152506122a2565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561199457600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000611a546112e2565b82101515611a6157600080fd5b819050919050565b600c60149054906101000a900460ff1681565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b125780601f10611ae757610100808354040283529160200191611b12565b820191906000526020600020905b815481529060010190602001808311611af557829003601f168201915b505050505081565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b8f57600080fd5b80915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bf657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d6020811015611c8757600080fd5b81019080805190602001909291905050501515611ca357600080fd5b80601160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d2557600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dc857600080fd5b818160109190611dd99291906134ef565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e875750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611edf5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611eea57600080fd5b600c60149054906101000a900460ff16151515611f0657600080fd5b6001600c60146101000a81548160ff021916908315150217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fe15780601f10611fb657610100808354040283529160200191611fe1565b820191906000526020600020905b815481529060010190602001808311611fc457829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561202657600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561218557600080fd5b600f60009054906101000a900463ffffffff1663ffffffff16601160009054906101000a900463ffffffff1663ffffffff161015156121c357600080fd5b81905060008173ffffffffffffffffffffffffffffffffffffffff16141561220b57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6122158382612c5b565b6122416001601160009054906101000a900463ffffffff1663ffffffff16612cec90919063ffffffff16565b601160006101000a81548163ffffffff021916908363ffffffff160217905550505050565b600f60009054906101000a900463ffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b816122ad338261276e565b15156122b857600080fd5b6122c3858585611328565b6122cf85858585612d14565b15156122da57600080fd5b5050505050565b6060806122ed836119d8565b15156122f857600080fd5b6040805190810160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525090506124d361234461233f85612f02565b613059565b6124c56124c061235385613059565b6124b26124ad6123fc60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123f25780601f106123c7576101008083540402835291602001916123f2565b820191906000526020600020905b8154815290600101906020018083116123d557829003601f168201915b5050505050613059565b61249f60108054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124955780601f1061246a57610100808354040283529160200191612495565b820191906000526020600020905b81548152906001019060200180831161247857829003601f168201915b5050505050613059565b61308790919063ffffffff16565b613059565b61308790919063ffffffff16565b613059565b61308790919063ffffffff16565b915050919050565b6000600e54905090565b601160049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125fb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561263757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601160009054906101000a900463ffffffff1681565b6127156134d5565b61271d6112e2565b821115151561272b57600080fd5b600d8281548110151561273a57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250509050919050565b60008061277a83611b1a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127e957508373ffffffffffffffffffffffffffffffffffffffff166127d1846110b9565b73ffffffffffffffffffffffffffffffffffffffff16145b806127fa57506127f9818561250b565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661282382611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614151561284557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129685760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061297b8585613109565b600860008581526020019081526020016000205492506129e76001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061323890919063ffffffff16565b9150600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612a3557fe5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612a8f57fe5b90600052602060002001819055506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612aeb57fe5b9060005260206000200181905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612b4b919061356f565b50600060086000868152602001908152602001600020819055508260086000838152602001908152602001600020819055505050505050565b6000612b908383613251565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806008600084815260200190815260200160002081905550505050565b612c636134d5565b6000600e54612c706112e2565b101515612c7c57600080fd5b60408051908101604052808581526020014281525091506001600d839080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050039050612ce683826133ab565b50505050565b600081830190508263ffffffff168163ffffffff1610151515612d0b57fe5b80905092915050565b600080612d368573ffffffffffffffffffffffffffffffffffffffff1661345b565b1515612d455760019150612ef9565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e07578082015181840152602081019050612dec565b50505050905090810190601f168015612e345780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015612e5557600080fd5b505af1158015612e69573d6000803e3d6000fd5b505050506040513d6020811015612e7f57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b60606000806060600080861415612f50576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450613050565b8593505b600084141515612f7a578280600101935050600a84811515612f7257fe5b049350612f54565b826040519080825280601f01601f191660200182016040528015612fad5781602001602082028038833980820191505090505b5091506001830390505b60008614151561304c57600a86811515612fcd57fe5b066030017f01000000000000000000000000000000000000000000000000000000000000000282828060019003935081518110151561300857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681151561304457fe5b049550612fb7565b8194505b50505050919050565b61306161359b565b600060208301905060408051908101604052808451815260200182815250915050919050565b606080600083600001518560000151016040519080825280601f01601f1916602001820160405280156130c95781602001602082028038833980820191505090505b5091506020820190506130e5818660200151876000015161346e565b6130fe856000015182018560200151866000015161346e565b819250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661312982611b1a565b73ffffffffffffffffffffffffffffffffffffffff1614151561314b57600080fd5b61319e6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461323890919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082821115151561324657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156132bf57600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133646001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134b990919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156133e757600080fd5b6133f18282612b84565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b60005b6020821015156134965782518452602084019350602083019250602082039150613471565b6001826020036101000a0390508019835116818551168181178652505050505050565b600081830190508281101515156134cc57fe5b80905092915050565b604080519081016040528060008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061353057803560ff191683800117855561355e565b8280016001018555821561355e579182015b8281111561355d578235825591602001919060010190613542565b5b50905061356b91906135b5565b5090565b8154818355818111156135965781836000526020600020918201910161359591906135b5565b5b505050565b604080519081016040528060008152602001600081525090565b6135d791905b808211156135d35760008160009055506001016135bb565b5090565b905600a165627a7a72305820a28084ebaee280c0e7527d0689ba985b58b04c65037904fce8552b3ce122ae150029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f6e4d6f6e6b657973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000343544e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MoonMonkeys
Arg [1] : _symbol (string): CTN
Arg [2] : _maxSupply (uint256): 256
Arg [3] : _maxPromoToons (uint32): 256
Arg [4] : _author (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 4d6f6f6e4d6f6e6b657973000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 43544e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55938:491:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29129:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29129:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51980:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51980:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25510:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25510:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;45097:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45097:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;45097:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36720:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36720:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36076:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36076:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25478:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25478:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;51382:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51382:91:0;;;;;;;;;;;;;;;;;;;;;;;56179:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56179:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38306:351;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38306:351:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26621:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26621:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27183:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46027:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46027:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52196:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52196:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55152:777;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55152:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28220:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28220:129:0;;;;;;39310:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39310:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26902:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26902:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35475:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35475:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46779:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46779:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25677:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25677:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;50750:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50750:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;50750:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35096:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35096:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54861:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54861:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34709:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34709:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52084:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52084:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27842:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27842:83:0;;;;;;3103:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3103:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;45287:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45287:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;45287:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37146:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37146:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54221:349;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54221:349:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50679:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50679:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25542:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25542:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40298:348;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40298:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51685:287;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51685:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;51685:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51139:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51139:85:0;;;;;;;;;;;;;;;;;;;;;;;54624:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54624:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37700:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37700:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3764:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3764:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53984:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53984:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29129:134;29199:4;29223:19;:32;29243:11;29223:32;;;;;;;;;;;;;;;;;;;;;;;;;;;29216:39;;29129:134;;;:::o;51980:96::-;52028:7;52055:13;;;;;;;;;;;52048:20;;51980:96;:::o;25510:25::-;;;;;;;;;;;;;:::o;45097:76::-;45134:6;45160:5;45153:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45097:76;:::o;36720:119::-;36780:7;36807:14;:24;36822:8;36807:24;;;;;;;;;;;;;;;;;;;;;36800:31;;36720:119;;;:::o;36076:398::-;36142:13;36158:17;36166:8;36158:7;:17::i;:::-;36142:33;;36201:5;36194:12;;:3;:12;;;;36186:21;;;;;;;;36240:5;36226:19;;:10;:19;;;:58;;;;36249:35;36266:5;36273:10;36249:16;:35::i;:::-;36226:58;36218:67;;;;;;;;36335:1;36302:35;;:21;36314:8;36302:11;:21::i;:::-;:35;;;;:56;;;;36356:1;36341:17;;:3;:17;;;;36302:56;36298:169;;;36402:3;36375:14;:24;36390:8;36375:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;36441:3;36425:30;;36434:5;36425:30;;;36446:8;36425:30;;;;;;;;;;;;;;;;;;36298:169;36076:398;;;:::o;25478:25::-;;;;;;;;;;;;;:::o;51382:91::-;51426:7;51453:5;:12;;;;51446:19;;51382:91;:::o;56179:245::-;56243:10;56264:14;56289:13;56321:17;;:::i;:::-;56341:13;56350:3;56341:8;:13::i;:::-;56321:33;;56373:5;:11;;;56386:5;:15;;;56403:12;56411:3;56403:7;:12::i;:::-;56365:51;;;;;;56179:245;;;;;;:::o;38306:351::-;38393:8;34438:39;34456:10;34468:8;34438:17;:39::i;:::-;34430:48;;;;;;;;38439:1;38422:19;;:5;:19;;;;38414:28;;;;;;;;38476:1;38461:17;;:3;:17;;;;38453:26;;;;;;;;38492:30;38506:5;38513:8;38492:13;:30::i;:::-;38533:32;38549:5;38556:8;38533:15;:32::i;:::-;38576:25;38587:3;38592:8;38576:10;:25::i;:::-;38635:3;38619:30;;38628:5;38619:30;;;38640:8;38619:30;;;;;;;;;;;;;;;;;;38306:351;;;;:::o;26621:132::-;25821:10;;;;;;;;;;;25807:24;;:10;:24;;;25799:33;;;;;;;;26709:1;26690:21;;:7;:21;;;;26682:30;;;;;;;;26738:7;26725:10;;:20;;;;;;;;;;;;;;;;;;26621:132;:::o;27183:::-;25821:10;;;;;;;;;;;25807:24;;:10;:24;;;25799:33;;;;;;;;27271:1;27252:21;;:7;:21;;;;27244:30;;;;;;;;27300:7;27287:10;;:20;;;;;;;;;;;;;;;;;;27183:132;:::o;46027:190::-;46109:7;46146:17;46156:6;46146:9;:17::i;:::-;46137:6;:26;46129:35;;;;;;;;46182:11;:19;46194:6;46182:19;;;;;;;;;;;;;;;46202:6;46182:27;;;;;;;;;;;;;;;;;;46175:34;;46027:190;;;;:::o;52196:86::-;52246:4;52270;52263:11;;52196:86;:::o;55152:777::-;27511:6;;;;;;;;;;;27510:7;27502:16;;;;;;;;55554:10;55534:30;;:16;55542:7;55534;:16::i;:::-;:30;;;55526:39;;;;;;;;55576:29;55584:11;;;;;;;;;;;55597:7;55576;:29::i;:::-;55739:11;;;;;;;;;;;:25;;;55779:4;55798:7;55820:14;55849:12;55876:9;55900:10;55739:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55739:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55739:182:0;;;;55152:777;;;;:::o;28220:129::-;25821:10;;;;;;;;;;;25807:24;;:10;:24;;;25799:33;;;;;;;;27658:6;;;;;;;;;;;27650:15;;;;;;;;28336:5;28327:6;;:14;;;;;;;;;;;;;;;;;;28220:129::o;39310:261::-;39445:8;34438:39;34456:10;34468:8;34438:17;:39::i;:::-;34430:48;;;;;;;;39521:42;39538:5;39545:3;39550:8;39521:42;;;;;;;;;;;;;:16;:42::i;:::-;39310:261;;;;:::o;26902:132::-;25821:10;;;;;;;;;;;25807:24;;:10;:24;;;25799:33;;;;;;;;26990:1;26971:21;;:7;:21;;;;26963:30;;;;;;;;27019:7;27006:10;;:20;;;;;;;;;;;;;;;;;;26902:132;:::o;35475:153::-;35530:4;35547:13;35563:10;:20;35574:8;35563:20;;;;;;;;;;;;;;;;;;;;;35547:36;;35618:1;35601:19;;:5;:19;;;;35594:26;;35475:153;;;;:::o;46779:198::-;46838:7;46875:13;:11;:13::i;:::-;46866:6;:22;46858:31;;;;;;;;46963:6;46956:13;;46779:198;;;:::o;25677:26::-;;;;;;;;;;;;;:::o;50750:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35096:182::-;35152:7;35172:13;35188:10;:20;35199:8;35188:20;;;;;;;;;;;;;;;;;;;;;35172:36;;35244:1;35227:19;;:5;:19;;;;35219:28;;;;;;;;35265:5;35258:12;;35096:182;;;;:::o;54861:283::-;54938:30;25821:10;;;;;;;;;;;25807:24;;:10;:24;;;25799:33;;;;;;;;54984:8;54938:55;;55012:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55012:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55012:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55012:38:0;;;;;;;;;;;;;;;;55004:47;;;;;;;;55119:17;55105:11;;:31;;;;;;;;;;;;;;;;;;54861:283;;:::o;34709:155::-;34765:7;34811:1;34793:20;;:6;:20;;;;34785:29;;;;;;;;34832:16;:24;34849:6;34832:24;;;;;;;;;;;;;;;;34825:31;;34709:155;;;:::o;52084:104::-;3559:5;;;;;;;;;;;3545:19;;:10;:19;;;3537:28;;;;;;;;52169:11;;52158:8;:22;;;;;;;:::i;:::-;;52084:104;;:::o;27842:83::-;26225:10;;;;;;;;;;;26211:24;;:10;:24;;;:65;;;;26266:10;;;;;;;;;;;26252:24;;:10;:24;;;26211:65;:106;;;;26307:10;;;;;;;;;;;26293:24;;:10;:24;;;26211:106;26189:139;;;;;;;;27511:6;;;;;;;;;;;27510:7;27502:16;;;;;;;;27913:4;27904:6;;:13;;;;;;;;;;;;;;;;;;27842:83::o;3103:20::-;;;;;;;;;;;;;:::o;45287:80::-;45326:6;45352:7;45345:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45287:80;:::o;37146:223::-;37235:10;37228:17;;:3;:17;;;;37220:26;;;;;;;;37294:9;37257:17;:29;37275:10;37257:29;;;;;;;;;;;;;;;:34;37287:3;37257:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37346:3;37319:42;;37334:10;37319:42;;;37351:9;37319:42;;;;;;;;;;;;;;;;;;;;;;37146:223;;:::o;54221:349::-;54355:18;26117:10;;;;;;;;;;;26103:24;;:10;:24;;;26095:33;;;;;;;;54330:13;;;;;;;;;;;54311:32;;:16;;;;;;;;;;;:32;;;54303:41;;;;;;;;54376:6;54355:27;;54411:3;54397:10;:17;;;54393:73;;;54444:10;;;;;;;;;;;54431:23;;54393:73;54478:31;54490:6;54498:10;54478:11;:31::i;:::-;54539:23;54560:1;54539:16;;;;;;;;;;;:20;;;;:23;;;;:::i;:::-;54520:16;;:42;;;;;;;;;;;;;;;;;;54221:349;;;:::o;50679:27::-;;;;;;;;;;;;;:::o;25542:25::-;;;;;;;;;;;;;:::o;40298:348::-;40455:8;34438:39;34456:10;34468:8;34438:17;:39::i;:::-;34430:48;;;;;;;;40481:34;40494:5;40501:3;40506:8;40481:12;:34::i;:::-;40584:53;40609:5;40616:3;40621:8;40631:5;40584:24;:53::i;:::-;40576:62;;;;;;;;40298:348;;;;;:::o;51685:287::-;51742:6;51797:19;51769:16;51776:8;51769:6;:16::i;:::-;51761:25;;;;;;;;51797;;;;;;;;;;;;;;;;;;;;51840:124;51934:29;:19;:8;:17;:19::i;:::-;:27;:29::i;:::-;51840:86;:76;51900:15;:5;:13;:15::i;:::-;51840:52;:42;51866:15;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15::i;:::-;51840:18;:8;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18::i;:::-;:25;;:42;;;;:::i;:::-;:50;:52::i;:::-;:59;;:76;;;;:::i;:::-;:84;:86::i;:::-;:93;;:124;;;;:::i;:::-;51833:131;;51685:287;;;;:::o;51139:85::-;51183:4;51207:9;;51200:16;;51139:85;:::o;54624:31::-;;;;;;;;;;;;;:::o;37700:150::-;37782:4;37806:17;:25;37824:6;37806:25;;;;;;;;;;;;;;;:36;37832:9;37806:36;;;;;;;;;;;;;;;;;;;;;;;;;37799:43;;37700:150;;;;:::o;3764:192::-;3559:5;;;;;;;;;;;3545:19;;:10;:19;;;3537:28;;;;;;;;3865:1;3845:22;;:8;:22;;;;3837:31;;;;;;;;3912:8;3884:37;;3905:5;;;;;;;;;;;3884:37;;;;;;;;;;;;3940:8;3932:5;;:16;;;;;;;;;;;;;;;;;;3764:192;:::o;53984:34::-;;;;;;;;;;;;;:::o;52290:132::-;52341:4;;:::i;:::-;52372:13;:11;:13::i;:::-;52365:3;:20;;52357:29;;;;;;;;52404:5;52410:3;52404:10;;;;;;;;;;;;;;;;;;;;52397:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;52290:132;;;:::o;41018:253::-;41104:4;41121:13;41137:17;41145:8;41137:7;:17::i;:::-;41121:33;;41184:5;41172:17;;:8;:17;;;:54;;;;41218:8;41193:33;;:21;41205:8;41193:11;:21::i;:::-;:33;;;41172:54;:91;;;;41230:33;41247:5;41254:8;41230:16;:33::i;:::-;41172:91;41165:98;;41018:253;;;;;:::o;42023:297::-;42129:6;42108:27;;:17;42116:8;42108:7;:17::i;:::-;:27;;;42100:36;;;;;;;;42187:1;42151:38;;:14;:24;42166:8;42151:24;;;;;;;;;;;;;;;;;;;;;:38;;;;42147:166;;;42241:1;42206:14;:24;42221:8;42206:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42288:1;42263:38;;42272:6;42263:38;;;42292:8;42263:38;;;;;;;;;;;;;;;;;;42147:166;42023:297;;:::o;47806:922::-;47935:18;47993:22;48061:17;47884:38;47906:5;47913:8;47884:21;:38::i;:::-;47956:16;:26;47973:8;47956:26;;;;;;;;;;;;47935:47;;48018:32;48048:1;48018:11;:18;48030:5;48018:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;47993:57;;48081:11;:18;48093:5;48081:18;;;;;;;;;;;;;;;48100:14;48081:34;;;;;;;;;;;;;;;;;;48061:54;;48161:9;48128:11;:18;48140:5;48128:18;;;;;;;;;;;;;;;48147:10;48128:30;;;;;;;;;;;;;;;;;:42;;;;48218:1;48181:11;:18;48193:5;48181:18;;;;;;;;;;;;;;;48200:14;48181:34;;;;;;;;;;;;;;;;;:38;;;;48601:11;:18;48613:5;48601:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;48668:1;48639:16;:26;48656:8;48639:26;;;;;;;;;;;:30;;;;48710:10;48680:16;:27;48697:9;48680:27;;;;;;;;;;;:40;;;;47806:922;;;;;:::o;47259:249::-;47372:14;47330:31;47347:3;47352:8;47330:16;:31::i;:::-;47389:11;:16;47401:3;47389:16;;;;;;;;;;;;;;;:23;;;;47372:40;;47423:11;:16;47435:3;47423:16;;;;;;;;;;;;;;;47445:8;47423:31;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;47423:31:0;;;;;;;;;;;;;;;;;;;;;;47494:6;47465:16;:26;47482:8;47465:26;;;;;;;;;;;:35;;;;47259:249;;;:::o;52430:234::-;52547:17;;:::i;:::-;52595:7;52524:9;;52508:13;:11;:13::i;:::-;:25;52500:34;;;;;;;;52567:17;;;;;;;;;52572:6;52567:17;;;;52580:3;52567:17;;;52547:37;;52625:1;52605:5;52616;52605:17;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;52605:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;52595:31;;52639:17;52645:6;52653:2;52639:5;:17::i;:::-;52430:234;;;;:::o;53761:138::-;53817:8;53846:1;53842;:5;53838:9;;53870:1;53865:6;;:1;:6;;;;53858:14;;;;;;53890:1;53883:8;;53761:138;;;;:::o;43896:386::-;44060:4;44153:13;44087:16;:3;:14;;;:16::i;:::-;44086:17;44082:61;;;44127:4;44120:11;;;;44082:61;44184:3;44169:36;;;44206:5;44213:8;44223:5;44169:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;44169:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44169:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44169:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44169:60:0;;;;;;;;;;;;;;;;44153:76;;33363:10;44258:15;;44248:25;;;:6;:25;;;;44240:34;;43896:386;;;;;;;;:::o;30433:431::-;30482:6;30533;30554:11;30657:17;30705:6;30509:1;30504;:6;30500:22;;;30512:10;;;;;;;;;;;;;;;;;;;;;;30500:22;30542:1;30533:10;;30576:71;30588:1;30583;:6;;30576:71;;;30605:8;;;;;;;30633:2;30628:7;;;;;;;;;;;30576:71;;;30687:6;30677:17;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;30677:17:0;;;;30657:37;;30723:1;30714:6;:10;30705:19;;30735:92;30747:1;30742;:6;;30735:92;;;30790:2;30786:1;:6;;;;;;;;30781:2;:11;30776:17;;30764:4;30769:3;;;;;;;30764:9;;;;;;;;;;;;;;:29;;;;;;;;;;;30813:2;30808:7;;;;;;;;;;;30735:92;;;30851:4;30837:19;;30433:431;;;;;;;;:::o;49034:216::-;49094:5;;:::i;:::-;49119:8;49179:4;49173;49169:15;49162:22;;49212:30;;;;;;;;;49224:4;49218:18;49212:30;;;;49238:3;49212:30;;;49205:37;;49034:216;;;;:::o;49546:362::-;49624:6;49650:17;49715:11;49693:5;:10;;;49681:4;:9;;;:22;49670:34;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;49670:34:0;;;;49650:54;;49767:2;49762:3;49758:12;49748:22;;49782:36;49789:6;49797:4;:9;;;49808:4;:9;;;49782:6;:36::i;:::-;49829:50;49845:4;:9;;;49836:6;:18;49856:5;:10;;;49868:5;:10;;;49829:6;:50::i;:::-;49897:3;49890:10;;49546:362;;;;;;:::o;43122:232::-;43229:5;43208:26;;:17;43216:8;43208:7;:17::i;:::-;:26;;;43200:35;;;;;;;;43272:30;43300:1;43272:16;:23;43289:5;43272:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;43246:16;:23;43263:5;43246:23;;;;;;;;;;;;;;;:56;;;;43344:1;43313:10;:20;43324:8;43313:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;43122:232;;:::o;30086:123::-;30144:7;30176:1;30171;:6;;30164:14;;;;;;30200:1;30196;:5;30189:12;;30086:123;;;;:::o;42602:222::-;42713:1;42681:34;;:10;:20;42692:8;42681:20;;;;;;;;;;;;;;;;;;;;;:34;;;42673:43;;;;;;;;42750:3;42727:10;:20;42738:8;42727:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;42788:28;42814:1;42788:16;:21;42805:3;42788:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;42764:16;:21;42781:3;42764:21;;;;;;;;;;;;;;;:52;;;;42602:222;;:::o;41547:187::-;41636:1;41621:17;;:3;:17;;;;41613:26;;;;;;;;41650:25;41661:3;41666:8;41650:10;:25::i;:::-;41712:3;41691:35;;41708:1;41691:35;;;41717:8;41691:35;;;;;;;;;;;;;;;;;;41547:187;;:::o;31249:616::-;31306:4;31323:12;31773:4;31761:17;31753:25;;31856:1;31849:4;:8;31842:15;;31249:616;;;;:::o;49916:565::-;50253:9;50038:170;50051:2;50044:3;:9;;50038:170;;;50128:3;50122:10;50116:4;50109:24;50170:2;50162:10;;;;50194:2;50187:9;;;;50062:2;50055:9;;;;50038:170;;;50285:1;50278:3;50273:2;:8;50265:3;:17;:21;50253:33;;50356:4;50352:9;50346:3;50340:10;50336:26;50409:4;50402;50396:11;50392:22;50454:7;50444:8;50441:21;50435:4;50428:35;50306:168;;;;;;:::o;30284:141::-;30342:9;30372:1;30368;:5;30364:9;;30396:1;30391;:6;;30384:14;;;;;;30416:1;30409:8;;30284:141;;;;:::o;55938:491::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://a28084ebaee280c0e7527d0689ba985b58b04c65037904fce8552b3ce122ae15
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.