anchor.diff:            );
   
         serviceConfig = {
  -        User = cfg.user;
  -        Group = cfg.group;
           Type = "oneshot";
           RemainAfterExit = true;
           PermissionsStartOnly = true;
         };
       };
   
  -    systemd.services.ipfs = {
  +    # TODO These 3 definitions possibly be further abstracted through use of a function
  +    # like: mutexServices "ipfs" [ "", "offline", "norouting" ] { ... shared conf here ... }
  +
  +    systemd.services.ipfs = recursiveUpdate baseService {
         description = "IPFS Daemon";
  -
         wantedBy = mkIf (cfg.defaultMode == "online") [ "multi-user.target" ];
  -
         after = [ "network.target" "local-fs.target" "ipfs-init.service" ];
  -
         conflicts = [ "ipfs-offline.service" "ipfs-norouting.service"];
  -      wants = [ "ipfs-init.service" ];
  -
  -      environment.IPFS_PATH = cfg.dataDir;
  -
  -      path  = [ pkgs.ipfs ];
  -
  -      serviceConfig = {
  -        ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags}";
  -        User = cfg.user;
  -        Group = cfg.group;
  -        Restart = "on-failure";
  -        RestartSec = 1;
  -      } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; };
  -    };
  -
  -    systemd.services.ipfs-offline = {
  +    };
  +
  +    systemd.services.ipfs-offline = recursiveUpdate baseService {
         description = "IPFS Daemon (offline mode)";
  -
         wantedBy = mkIf (cfg.defaultMode == "offline") [ "multi-user.target" ];
  -
         after = [ "local-fs.target" "ipfs-init.service" ];
  -
         conflicts = [ "ipfs.service" "ipfs-norouting.service"];
  -      wants = [ "ipfs-init.service" ];
  -
  -      environment.IPFS_PATH = cfg.dataDir;
  -
  -      path  = [ pkgs.ipfs ];
  -
  -      serviceConfig = {
  -        ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags} --offline";
  -        User = cfg.user;
  -        Group = cfg.group;
  -        Restart = "on-failure";
  -        RestartSec = 1;
  -      } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; };
  -    };
  -
  -    systemd.services.ipfs-norouting = {
  +    };
  +
  +    systemd.services.ipfs-norouting = recursiveUpdate baseService {
         description = "IPFS Daemon (no routing mode)";
  -
         wantedBy = mkIf (cfg.defaultMode == "norouting") [ "multi-user.target" ];
  -
         after = [ "local-fs.target" "ipfs-init.service" ];
  -
         conflicts = [ "ipfs.service" "ipfs-offline.service"];
  -      wants = [ "ipfs-init.service" ];
  -
  -      environment.IPFS_PATH = cfg.dataDir;
  -
  -      path  = [ pkgs.ipfs ];
  -
  -      serviceConfig = {
  -        ExecStart = "${ipfs}/bin/ipfs daemon ${ipfsFlags} --routing=none";
  -        User = cfg.user;
  -        Group = cfg.group;
  -        Restart = "on-failure";
  -        RestartSec = 1;
  -      } // optionalAttrs (cfg.serviceFdlimit != null) { LimitNOFILE = cfg.serviceFdlimit; };
       };
   
     };
  
positive.code:     };
  
      users.extraGroups = mkIf (cfg.group == "ipfs") {
        ipfs = {
          gid = config.ids.gids.ipfs;
        };
      };
  
      systemd.services.ipfs-init = {
        description = "IPFS Initializer";
  
        after = [ "local-fs.target" ];
        before = [ "ipfs.service" "ipfs-offline.service" ];
  
        environment.IPFS_PATH = cfg.dataDir;
  
        path  = [ pkgs.ipfs pkgs.su pkgs.bash ];
  
        preStart = ''
          install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir}
        '';
        script = ''
          if [[ ! -f ${cfg.dataDir}/config ]]; then
            ${ipfs}/bin/ipfs init ${optionalString cfg.emptyRepo "-e"}
          fi
          ${ipfs}/bin/ipfs --local config Addresses.API ${cfg.apiAddress}
          ${ipfs}/bin/ipfs --local config Addresses.Gateway ${cfg.gatewayAddress}
        '' + optionalString cfg.autoMount ''
          ${ipfs}/bin/ipfs --local config Mounts.FuseAllowOther --json true
          mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPFS)
          mkdir -p $(${ipfs}/bin/ipfs --local config Mounts.IPNS)
        '' + concatStringsSep "\n" (collect
              isString
              (mapAttrsRecursive
  
negative.code: { config, lib, pkgs, ... }:
  with lib;
  let
    inherit (pkgs) ipfs runCommand makeWrapper;
  
    cfg = config.services.ipfs;
  
    ipfsFlags = toString ([
      (optionalString  cfg.autoMount                   "--mount")
      (optionalString  cfg.autoMigrate                 "--migrate")
      (optionalString  cfg.enableGC                    "--enable-gc")
      (optionalString (cfg.serviceFdlimit != null)     "--manage-fdlimit=false")
      (optionalString (cfg.defaultMode == "offline")   "--offline")
      (optionalString (cfg.defaultMode == "norouting") "--routing=none")
    ] ++ cfg.extraFlags);
  
    defaultDataDir = if versionAtLeast config.system.stateVersion "17.09" then
      "/var/lib/ipfs" else
      "/var/lib/ipfs/.ipfs";
  