contract ERC20WithData is StandardToken {
    /**
     @dev Addition to ERC20 token methods. It allows to
     approve the transfer of value and execute a call with the sent data.

     @param _spender The address that will spend the funds.
     @param _value The amount of tokens to be spent.
     @param _data ABI-encoded contract call to call `_to` address.

     @return true if the call function was executed successfully
   */
    function approveAndCall(address _spender, uint256 _value, bytes _data) public returns (bool) {
        require(_spender != address(this));

        super.approve(_spender, _value);

        require(_spender.call(_data));

        return true;
    }

    /**
       @dev Addition to ERC20 token methods. Transfer tokens to a specified
       address and execute a call with the sent data on the same transaction

       @param _to address The address which you want to transfer to
       @param _value uint256 the amout of tokens to be transfered
       @param _data ABI-encoded contract call to call `_to` address.

       @return true if the call function was executed successfully
     */
    function transferAndCall(address _to, uint256 _value, bytes _data) public returns (bool) {
        require(_to != address(this));

        super.transfer(_to, _value);

        require(_to.call(_data));
        return true;
    }

    /**
       @dev Addition to ERC20 token methods. Transfer tokens from one address to
       another and make a contract call on the same transaction

       @param _from The address which you want to send tokens from
       @param _to The address which you want to transfer to
       @param _value The amout of tokens to be transferred
       @param _data ABI-encoded contract call to call `_to` address.

       @return true if the call function was executed successfully
     */
    function transferFromAndCall(
        address _from,
        address _to,
        uint256 _value,
        bytes _data
    ) public returns (bool)
    {
        require(_to != address(this));

        super.transferFrom(_from, _to, _value);

        require(_to.call(_data));
        return true;
    }

    /**
     * @dev Addition to StandardToken methods. Increase the amount of tokens that
     * an owner allowed to a spender and execute a call with the sent data.
     *
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     * @param _data ABI-encoded contract call to call `_spender` address.
     */
    function increaseApprovalAndCall(address _spender, uint _addedValue, bytes _data) public returns (bool) {
        require(_spender != address(this));

        super.increaseApproval(_spender, _addedValue);

        require(_spender.call(_data));

        return true;
    }

    /**
     * @dev Addition to StandardToken methods. Decrease the amount of tokens that
     * an owner allowed to a spender and execute a call with the sent data.
     *
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     * @param _data ABI-encoded contract call to call `_spender` address.
     */
    function decreaseApprovalAndCall(address _spender, uint _subtractedValue, bytes _data) public returns (bool) {
        require(_spender != address(this));

        super.decreaseApproval(_spender, _subtractedValue);

        require(_spender.call(_data));

        return true;
    }
}
function transferAndCall(address _to, uint256 _value, bytes _data) public returns (bool) {
    require(_to != address(this));

    super.transfer(_to, _value);

    require(_to.call(_data));
    return true;
}

/**
 @dev Addition to ERC20 token methods. Transfer tokens to a specified
 address and execute a call with the sent data on the same transaction
 
 @param _to address The address which you want to transfer to
 @param _value uint256 the amout of tokens to be transfered
 @param _data ABI-encoded contract call to call `_to` address.
 
 @return true if the call function was executed successfully
 */