function contractorReleaseFunds(
    bytes16 _jobId,
    address _hirer,
    address _contractor,
    uint256 _value,
    uint256 _fee
  ) external onlyContractor(_contractor)
  {

    bytes32 jobHash = getJobHash(
      _jobId,
      _hirer,
      _contractor,
      _value,
      _fee);

    
    require(jobEscrows[jobHash].exists);

    
    require(jobEscrows[jobHash].status == STATUS_JOB_COMPLETED);
    
    require(block.timestamp > jobEscrows[jobHash].jobCompleteDate + 4 weeks);

    
    uint256 jobValue = hirerEscrowMap[_hirer][jobHash];

    
    require(jobValue > 0 && jobValue == _value);

    
    require(jobValue >= jobValue.sub(_fee));

    
    require(totalInEscrow >= jobValue && totalInEscrow > 0);

    emit ContractorReleased(
      jobHash,
      _hirer,
      _contractor,
      jobValue); 
    emit AddFeesToCoinSparrowPool(jobHash, _fee);

    delete jobEscrows[jobHash]; 
    delete  hirerEscrowMap[_hirer][jobHash]; 

    
    feesAvailableForWithdraw = feesAvailableForWithdraw.add(_fee);

    
    totalInEscrow = totalInEscrow.sub(jobValue);

    
    _contractor.transfer(jobValue.sub(_fee));

  }