function transferFrom(
        address _from,
        address _to,
        uint256 _value)
        public
        returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        bytes memory empty;
        uint256 codeLength;

        assembly {
            
            codeLength := extcodesize(_to)
        }

        balances[_from] = balances[_from].sub(_value);

        if(codeLength > 0) {
            ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
            receiver.tokenFallback(msg.sender, _value, empty);
        }

        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }