function doSendWithSignature(address _to, uint256 _amount, uint256 _fee, bytes _data, uint256 _nonce, bytes _sig, bool _preventLocking) private {
        require(_to != address(0));
        require(_to != address(this)); 

        require(signatures[_sig] == false);
        signatures[_sig] = true;

        bytes memory packed;
        if (_preventLocking) {
            packed = abi.encodePacked(address(this), _to, _amount, _fee, _data, _nonce);
        } else {
            packed = abi.encodePacked(address(this), _to, _amount, _fee, _data, _nonce, "ERC20Compat");
        }

        address signer = keccak256(packed)
            .toEthSignedMessageHash()
            .recover(_sig); 
        
        require(signer != address(0));
        require(transfersEnabled || signer == tokenBag || _to == tokenBag);

        uint256 total = _amount.add(_fee);
        require(mBalances[signer] >= total);

        doSend(msg.sender, signer, _to, _amount, _data, "", _preventLocking);
        if (_fee > 0) {
            doSend(msg.sender, signer, msg.sender, _fee, "", "", _preventLocking);
        }
    }