contract Ownable {

  address private _owner;

  /**
  * @dev Event to show ownership has been transferred
  * @param previousOwner representing the address of the previous owner
  * @param newOwner representing the address of the new owner
  */
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
  * @dev The constructor sets the original owner of the contract to the sender account.
  */
  constructor() internal {
    setOwner(msg.sender);
    emit OwnershipTransferred(address(0), _owner);
  }

  /**
   * @dev Sets a new owner address
   */
  function setOwner(address newOwner) internal {
    _owner = newOwner;
  }

  /**
   * @dev Tells the address of the owner
   * @return the address of the owner
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
  * @dev Throws if called by any account other than the owner.
  */
  modifier onlyOwner() {
    require(msg.sender == owner(), "onlyOwner: not 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), "transferOwnership: 0x0 invalid");
    require(newOwner != owner(), "transferOwnership: same address");
    emit OwnershipTransferred(owner(), newOwner);
    setOwner(newOwner);
  }
}
function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0), "transferOwnership: 0x0 invalid");
    require(newOwner != owner(), "transferOwnership: same address");
    emit OwnershipTransferred(owner(), newOwner);
    setOwner(newOwner);
  }
/**
 * @dev Allows the current owner to transfer control of the contract to a newOwner.
 * @param newOwner The address to transfer ownership to.
 */