nix: update input julm-nix
[sourcephile-nix.git] / nixpkgs / patches / sourcehut.diff
index 1fb3421430c349220ea4fec38048084be033cf9e..4e38456d715fbef9f94a619ab1f5c62a417707cf 100644 (file)
-diff --git a/nixos/lib/make-options-doc/options-to-docbook.xsl b/nixos/lib/make-options-doc/options-to-docbook.xsl
-index da4cd164bf2..30190788f33 100644
---- a/nixos/lib/make-options-doc/options-to-docbook.xsl
-+++ b/nixos/lib/make-options-doc/options-to-docbook.xsl
-@@ -20,7 +20,7 @@
-       <title>Configuration Options</title>
-       <variablelist xml:id="configuration-variable-list">
-         <xsl:for-each select="attrs">
--          <xsl:variable name="id" select="concat('opt-', str:replace(str:replace(str:replace(attr[@name = 'name']/string/@value, '*', '_'), '&lt;', '_'), '>', '_'))" />
-+          <xsl:variable name="id" select="concat('opt-', str:replace(str:replace(str:replace(str:replace(attr[@name = 'name']/string/@value, '*', '_'), '&lt;', '_'), '>', '_'), ':', '_'))" />
-           <varlistentry>
-             <term xlink:href="#{$id}">
-               <xsl:attribute name="xml:id"><xsl:value-of select="$id"/></xsl:attribute>
-diff --git a/nixos/modules/services/databases/redis.nix b/nixos/modules/services/databases/redis.nix
-index 578d9d9ec8d..e7ca0d4e34c 100644
---- a/nixos/modules/services/databases/redis.nix
-+++ b/nixos/modules/services/databases/redis.nix
-@@ -5,17 +5,18 @@ with lib;
- let
-   cfg = config.services.redis;
--  ulimitNofile = cfg.maxclients + 32;
--
-   mkValueString = value:
-     if value == true then "yes"
-     else if value == false then "no"
-     else generators.mkValueStringDefault { } value;
--  redisConfig = pkgs.writeText "redis.conf" (generators.toKeyValue {
-+  redisConfig = settings: pkgs.writeText "redis.conf" (generators.toKeyValue {
-     listsAsDuplicateKeys = true;
-     mkKeyValue = generators.mkKeyValueDefault { inherit mkValueString; } " ";
--  } cfg.settings);
-+  } settings);
-+
-+  redisName = name: "redis" + optionalString (name != "") ("-"+name);
-+  enabledServers = filterAttrs (name: conf: conf.enable) config.services.redis.servers;
- in {
-   imports = [
-@@ -25,6 +26,27 @@ in {
-     (mkRemovedOptionModule [ "services" "redis" "appendOnlyFilename" ] "This option was never used.")
-     (mkRemovedOptionModule [ "services" "redis" "pidFile" ] "This option was removed.")
-     (mkRemovedOptionModule [ "services" "redis" "extraConfig" ] "Use services.redis.settings instead.")
-+    (mkRenamedOptionModule [ "services" "redis" "enable"] [ "services" "redis" "servers" "" "enable" ])
-+    (mkRenamedOptionModule [ "services" "redis" "port"] [ "services" "redis" "servers" "" "port" ])
-+    (mkRenamedOptionModule [ "services" "redis" "openFirewall"] [ "services" "redis" "servers" "" "openFirewall" ])
-+    (mkRenamedOptionModule [ "services" "redis" "bind"] [ "services" "redis" "servers" "" "bind" ])
-+    (mkRenamedOptionModule [ "services" "redis" "unixSocket"] [ "services" "redis" "servers" "" "unixSocket" ])
-+    (mkRenamedOptionModule [ "services" "redis" "unixSocketPerm"] [ "services" "redis" "servers" "" "unixSocketPerm" ])
-+    (mkRenamedOptionModule [ "services" "redis" "logLevel"] [ "services" "redis" "servers" "" "logLevel" ])
-+    (mkRenamedOptionModule [ "services" "redis" "logfile"] [ "services" "redis" "servers" "" "logfile" ])
-+    (mkRenamedOptionModule [ "services" "redis" "syslog"] [ "services" "redis" "servers" "" "syslog" ])
-+    (mkRenamedOptionModule [ "services" "redis" "databases"] [ "services" "redis" "servers" "" "databases" ])
-+    (mkRenamedOptionModule [ "services" "redis" "maxclients"] [ "services" "redis" "servers" "" "maxclients" ])
-+    (mkRenamedOptionModule [ "services" "redis" "save"] [ "services" "redis" "servers" "" "save" ])
-+    (mkRenamedOptionModule [ "services" "redis" "slaveOf"] [ "services" "redis" "servers" "" "slaveOf" ])
-+    (mkRenamedOptionModule [ "services" "redis" "masterAuth"] [ "services" "redis" "servers" "" "masterAuth" ])
-+    (mkRenamedOptionModule [ "services" "redis" "requirePass"] [ "services" "redis" "servers" "" "requirePass" ])
-+    (mkRenamedOptionModule [ "services" "redis" "requirePassFile"] [ "services" "redis" "servers" "" "requirePassFile" ])
-+    (mkRenamedOptionModule [ "services" "redis" "appendOnly"] [ "services" "redis" "servers" "" "appendOnly" ])
-+    (mkRenamedOptionModule [ "services" "redis" "appendFsync"] [ "services" "redis" "servers" "" "appendFsync" ])
-+    (mkRenamedOptionModule [ "services" "redis" "slowLogLogSlowerThan"] [ "services" "redis" "servers" "" "slowLogLogSlowerThan" ])
-+    (mkRenamedOptionModule [ "services" "redis" "slowLogMaxLen"] [ "services" "redis" "servers" "" "slowLogMaxLen" ])
-+    (mkRenamedOptionModule [ "services" "redis" "settings"] [ "services" "redis" "servers" "" "settings" ])
-   ];
-   ###### interface
-@@ -32,18 +54,6 @@ in {
-   options = {
-     services.redis = {
--
--      enable = mkOption {
--        type = types.bool;
--        default = false;
--        description = ''
--          Whether to enable the Redis server. Note that the NixOS module for
--          Redis disables kernel support for Transparent Huge Pages (THP),
--          because this features causes major performance problems for Redis,
--          e.g. (https://redis.io/topics/latency).
--        '';
--      };
--
-       package = mkOption {
-         type = types.package;
-         default = pkgs.redis;
-@@ -51,176 +61,226 @@ in {
-         description = "Which Redis derivation to use.";
-       };
--      port = mkOption {
--        type = types.port;
--        default = 6379;
--        description = "The port for Redis to listen to.";
--      };
-+      vmOverCommit = mkEnableOption ''
-+        setting of vm.overcommit_memory to 1
-+        (Suggested for Background Saving: http://redis.io/topics/faq)
-+      '';
--      vmOverCommit = mkOption {
--        type = types.bool;
--        default = false;
--        description = ''
--          Set vm.overcommit_memory to 1 (Suggested for Background Saving: http://redis.io/topics/faq)
--        '';
--      };
--
--      openFirewall = mkOption {
--        type = types.bool;
--        default = false;
--        description = ''
--          Whether to open ports in the firewall for the server.
--        '';
--      };
--
--      bind = mkOption {
--        type = with types; nullOr str;
--        default = "127.0.0.1";
--        description = ''
--          The IP interface to bind to.
--          <literal>null</literal> means "all interfaces".
--        '';
--        example = "192.0.2.1";
--      };
--
--      unixSocket = mkOption {
--        type = with types; nullOr path;
--        default = null;
--        description = "The path to the socket to bind to.";
--        example = "/run/redis/redis.sock";
--      };
--
--      unixSocketPerm = mkOption {
--        type = types.int;
--        default = 750;
--        description = "Change permissions for the socket";
--        example = 700;
--      };
--
--      logLevel = mkOption {
--        type = types.str;
--        default = "notice"; # debug, verbose, notice, warning
--        example = "debug";
--        description = "Specify the server verbosity level, options: debug, verbose, notice, warning.";
--      };
--
--      logfile = mkOption {
--        type = types.str;
--        default = "/dev/null";
--        description = "Specify the log file name. Also 'stdout' can be used to force Redis to log on the standard output.";
--        example = "/var/log/redis.log";
--      };
--
--      syslog = mkOption {
--        type = types.bool;
--        default = true;
--        description = "Enable logging to the system logger.";
--      };
--
--      databases = mkOption {
--        type = types.int;
--        default = 16;
--        description = "Set the number of databases.";
--      };
--
--      maxclients = mkOption {
--        type = types.int;
--        default = 10000;
--        description = "Set the max number of connected clients at the same time.";
--      };
--
--      save = mkOption {
--        type = with types; listOf (listOf int);
--        default = [ [900 1] [300 10] [60 10000] ];
--        description = "The schedule in which data is persisted to disk, represented as a list of lists where the first element represent the amount of seconds and the second the number of changes.";
--      };
--
--      slaveOf = mkOption {
--        type = with types; nullOr (submodule ({ ... }: {
-+      servers = mkOption {
-+        type = with types; attrsOf (submodule ({config, name, ...}@args: {
-           options = {
--            ip = mkOption {
--              type = str;
--              description = "IP of the Redis master";
--              example = "192.168.1.100";
-+            enable = mkEnableOption ''
-+              Redis server.
-+
-+              Note that the NixOS module for Redis disables kernel support
-+              for Transparent Huge Pages (THP),
-+              because this features causes major performance problems for Redis,
-+              e.g. (https://redis.io/topics/latency).
-+            '';
-+
-+            user = mkOption {
-+              type = types.str;
-+              default = redisName name;
-+              defaultText = "\"redis\" or \"redis-\${name}\" if name != \"\"";
-+              description = "The username and groupname for redis-server.";
-             };
-             port = mkOption {
--              type = port;
--              description = "port of the Redis master";
-+              type = types.port;
-               default = 6379;
-+              description = "The port for Redis to listen to.";
-+            };
-+
-+            openFirewall = mkOption {
-+              type = types.bool;
-+              default = false;
-+              description = ''
-+                Whether to open ports in the firewall for the server.
-+              '';
-+            };
-+
-+            bind = mkOption {
-+              type = with types; nullOr str;
-+              default = if name == "" then "127.0.0.1" else null;
-+              defaultText = "127.0.0.1 or null if name != \"\"";
-+              description = ''
-+                The IP interface to bind to.
-+                <literal>null</literal> means "all interfaces".
-+              '';
-+              example = "192.0.2.1";
-+            };
-+
-+            unixSocket = mkOption {
-+              type = with types; nullOr path;
-+              default = "/run/${redisName name}/redis.sock";
-+              defaultText = "\"/run/redis/redis.sock\" or \"/run/redis-\${name}/redis.sock\" if name != \"\"";
-+              description = "The path to the socket to bind to.";
-+            };
-+
-+            unixSocketPerm = mkOption {
-+              type = types.int;
-+              default = 660;
-+              description = "Change permissions for the socket";
-+              example = 600;
-+            };
-+
-+            logLevel = mkOption {
-+              type = types.str;
-+              default = "notice"; # debug, verbose, notice, warning
-+              example = "debug";
-+              description = "Specify the server verbosity level, options: debug, verbose, notice, warning.";
-+            };
-+
-+            logfile = mkOption {
-+              type = types.str;
-+              default = "/dev/null";
-+              description = "Specify the log file name. Also 'stdout' can be used to force Redis to log on the standard output.";
-+              example = "/var/log/redis.log";
-+            };
-+
-+            syslog = mkOption {
-+              type = types.bool;
-+              default = true;
-+              description = "Enable logging to the system logger.";
-+            };
-+
-+            databases = mkOption {
-+              type = types.int;
-+              default = 16;
-+              description = "Set the number of databases.";
-+            };
-+
-+            maxclients = mkOption {
-+              type = types.int;
-+              default = 10000;
-+              description = "Set the max number of connected clients at the same time.";
-+            };
-+
-+            save = mkOption {
-+              type = with types; listOf (listOf int);
-+              default = [ [900 1] [300 10] [60 10000] ];
-+              description = "The schedule in which data is persisted to disk, represented as a list of lists where the first element represent the amount of seconds and the second the number of changes.";
-+            };
-+
-+            slaveOf = mkOption {
-+              type = with types; nullOr (submodule ({ ... }: {
-+                options = {
-+                  ip = mkOption {
-+                    type = str;
-+                    description = "IP of the Redis master";
-+                    example = "192.168.1.100";
-+                  };
-+
-+                  port = mkOption {
-+                    type = port;
-+                    description = "port of the Redis master";
-+                    default = 6379;
-+                  };
-+                };
-+              }));
-+
-+              default = null;
-+              description = "IP and port to which this redis instance acts as a slave.";
-+              example = { ip = "192.168.1.100"; port = 6379; };
-+            };
-+
-+            masterAuth = mkOption {
-+              type = with types; nullOr str;
-+              default = null;
-+              description = ''If the master is password protected (using the requirePass configuration)
-+              it is possible to tell the slave to authenticate before starting the replication synchronization
-+              process, otherwise the master will refuse the slave request.
-+              (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)'';
-+            };
-+
-+            requirePass = mkOption {
-+              type = with types; nullOr str;
-+              default = null;
-+              description = ''
-+                Password for database (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE).
-+                Use requirePassFile to store it outside of the nix store in a dedicated file.
-+              '';
-+              example = "letmein!";
-+            };
-+
-+            requirePassFile = mkOption {
-+              type = with types; nullOr path;
-+              default = null;
-+              description = "File with password for the database.";
-+              example = "/run/keys/redis-password";
-+            };
-+
-+            appendOnly = mkOption {
-+              type = types.bool;
-+              default = false;
-+              description = "By default data is only periodically persisted to disk, enable this option to use an append-only file for improved persistence.";
-+            };
-+
-+            appendFsync = mkOption {
-+              type = types.str;
-+              default = "everysec"; # no, always, everysec
-+              description = "How often to fsync the append-only log, options: no, always, everysec.";
-+            };
-+
-+            slowLogLogSlowerThan = mkOption {
-+              type = types.int;
-+              default = 10000;
-+              description = "Log queries whose execution take longer than X in milliseconds.";
-+              example = 1000;
-+            };
-+
-+            slowLogMaxLen = mkOption {
-+              type = types.int;
-+              default = 128;
-+              description = "Maximum number of items to keep in slow log.";
-+            };
-+
-+            settings = mkOption {
-+              # TODO: this should be converted to freeformType
-+              type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
-+              default = {};
-+              description = ''
-+                Redis configuration. Refer to
-+                <link xlink:href="https://redis.io/topics/config"/>
-+                for details on supported values.
-+              '';
-+              example = literalExpression ''
-+                {
-+                  loadmodule = [ "/path/to/my_module.so" "/path/to/other_module.so" ];
-+                }
-+              '';
-             };
-           };
-+          config.settings = mkMerge [
-+            {
-+              port = if config.bind == null then 0 else config.port;
-+              daemonize = false;
-+              supervised = "systemd";
-+              loglevel = config.logLevel;
-+              logfile = config.logfile;
-+              syslog-enabled = config.syslog;
-+              databases = config.databases;
-+              maxclients = config.maxclients;
-+              save = map (d: "${toString (builtins.elemAt d 0)} ${toString (builtins.elemAt d 1)}") config.save;
-+              dbfilename = "dump.rdb";
-+              dir = "/var/lib/${redisName name}";
-+              appendOnly = config.appendOnly;
-+              appendfsync = config.appendFsync;
-+              slowlog-log-slower-than = config.slowLogLogSlowerThan;
-+              slowlog-max-len = config.slowLogMaxLen;
-+            }
-+            (mkIf (config.bind != null) { bind = config.bind; })
-+            (mkIf (config.unixSocket != null) {
-+              unixsocket = config.unixSocket;
-+              unixsocketperm = toString config.unixSocketPerm;
-+            })
-+            (mkIf (config.slaveOf != null) { slaveof = "${config.slaveOf.ip} ${toString config.slaveOf.port}"; })
-+            (mkIf (config.masterAuth != null) { masterauth = config.masterAuth; })
-+            (mkIf (config.requirePass != null) { requirepass = config.requirePass; })
-+          ];
-         }));
--
--        default = null;
--        description = "IP and port to which this redis instance acts as a slave.";
--        example = { ip = "192.168.1.100"; port = 6379; };
--      };
--
--      masterAuth = mkOption {
--        type = with types; nullOr str;
--        default = null;
--        description = ''If the master is password protected (using the requirePass configuration)
--        it is possible to tell the slave to authenticate before starting the replication synchronization
--        process, otherwise the master will refuse the slave request.
--        (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)'';
--      };
--
--      requirePass = mkOption {
--        type = with types; nullOr str;
--        default = null;
--        description = ''
--          Password for database (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE).
--          Use requirePassFile to store it outside of the nix store in a dedicated file.
--        '';
--        example = "letmein!";
--      };
--
--      requirePassFile = mkOption {
--        type = with types; nullOr path;
--        default = null;
--        description = "File with password for the database.";
--        example = "/run/keys/redis-password";
--      };
--
--      appendOnly = mkOption {
--        type = types.bool;
--        default = false;
--        description = "By default data is only periodically persisted to disk, enable this option to use an append-only file for improved persistence.";
--      };
--
--      appendFsync = mkOption {
--        type = types.str;
--        default = "everysec"; # no, always, everysec
--        description = "How often to fsync the append-only log, options: no, always, everysec.";
--      };
--
--      slowLogLogSlowerThan = mkOption {
--        type = types.int;
--        default = 10000;
--        description = "Log queries whose execution take longer than X in milliseconds.";
--        example = 1000;
--      };
--
--      slowLogMaxLen = mkOption {
--        type = types.int;
--        default = 128;
--        description = "Maximum number of items to keep in slow log.";
--      };
--
--      settings = mkOption {
--        type = with types; attrsOf (oneOf [ bool int str (listOf str) ]);
-+        description = "Configuration of multiple <literal>redis-server</literal> instances.";
-         default = {};
--        description = ''
--          Redis configuration. Refer to
--          <link xlink:href="https://redis.io/topics/config"/>
--          for details on supported values.
--        '';
--        example = literalExpression ''
--          {
--            loadmodule = [ "/path/to/my_module.so" "/path/to/other_module.so" ];
--          }
--        '';
-       };
-     };
-@@ -229,78 +289,61 @@ in {
-   ###### implementation
--  config = mkIf config.services.redis.enable {
--    assertions = [{
--      assertion = cfg.requirePass != null -> cfg.requirePassFile == null;
--      message = "You can only set one services.redis.requirePass or services.redis.requirePassFile";
--    }];
--    boot.kernel.sysctl = (mkMerge [
-+  config = mkIf (enabledServers != {}) {
-+
-+    assertions = attrValues (mapAttrs (name: conf: {
-+      assertion = conf.requirePass != null -> conf.requirePassFile == null;
-+      message = ''
-+        You can only set one services.redis.servers.${name}.requirePass
-+        or services.redis.servers.${name}.requirePassFile
-+      '';
-+    }) enabledServers);
-+
-+    boot.kernel.sysctl = mkMerge [
-       { "vm.nr_hugepages" = "0"; }
-       ( mkIf cfg.vmOverCommit { "vm.overcommit_memory" = "1"; } )
--    ]);
-+    ];
--    networking.firewall = mkIf cfg.openFirewall {
--      allowedTCPPorts = [ cfg.port ];
--    };
--
--    users.users.redis = {
--      description = "Redis database user";
--      group = "redis";
--      isSystemUser = true;
--    };
--    users.groups.redis = {};
-+    networking.firewall.allowedTCPPorts = concatMap (conf:
-+      optional conf.openFirewall conf.port
-+    ) (attrValues enabledServers);
-     environment.systemPackages = [ cfg.package ];
--    services.redis.settings = mkMerge [
--      {
--        port = cfg.port;
--        daemonize = false;
--        supervised = "systemd";
--        loglevel = cfg.logLevel;
--        logfile = cfg.logfile;
--        syslog-enabled = cfg.syslog;
--        databases = cfg.databases;
--        maxclients = cfg.maxclients;
--        save = map (d: "${toString (builtins.elemAt d 0)} ${toString (builtins.elemAt d 1)}") cfg.save;
--        dbfilename = "dump.rdb";
--        dir = "/var/lib/redis";
--        appendOnly = cfg.appendOnly;
--        appendfsync = cfg.appendFsync;
--        slowlog-log-slower-than = cfg.slowLogLogSlowerThan;
--        slowlog-max-len = cfg.slowLogMaxLen;
--      }
--      (mkIf (cfg.bind != null) { bind = cfg.bind; })
--      (mkIf (cfg.unixSocket != null) { unixsocket = cfg.unixSocket; unixsocketperm = "${toString cfg.unixSocketPerm}"; })
--      (mkIf (cfg.slaveOf != null) { slaveof = "${cfg.slaveOf.ip} ${toString cfg.slaveOf.port}"; })
--      (mkIf (cfg.masterAuth != null) { masterauth = cfg.masterAuth; })
--      (mkIf (cfg.requirePass != null) { requirepass = cfg.requirePass; })
--    ];
-+    users.users = mapAttrs' (name: conf: nameValuePair (redisName name) {
-+      description = "System user for the redis-server instance ${name}";
-+      isSystemUser = true;
-+      group = redisName name;
-+    }) enabledServers;
-+    users.groups = mapAttrs' (name: conf: nameValuePair (redisName name) {
-+    }) enabledServers;
--    systemd.services.redis = {
--      description = "Redis Server";
-+    systemd.services = mapAttrs' (name: conf: nameValuePair (redisName name) {
-+      description = "Redis Server - ${redisName name}";
-       wantedBy = [ "multi-user.target" ];
-       after = [ "network.target" ];
--      preStart = ''
--        install -m 600 ${redisConfig} /run/redis/redis.conf
--      '' + optionalString (cfg.requirePassFile != null) ''
--        password=$(cat ${escapeShellArg cfg.requirePassFile})
--        echo "requirePass $password" >> /run/redis/redis.conf
--      '';
--
-       serviceConfig = {
--        ExecStart = "${cfg.package}/bin/redis-server /run/redis/redis.conf";
-+        ExecStart = "${cfg.package}/bin/redis-server /run/${redisName name}/redis.conf";
-+        ExecStartPre = [("+"+pkgs.writeShellScript "${redisName name}-credentials" (''
-+            install -o '${conf.user}' -m 600 ${redisConfig conf.settings} /run/${redisName name}/redis.conf
-+          '' + optionalString (conf.requirePassFile != null) ''
-+            {
-+              printf requirePass' '
-+              cat ${escapeShellArg conf.requirePassFile}
-+            } >>/run/${redisName name}/redis.conf
-+          '')
-+        )];
-         Type = "notify";
-         # User and group
--        User = "redis";
--        Group = "redis";
-+        User = conf.user;
-+        Group = conf.user;
-         # Runtime directory and mode
--        RuntimeDirectory = "redis";
-+        RuntimeDirectory = redisName name;
-         RuntimeDirectoryMode = "0750";
-         # State directory and mode
--        StateDirectory = "redis";
-+        StateDirectory = redisName name;
-         StateDirectoryMode = "0700";
-         # Access write directories
-         UMask = "0077";
-@@ -309,7 +352,7 @@ in {
-         # Security
-         NoNewPrivileges = true;
-         # Process Properties
--        LimitNOFILE = "${toString ulimitNofile}";
-+        LimitNOFILE = mkDefault "${toString (conf.maxclients + 32)}";
-         # Sandboxing
-         ProtectSystem = "strict";
-         ProtectHome = true;
-@@ -322,7 +365,9 @@ in {
-         ProtectKernelModules = true;
-         ProtectKernelTunables = true;
-         ProtectControlGroups = true;
--        RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
-+        RestrictAddressFamilies =
-+          optionals (conf.bind != null) ["AF_INET" "AF_INET6"] ++
-+          optional (conf.unixSocket != null) "AF_UNIX";
-         RestrictNamespaces = true;
-         LockPersonality = true;
-         MemoryDenyWriteExecute = true;
-@@ -333,6 +378,7 @@ in {
-         SystemCallArchitectures = "native";
-         SystemCallFilter = "~@cpu-emulation @debug @keyring @memlock @mount @obsolete @privileged @resources @setuid";
-       };
--    };
-+    }) enabledServers;
-+
-   };
- }
 diff --git a/nixos/modules/services/misc/sourcehut/builds.nix b/nixos/modules/services/misc/sourcehut/builds.nix
 deleted file mode 100644
-index f806e8c51b9..00000000000
+index 685a132d350..00000000000
 --- a/nixos/modules/services/misc/sourcehut/builds.nix
 +++ /dev/null
-@@ -1,234 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,236 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  scfg = cfg.builds;
 -  rcfg = config.services.redis;
 -  iniKey = "builds.sr.ht";
@@ -664,6 +45,7 @@ index f806e8c51b9..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/buildsrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/buildsrht"'';
 -      description = ''
 -        State path for builds.sr.ht.
 -      '';
@@ -687,7 +69,7 @@ index f806e8c51b9..00000000000
 -              rev = "ff96a0fa5635770390b184ae74debea75c3fd534";
 -              ref = "nixos-unstable";
 -          };
--          image_from_nixpkgs = pkgs_unstable: (import ("${pkgs.sourcehut.buildsrht}/lib/images/nixos/image.nix") {
+-          image_from_nixpkgs = pkgs_unstable: (import ("''${pkgs.sourcehut.buildsrht}/lib/images/nixos/image.nix") {
 -            pkgs = (import pkgs_unstable {});
 -          });
 -        in
@@ -859,1531 +241,143 @@ index f806e8c51b9..00000000000
 -  };
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/default.nix b/nixos/modules/services/misc/sourcehut/default.nix
-index 9c812d6b043..1bd21c278e0 100644
+index 5a6d011a729..f5e4742d902 100644
 --- a/nixos/modules/services/misc/sourcehut/default.nix
 +++ b/nixos/modules/services/misc/sourcehut/default.nix
-@@ -1,14 +1,90 @@
- { config, pkgs, lib, ... }:
--
- with lib;
- let
-+  inherit (config.services) nginx postfix postgresql redis;
-+  inherit (config.users) users groups;
-   cfg = config.services.sourcehut;
--  cfgIni = cfg.settings;
--  settingsFormat = pkgs.formats.ini { };
-+  domain = cfg.settings."sr.ht".global-domain;
-+  settingsFormat = pkgs.formats.ini {
-+    listToValue = concatMapStringsSep "," (generators.mkValueStringDefault {});
-+    mkKeyValue = k: v:
-+      if v == null then ""
-+      else generators.mkKeyValueDefault {
-+        mkValueString = v:
-+          if v == true then "yes"
-+          else if v == false then "no"
-+          else generators.mkValueStringDefault {} v;
-+      } "=" k v;
-+  };
-+  configIniOfService = srv: settingsFormat.generate "sourcehut-${srv}-config.ini"
-+    # Each service needs access to only a subset of sections (and secrets).
-+    (filterAttrs (k: v: v != null)
-+    (mapAttrs (section: v:
-+      let srvMatch = builtins.match "^([a-z]*)\\.sr\\.ht(::.*)?$" section; in
-+      if srvMatch == null # Include sections shared by all services
-+      || head srvMatch == srv # Include sections for the service being configured
-+      then v
-+      # Enable Web links and integrations between services.
-+      else if tail srvMatch == [ null ] && elem (head srvMatch) cfg.services
-+      then {
-+        inherit (v) origin;
-+        # mansrht crashes without it
-+        oauth-client-id = v.oauth-client-id or null;
-+      }
-+      # Drop sub-sections of other services
-+      else null)
-+    (recursiveUpdate cfg.settings {
-+      # Those paths are mounted using BindPaths= or BindReadOnlyPaths=
-+      # for services needing access to them.
-+      "builds.sr.ht::worker".buildlogs = "/var/log/sourcehut/buildsrht-worker";
-+      "git.sr.ht".post-update-script = "/usr/bin/gitsrht-update-hook";
-+      "git.sr.ht".repos = "/var/lib/sourcehut/gitsrht/repos";
-+      "hg.sr.ht".changegroup-script = "/usr/bin/hgsrht-hook-changegroup";
-+      "hg.sr.ht".repos = "/var/lib/sourcehut/hgsrht/repos";
-+      # Making this a per service option despite being in a global section,
-+      # so that it uses the redis-server used by the service.
-+      "sr.ht".redis-host = cfg.${srv}.redis.host;
-+    })));
-+  commonServiceSettings = srv: {
-+    origin = mkOption {
-+      description = "URL ${srv}.sr.ht is being served at (protocol://domain)";
-+      type = types.str;
-+      default = "https://${srv}.${domain}";
-+      defaultText = "https://${srv}.example.com";
-+    };
-+    debug-host = mkOption {
-+      description = "Address to bind the debug server to.";
-+      type = with types; nullOr str;
-+      default = null;
-+    };
-+    debug-port = mkOption {
-+      description = "Port to bind the debug server to.";
-+      type = with types; nullOr str;
-+      default = null;
-+    };
-+    connection-string = mkOption {
-+      description = "SQLAlchemy connection string for the database.";
-+      type = types.str;
-+      default = "postgresql:///localhost?user=${srv}srht&host=/run/postgresql";
-+    };
-+    migrate-on-upgrade = mkEnableOption "automatic migrations on package upgrade" // { default = true; };
-+    oauth-client-id = mkOption {
-+      description = "${srv}.sr.ht's OAuth client id for meta.sr.ht.";
-+      type = types.str;
-+    };
-+    oauth-client-secret = mkOption {
-+      description = "${srv}.sr.ht's OAuth client secret for meta.sr.ht.";
-+      type = types.path;
-+      apply = s: "<" + toString s;
-+    };
-+  };
-   # Specialized python containing all the modules
+@@ -83,7 +83,7 @@ let
    python = pkgs.sourcehut.python.withPackages (ps: with ps; [
      gunicorn
-+    eventlet
-+    # For monitoring Celery: sudo -u listssrht celery --app listssrht.process -b redis+socket:///run/redis-sourcehut/redis.sock?virtual_host=5 flower
-+    flower
+     eventlet
+-    # For monitoring Celery: sudo -u listssrht celery --app listssrht.process -b redis+socket:///run/redis-sourcehut/redis.sock?virtual_host=5 flower
++    # For monitoring Celery: sudo -u listssrht celery --app listssrht.process -b redis+socket:///run/redis-sourcehut/redis.sock?virtual_host=1 flower
+     flower
      # Sourcehut services
      srht
-     buildsrht
-@@ -19,69 +95,37 @@ let
-     listssrht
-     mansrht
-     metasrht
-+    # Not a python package
-+    #pagessrht
-     pastesrht
-     todosrht
-   ]);
-+  mkOptionNullOrStr = description: mkOption {
-+    inherit description;
-+    type = with types; nullOr str;
-+    default = null;
-+  };
- in
- {
--  imports =
--    [
--      ./git.nix
--      ./hg.nix
--      ./hub.nix
--      ./todo.nix
--      ./man.nix
--      ./meta.nix
--      ./paste.nix
--      ./builds.nix
--      ./lists.nix
--      ./dispatch.nix
--      (mkRemovedOptionModule [ "services" "sourcehut" "nginx" "enable" ] ''
--        The sourcehut module supports `nginx` as a local reverse-proxy by default and doesn't
--        support other reverse-proxies officially.
--
--        However it's possible to use an alternative reverse-proxy by
--
--          * disabling nginx
--          * adjusting the relevant settings for server addresses and ports directly
--
--        Further details about this can be found in the `Sourcehut`-section of the NixOS-manual.
--      '')
--    ];
--
-   options.services.sourcehut = {
--    enable = mkOption {
--      type = types.bool;
--      default = false;
--      description = ''
--        Enable sourcehut - git hosting, continuous integration, mailing list, ticket tracking,
--        task dispatching, wiki and account management services
--      '';
--    };
-+    enable = mkEnableOption ''
-+      sourcehut - git hosting, continuous integration, mailing list, ticket tracking,
-+      task dispatching, wiki and account management services
-+    '';
-     services = mkOption {
--      type = types.nonEmptyListOf (types.enum [ "builds" "dispatch" "git" "hub" "hg" "lists" "man" "meta" "paste" "todo" ]);
--      default = [ "man" "meta" "paste" ];
--      example = [ "builds" "dispatch" "git" "hub" "hg" "lists" "man" "meta" "paste" "todo" ];
-+      type = with types; listOf (enum
-+        [ "builds" "dispatch" "git" "hg" "hub" "lists" "man" "meta" "pages" "paste" "todo" ]);
-+      defaultText = "locally enabled services";
-       description = ''
--        Services to enable on the sourcehut network.
-+        Services that may be displayed as links in the title bar of the Web interface.
-       '';
-     };
--    originBase = mkOption {
-+    listenAddress = mkOption {
-       type = types.str;
--      default = with config.networking; hostName + lib.optionalString (domain != null) ".${domain}";
--      description = ''
--        Host name used by reverse-proxy and for default settings. Will host services at git."''${originBase}". For example: git.sr.ht
--      '';
--    };
--
--    address = mkOption {
--      type = types.str;
--      default = "127.0.0.1";
--      description = ''
--        Address to bind to.
--      '';
-+      default = "localhost";
-+      description = "Address to bind to.";
-     };
-     python = mkOption {
-@@ -94,105 +138,1247 @@ in
-       '';
-     };
--    statePath = mkOption {
--      type = types.path;
--      default = "/var/lib/sourcehut";
--      description = ''
--        Root state path for the sourcehut network. If left as the default value
--        this directory will automatically be created before the sourcehut server
--        starts, otherwise the sysadmin is responsible for ensuring the
--        directory exists with appropriate ownership and permissions.
--      '';
-+    minio = {
-+      enable = mkEnableOption ''local minio integration'';
-+    };
-+
-+    nginx = {
-+      enable = mkEnableOption ''local nginx integration'';
-+      virtualHost = mkOption {
-+        type = types.attrs;
-+        default = {};
-+        description = "Virtual-host configuration merged with all Sourcehut's virtual-hosts.";
+@@ -905,6 +905,11 @@ in
+       inherit configIniOfService;
+       srvsrht = "buildsrht";
+       port = 5002;
++      extraServices.buildsrht-api = {
++        serviceConfig.Restart = "always";
++        serviceConfig.RestartSec = "2s";
++        serviceConfig.ExecStart = "${pkgs.sourcehut.buildsrht}/bin/buildsrht-api -b ${cfg.listenAddress}:${toString (cfg.builds.port + 100)}";
 +      };
-+    };
-+
-+    postfix = {
-+      enable = mkEnableOption ''local postfix integration'';
-+    };
-+
-+    postgresql = {
-+      enable = mkEnableOption ''local postgresql integration'';
-+    };
-+
-+    redis = {
-+      enable = mkEnableOption ''local redis integration in a dedicated redis-server'';
-     };
-     settings = mkOption {
-       type = lib.types.submodule {
-         freeformType = settingsFormat.type;
-+        options."sr.ht" = {
-+          global-domain = mkOption {
-+            description = "Global domain name.";
-+            type = types.str;
-+            example = "example.com";
-+          };
-+          environment = mkOption {
-+            description = "Values other than \"production\" adds a banner to each page.";
-+            type = types.enum [ "development" "production" ];
-+            default = "development";
-+          };
-+          network-key = mkOption {
-+            description = ''
-+              An absolute file path (which should be outside the Nix-store)
-+              to a secret key to encrypt internal messages with. Use <code>srht-keygen network</code> to
-+              generate this key. It must be consistent between all services and nodes.
-+            '';
-+            type = types.path;
-+            apply = s: "<" + toString s;
-+          };
-+          owner-email = mkOption {
-+            description = "Owner's email.";
-+            type = types.str;
-+            default = "contact@example.com";
-+          };
-+          owner-name = mkOption {
-+            description = "Owner's name.";
-+            type = types.str;
-+            default = "John Doe";
-+          };
-+          site-blurb = mkOption {
-+            description = "Blurb for your site.";
-+            type = types.str;
-+            default = "the hacker's forge";
-+          };
-+          site-info = mkOption {
-+            description = "The top-level info page for your site.";
-+            type = types.str;
-+            default = "https://sourcehut.org";
-+          };
-+          service-key = mkOption {
-+            description = ''
-+              An absolute file path (which should be outside the Nix-store)
-+              to a key used for encrypting session cookies. Use <code>srht-keygen service</code> to
-+              generate the service key. This must be shared between each node of the same
-+              service (e.g. git1.sr.ht and git2.sr.ht), but different services may use
-+              different keys. If you configure all of your services with the same
-+              config.ini, you may use the same service-key for all of them.
-+            '';
-+            type = types.path;
-+            apply = s: "<" + toString s;
-+          };
-+          site-name = mkOption {
-+            description = "The name of your network of sr.ht-based sites.";
-+            type = types.str;
-+            default = "sourcehut";
-+          };
-+          source-url = mkOption {
-+            description = "The source code for your fork of sr.ht.";
-+            type = types.str;
-+            default = "https://git.sr.ht/~sircmpwn/srht";
-+          };
-+        };
-+        options.mail = {
-+          smtp-host = mkOptionNullOrStr "Outgoing SMTP host.";
-+          smtp-port = mkOption {
-+            description = "Outgoing SMTP port.";
-+            type = with types; nullOr port;
-+            default = null;
-+          };
-+          smtp-user = mkOptionNullOrStr "Outgoing SMTP user.";
-+          smtp-password = mkOptionNullOrStr "Outgoing SMTP password.";
-+          smtp-from = mkOptionNullOrStr "Outgoing SMTP FROM.";
-+          error-to = mkOptionNullOrStr "Address receiving application exceptions";
-+          error-from = mkOptionNullOrStr "Address sending application exceptions";
-+          pgp-privkey = mkOptionNullOrStr ''
-+            An absolute file path (which should be outside the Nix-store)
-+            to an OpenPGP private key.
-+
-+            Your PGP key information (DO NOT mix up pub and priv here)
-+            You must remove the password from your secret key, if present.
-+            You can do this with <code>gpg --edit-key [key-id]</code>,
-+            then use the <code>passwd</code> command and do not enter a new password.
-+          '';
-+          pgp-pubkey = mkOptionNullOrStr "OpenPGP public key.";
-+          pgp-key-id = mkOptionNullOrStr "OpenPGP key identifier.";
-+        };
-+        options.objects = {
-+          s3-upstream = mkOption {
-+            description = "Configure the S3-compatible object storage service.";
-+            type = with types; nullOr str;
-+            default = null;
-+          };
-+          s3-access-key = mkOption {
-+            description = "Access key to the S3-compatible object storage service";
-+            type = with types; nullOr str;
-+            default = null;
-+          };
-+          s3-secret-key = mkOption {
-+            description = ''
-+              An absolute file path (which should be outside the Nix-store)
-+              to the secret key of the S3-compatible object storage service.
-+            '';
-+            type = with types; nullOr path;
-+            default = null;
-+            apply = mapNullable (s: "<" + toString s);
-+          };
-+        };
-+        options.webhooks = {
-+          private-key = mkOption {
-+            description = ''
-+              An absolute file path (which should be outside the Nix-store)
-+              to a base64-encoded Ed25519 key for signing webhook payloads.
-+              This should be consistent for all *.sr.ht sites,
-+              as this key will be used to verify signatures
-+              from other sites in your network.
-+              Use the <code>srht-keygen webhook</code> command to generate a key.
-+            '';
-+            type = types.path;
-+            apply = s: "<" + toString s;
-+          };
-+        };
-+
-+        options."dispatch.sr.ht" = commonServiceSettings "dispatch" // {
-+        };
-+        options."dispatch.sr.ht::github" = {
-+          oauth-client-id = mkOptionNullOrStr "OAuth client id.";
-+          oauth-client-secret = mkOptionNullOrStr "OAuth client secret.";
-+        };
-+        options."dispatch.sr.ht::gitlab" = {
-+          enabled = mkEnableOption "GitLab integration";
-+          canonical-upstream = mkOption {
-+            type = types.str;
-+            description = "Canonical upstream.";
-+            default = "gitlab.com";
-+          };
-+          repo-cache = mkOption {
-+            type = types.str;
-+            description = "Repository cache directory.";
-+            default = "./repo-cache";
-+          };
-+          "gitlab.com" = mkOption {
-+            type = with types; nullOr str;
-+            description = "GitLab id and secret.";
-+            default = null;
-+            example = "GitLab:application id:secret";
-+          };
-+        };
-+
-+        options."builds.sr.ht" = commonServiceSettings "builds" // {
-+          allow-free = mkEnableOption "nonpaying users to submit builds";
-+          redis = mkOption {
-+            description = "The Redis connection used for the Celery worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-buildsrht/redis.sock?virtual_host=2";
-+          };
-+          shell = mkOption {
-+            description = ''
-+              Scripts used to launch on SSH connection.
-+              <literal>/usr/bin/master-shell</literal> on master,
-+              <literal>/usr/bin/runner-shell</literal> on runner.
-+              If master and worker are on the same system
-+              set to <literal>/usr/bin/runner-shell</literal>.
-+            '';
-+            type = types.enum ["/usr/bin/master-shell" "/usr/bin/runner-shell"];
-+            default = "/usr/bin/master-shell";
-+          };
-+        };
-+        options."builds.sr.ht::worker" = {
-+          bind-address = mkOption {
-+            description = ''
-+              HTTP bind address for serving local build information/monitoring.
-+            '';
-+            type = types.str;
-+            default = "localhost:8080";
-+          };
-+          buildlogs = mkOption {
-+            description = "Path to write build logs.";
-+            type = types.str;
-+            default = "/var/log/sourcehut/buildsrht-worker";
-+          };
-+          name = mkOption {
-+            description = ''
-+              Listening address and listening port
-+              of the build runner (with HTTP port if not 80).
-+            '';
-+            type = types.str;
-+            default = "localhost:5020";
-+          };
-+          timeout = mkOption {
-+            description = ''
-+              Max build duration.
-+              See <link xlink:href="https://golang.org/pkg/time/#ParseDuration"/>.
-+            '';
-+            type = types.str;
-+            default = "3m";
-+          };
-+        };
-+
-+        options."git.sr.ht" = commonServiceSettings "git" // {
-+          outgoing-domain = mkOption {
-+            description = "Outgoing domain.";
-+            type = types.str;
-+            default = "https://git.localhost.localdomain";
-+          };
-+          post-update-script = mkOption {
-+            description = ''
-+              A post-update script which is installed in every git repo.
-+              This setting is propagated to newer and existing repositories.
-+            '';
-+            type = types.path;
-+            default = "${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook";
-+            defaultText = "\${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook";
-+          };
-+          repos = mkOption {
-+            description = ''
-+              Path to git repositories on disk.
-+              If changing the default, you must ensure that
-+              the gitsrht's user as read and write access to it.
-+            '';
-+            type = types.str;
-+            default = "/var/lib/sourcehut/gitsrht/repos";
-+          };
-+          webhooks = mkOption {
-+            description = "The Redis connection used for the webhooks worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-gitsrht/redis.sock?virtual_host=1";
-+          };
-+        };
-+        options."git.sr.ht::api" = {
-+          internal-ipnet = mkOption {
-+            description = ''
-+              Set of IP subnets which are permitted to utilize internal API
-+              authentication. This should be limited to the subnets
-+              from which your *.sr.ht services are running.
-+              See <xref linkend="opt-services.sourcehut.listenAddress"/>.
-+            '';
-+            type = with types; listOf str;
-+            default = [ "127.0.0.0/8" "::1/128" ];
-+          };
-+        };
-+
-+        options."hg.sr.ht" = commonServiceSettings "hg" // {
-+          changegroup-script = mkOption {
-+            description = ''
-+              A changegroup script which is installed in every mercurial repo.
-+              This setting is propagated to newer and existing repositories.
-+            '';
-+            type = types.str;
-+            default = "${cfg.python}/bin/hgsrht-hook-changegroup";
-+            defaultText = "\${cfg.python}/bin/hgsrht-hook-changegroup";
-+          };
-+          repos = mkOption {
-+            description = ''
-+              Path to mercurial repositories on disk.
-+              If changing the default, you must ensure that
-+              the hgsrht's user as read and write access to it.
-+            '';
-+            type = types.str;
-+            default = "/var/lib/sourcehut/hgsrht/repos";
-+          };
-+          srhtext = mkOptionNullOrStr ''
-+            Path to the srht mercurial extension
-+            (defaults to where the hgsrht code is)
-+          '';
-+          clone_bundle_threshold = mkOption {
-+            description = ".hg/store size (in MB) past which the nightly job generates clone bundles.";
-+            type = types.ints.unsigned;
-+            default = 50;
-+          };
-+          hg_ssh = mkOption {
-+            description = "Path to hg-ssh (if not in $PATH).";
-+            type = types.str;
-+            default = "${pkgs.mercurial}/bin/hg-ssh";
-+            defaultText = "\${pkgs.mercurial}/bin/hg-ssh";
-+          };
-+          webhooks = mkOption {
-+            description = "The Redis connection used for the webhooks worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-hgsrht/redis.sock?virtual_host=1";
-+          };
-+        };
-+
-+        options."hub.sr.ht" = commonServiceSettings "hub" // {
-+        };
-+
-+        options."lists.sr.ht" = commonServiceSettings "lists" // {
-+          allow-new-lists = mkEnableOption "Allow creation of new lists.";
-+          notify-from = mkOption {
-+            description = "Outgoing email for notifications generated by users.";
-+            type = types.str;
-+            default = "lists-notify@localhost.localdomain";
-+          };
-+          posting-domain = mkOption {
-+            description = "Posting domain.";
-+            type = types.str;
-+            default = "lists.localhost.localdomain";
-+          };
-+          redis = mkOption {
-+            description = "The Redis connection used for the Celery worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-listssrht/redis.sock?virtual_host=2";
-+          };
-+          webhooks = mkOption {
-+            description = "The Redis connection used for the webhooks worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-listssrht/redis.sock?virtual_host=1";
-+          };
-+        };
-+        options."lists.sr.ht::worker" = {
-+          reject-mimetypes = mkOption {
-+            description = ''
-+              Comma-delimited list of Content-Types to reject. Messages with Content-Types
-+              included in this list are rejected. Multipart messages are always supported,
-+              and each part is checked against this list.
-+
-+              Uses fnmatch for wildcard expansion.
-+            '';
-+            type = with types; listOf str;
-+            default = ["text/html"];
-+          };
-+          reject-url = mkOption {
-+            description = "Reject URL.";
-+            type = types.str;
-+            default = "https://man.sr.ht/lists.sr.ht/etiquette.md";
-+          };
-+          sock = mkOption {
-+            description = ''
-+              Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
-+              Alternatively, specify IP:PORT and an SMTP server will be run instead.
-+            '';
-+            type = types.str;
-+            default = "/tmp/lists.sr.ht-lmtp.sock";
-+          };
-+          sock-group = mkOption {
-+            description = ''
-+              The lmtp daemon will make the unix socket group-read/write
-+              for users in this group.
-+            '';
-+            type = types.str;
-+            default = "postfix";
-+          };
-+        };
-+
-+        options."man.sr.ht" = commonServiceSettings "man" // {
-+        };
-+
-+        options."meta.sr.ht" =
-+          removeAttrs (commonServiceSettings "meta")
-+            ["oauth-client-id" "oauth-client-secret"] // {
-+          api-origin = mkOption {
-+            description = "Origin URL for API, 100 more than web.";
-+            type = types.str;
-+            default = "http://${cfg.listenAddress}:${toString (cfg.meta.port + 100)}";
-+            defaultText = ''http://<xref linkend="opt-services.sourcehut.listenAddress"/>:''${toString (<xref linkend="opt-services.sourcehut.meta.port"/> + 100)}'';
-+          };
-+          webhooks = mkOption {
-+            description = "The Redis connection used for the webhooks worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-metasrht/redis.sock?virtual_host=1";
-+          };
-+          welcome-emails = mkEnableOption "sending stock sourcehut welcome emails after signup";
-+        };
-+        options."meta.sr.ht::api" = {
-+          internal-ipnet = mkOption {
-+            description = ''
-+              Set of IP subnets which are permitted to utilize internal API
-+              authentication. This should be limited to the subnets
-+              from which your *.sr.ht services are running.
-+              See <xref linkend="opt-services.sourcehut.listenAddress"/>.
-+            '';
-+            type = with types; listOf str;
-+            default = [ "127.0.0.0/8" "::1/128" ];
-+          };
-+        };
-+        options."meta.sr.ht::aliases" = mkOption {
-+          description = "Aliases for the client IDs of commonly used OAuth clients.";
-+          type = with types; attrsOf int;
-+          default = {};
-+          example = { "git.sr.ht" = 12345; };
-+        };
-+        options."meta.sr.ht::billing" = {
-+          enabled = mkEnableOption "the billing system";
-+          stripe-public-key = mkOptionNullOrStr "Public key for Stripe. Get your keys at https://dashboard.stripe.com/account/apikeys";
-+          stripe-secret-key = mkOptionNullOrStr ''
-+            An absolute file path (which should be outside the Nix-store)
-+            to a secret key for Stripe. Get your keys at https://dashboard.stripe.com/account/apikeys
-+          '' // {
-+            apply = mapNullable (s: "<" + toString s);
-+          };
-+        };
-+        options."meta.sr.ht::settings" = {
-+          registration = mkEnableOption "public registration";
-+          onboarding-redirect = mkOption {
-+            description = "Where to redirect new users upon registration.";
-+            type = types.str;
-+            default = "https://meta.localhost.localdomain";
-+          };
-+          user-invites = mkOption {
-+            description = ''
-+              How many invites each user is issued upon registration
-+              (only applicable if open registration is disabled).
-+            '';
-+            type = types.ints.unsigned;
-+            default = 5;
-+          };
-+        };
-+
-+        options."pages.sr.ht" = commonServiceSettings "pages" // {
-+          gemini-certs = mkOption {
-+            description = ''
-+              An absolute file path (which should be outside the Nix-store)
-+              to Gemini certificates.
-+            '';
-+            type = with types; nullOr path;
-+            default = null;
-+          };
-+          max-site-size = mkOption {
-+            description = "Maximum size of any given site (post-gunzip), in MiB.";
-+            type = types.int;
-+            default = 1024;
-+          };
-+          user-domain = mkOption {
-+            description = ''
-+              Configures the user domain, if enabled.
-+              All users are given &lt;username&gt;.this.domain.
-+            '';
-+            type = with types; nullOr str;
-+            default = null;
-+          };
-+        };
-+        options."pages.sr.ht::api" = {
-+          internal-ipnet = mkOption {
-+            description = ''
-+              Set of IP subnets which are permitted to utilize internal API
-+              authentication. This should be limited to the subnets
-+              from which your *.sr.ht services are running.
-+              See <xref linkend="opt-services.sourcehut.listenAddress"/>.
-+            '';
-+            type = with types; listOf str;
-+            default = [ "127.0.0.0/8" "::1/128" ];
-+          };
-+        };
-+
-+        options."paste.sr.ht" = commonServiceSettings "paste" // {
-+        };
-+
-+        options."todo.sr.ht" = commonServiceSettings "todo" // {
-+          notify-from = mkOption {
-+            description = "Outgoing email for notifications generated by users.";
-+            type = types.str;
-+            default = "todo-notify@localhost.localdomain";
-+          };
-+          webhooks = mkOption {
-+            description = "The Redis connection used for the webhooks worker.";
-+            type = types.str;
-+            default = "redis+socket:///run/redis-sourcehut-todosrht/redis.sock?virtual_host=1";
-+          };
-+        };
-+        options."todo.sr.ht::mail" = {
-+          posting-domain = mkOption {
-+            description = "Posting domain.";
-+            type = types.str;
-+            default = "todo.localhost.localdomain";
-+          };
-+          sock = mkOption {
-+            description = ''
-+              Path for the lmtp daemon's unix socket. Direct incoming mail to this socket.
-+              Alternatively, specify IP:PORT and an SMTP server will be run instead.
-+            '';
-+            type = types.str;
-+            default = "/tmp/todo.sr.ht-lmtp.sock";
-+          };
-+          sock-group = mkOption {
-+            description = ''
-+              The lmtp daemon will make the unix socket group-read/write
-+              for users in this group.
-+            '';
-+            type = types.str;
-+            default = "postfix";
-+          };
-+        };
+       # TODO: a celery worker on the master and worker are apparently needed
+       extraServices.buildsrht-worker = let
+         qemuPackage = pkgs.qemu_kvm;
+@@ -928,13 +933,13 @@ in
+           fi
+         '';
+         serviceConfig = {
+-          ExecStart = "${pkgs.sourcehut.buildsrht}/bin/builds.sr.ht-worker";
++          ExecStart = "${pkgs.sourcehut.buildsrht}/bin/buildsrht-worker";
+           BindPaths = [ cfg.settings."builds.sr.ht::worker".buildlogs ];
+           LogsDirectory = [ "sourcehut/${serviceName}" ];
+           RuntimeDirectory = [ "sourcehut/${serviceName}/subdir" ];
+           StateDirectory = [ "sourcehut/${serviceName}" ];
+           TimeoutStartSec = "1800s";
+-          # builds.sr.ht-worker looks up ../config.ini
++          # buildsrht-worker looks up ../config.ini
+           WorkingDirectory = "-"+"/run/sourcehut/${serviceName}/subdir";
+         };
        };
-       default = { };
-       description = ''
-         The configuration for the sourcehut network.
-       '';
-     };
--  };
--  config = mkIf cfg.enable {
--    assertions =
--      [
--        {
--          assertion = with cfgIni.webhooks; private-key != null && stringLength private-key == 44;
--          message = "The webhook's private key must be defined and of a 44 byte length.";
--        }
-+    builds = {
-+      enableWorker = mkEnableOption ''
-+        worker for builds.sr.ht
--        {
--          assertion = hasAttrByPath [ "meta.sr.ht" "origin" ] cfgIni && cfgIni."meta.sr.ht".origin != null;
--          message = "meta.sr.ht's origin must be defined.";
--        }
--      ];
-+        <warning><para>
-+        For smaller deployments, job runners can be installed alongside the master server
-+        but even if you only build your own software, integration with other services
-+        may cause you to run untrusted builds
-+        (e.g. automatic testing of patches via listssrht).
-+        See <link xlink:href="https://man.sr.ht/builds.sr.ht/configuration.md#security-model"/>.
-+        </para></warning>
-+      '';
--    virtualisation.docker.enable = true;
--    environment.etc."sr.ht/config.ini".source =
--      settingsFormat.generate "sourcehut-config.ini" (mapAttrsRecursive
--        (
--          path: v: if v == null then "" else v
--        )
--        cfg.settings);
-+      images = mkOption {
-+        type = with types; attrsOf (attrsOf (attrsOf package));
-+        default = { };
-+        example = lib.literalExpression ''(let
-+            # Pinning unstable to allow usage with flakes and limit rebuilds.
-+            pkgs_unstable = builtins.fetchGit {
-+                url = "https://github.com/NixOS/nixpkgs";
-+                rev = "ff96a0fa5635770390b184ae74debea75c3fd534";
-+                ref = "nixos-unstable";
-+            };
-+            image_from_nixpkgs = (import ("${pkgs.sourcehut.buildsrht}/lib/images/nixos/image.nix") {
-+              pkgs = (import pkgs_unstable {});
-+            });
-+          in
-+          {
-+            nixos.unstable.x86_64 = image_from_nixpkgs;
-+          }
-+        )'';
-+        description = ''
-+          Images for builds.sr.ht. Each package should be distro.release.arch and point to a /nix/store/package/root.img.qcow2.
-+        '';
-+      };
-+    };
--    environment.systemPackages = [ pkgs.sourcehut.coresrht ];
-+    git = {
-+      package = mkOption {
-+        type = types.package;
-+        default = pkgs.git;
-+        example = literalExpression "pkgs.gitFull";
-+        description = ''
-+          Git package for git.sr.ht. This can help silence collisions.
-+        '';
-+      };
-+      fcgiwrap.preforkProcess = mkOption {
-+        description = "Number of fcgiwrap processes to prefork.";
-+        type = types.int;
-+        default = 4;
-+      };
-+    };
--    # PostgreSQL server
--    services.postgresql.enable = mkOverride 999 true;
--    # Mail server
--    services.postfix.enable = mkOverride 999 true;
--    # Cron daemon
--    services.cron.enable = mkOverride 999 true;
--    # Redis server
--    services.redis.enable = mkOverride 999 true;
--    services.redis.bind = mkOverride 999 "127.0.0.1";
-+    hg = {
-+      package = mkOption {
-+        type = types.package;
-+        default = pkgs.mercurial;
-+        description = ''
-+          Mercurial package for hg.sr.ht. This can help silence collisions.
-+        '';
-+      };
-+      cloneBundles = mkOption {
-+        type = types.bool;
-+        default = false;
-+        description = ''
-+          Generate clonebundles (which require more disk space but dramatically speed up cloning large repositories).
-+        '';
-+      };
-+    };
--    services.sourcehut.settings = {
--      # The name of your network of sr.ht-based sites
--      "sr.ht".site-name = mkDefault "sourcehut";
--      # The top-level info page for your site
--      "sr.ht".site-info = mkDefault "https://sourcehut.org";
--      # {{ site-name }}, {{ site-blurb }}
--      "sr.ht".site-blurb = mkDefault "the hacker's forge";
--      # If this != production, we add a banner to each page
--      "sr.ht".environment = mkDefault "development";
--      # Contact information for the site owners
--      "sr.ht".owner-name = mkDefault "Drew DeVault";
--      "sr.ht".owner-email = mkDefault "sir@cmpwn.com";
--      # The source code for your fork of sr.ht
--      "sr.ht".source-url = mkDefault "https://git.sr.ht/~sircmpwn/srht";
--      # A secret key to encrypt session cookies with
--      "sr.ht".secret-key = mkDefault null;
--      "sr.ht".global-domain = mkDefault null;
--
--      # Outgoing SMTP settings
--      mail.smtp-host = mkDefault null;
--      mail.smtp-port = mkDefault null;
--      mail.smtp-user = mkDefault null;
--      mail.smtp-password = mkDefault null;
--      mail.smtp-from = mkDefault null;
--      # Application exceptions are emailed to this address
--      mail.error-to = mkDefault null;
--      mail.error-from = mkDefault null;
--      # Your PGP key information (DO NOT mix up pub and priv here)
--      # You must remove the password from your secret key, if present.
--      # You can do this with gpg --edit-key [key-id], then use the passwd
--      # command and do not enter a new password.
--      mail.pgp-privkey = mkDefault null;
--      mail.pgp-pubkey = mkDefault null;
--      mail.pgp-key-id = mkDefault null;
--
--      # base64-encoded Ed25519 key for signing webhook payloads. This should be
--      # consistent for all *.sr.ht sites, as we'll use this key to verify signatures
--      # from other sites in your network.
--      #
--      # Use the srht-webhook-keygen command to generate a key.
--      webhooks.private-key = mkDefault null;
-+    lists = {
-+      process = {
-+        extraArgs = mkOption {
-+          type = with types; listOf str;
-+          default = [ "--loglevel DEBUG" "--pool eventlet" "--without-heartbeat" ];
-+          description = "Extra arguments passed to the Celery responsible for processing mails.";
-+        };
-+        celeryConfig = mkOption {
-+          type = types.lines;
-+          default = "";
-+          description = "Content of the <literal>celeryconfig.py</literal> used by the Celery of <literal>listssrht-process</literal>.";
-+        };
-+      };
-     };
-   };
-+
-+  config = mkIf cfg.enable (mkMerge [
-+    {
-+      environment.systemPackages = [ pkgs.sourcehut.coresrht ];
-+
-+      services.sourcehut.settings = {
-+        "git.sr.ht".outgoing-domain = mkDefault "https://git.${domain}";
-+        "lists.sr.ht".notify-from = mkDefault "lists-notify@${domain}";
-+        "lists.sr.ht".posting-domain = mkDefault "lists.${domain}";
-+        "meta.sr.ht::settings".onboarding-redirect = mkDefault "https://meta.${domain}";
-+        "todo.sr.ht".notify-from = mkDefault "todo-notify@${domain}";
-+        "todo.sr.ht::mail".posting-domain = mkDefault "todo.${domain}";
-+      };
-+    }
-+    (mkIf cfg.postgresql.enable {
-+      assertions = [
-+        { assertion = postgresql.enable;
-+          message = "postgresql must be enabled and configured";
-+        }
-+      ];
-+    })
-+    (mkIf cfg.postfix.enable {
-+      assertions = [
-+        { assertion = postfix.enable;
-+          message = "postfix must be enabled and configured";
-+        }
-+      ];
-+      # Needed for sharing the LMTP sockets with JoinsNamespaceOf=
-+      systemd.services.postfix.serviceConfig.PrivateTmp = true;
-+    })
-+    (mkIf cfg.redis.enable {
-+      services.redis.vmOverCommit = mkDefault true;
-+    })
-+    (mkIf cfg.nginx.enable {
-+      assertions = [
-+        { assertion = nginx.enable;
-+          message = "nginx must be enabled and configured";
-+        }
-+      ];
-+      # For proxyPass= in virtual-hosts for Sourcehut services.
-+      services.nginx.recommendedProxySettings = mkDefault true;
-+    })
-+    (mkIf (cfg.builds.enable || cfg.git.enable || cfg.hg.enable) {
-+      services.openssh = {
-+        # Note that sshd will continue to honor AuthorizedKeysFile.
-+        # Note that you may want automatically rotate
-+        # or link to /dev/null the following log files:
-+        # - /var/log/gitsrht-dispatch
-+        # - /var/log/{build,git,hg}srht-keys
-+        # - /var/log/{git,hg}srht-shell
-+        # - /var/log/gitsrht-update-hook
-+        authorizedKeysCommand = ''/etc/ssh/sourcehut/subdir/srht-dispatch "%u" "%h" "%t" "%k"'';
-+        # srht-dispatch will setuid/setgid according to [git.sr.ht::dispatch]
-+        authorizedKeysCommandUser = "root";
-+        extraConfig = ''
-+          PermitUserEnvironment SRHT_*
-+        '';
-+      };
-+      environment.etc."ssh/sourcehut/config.ini".source =
-+        settingsFormat.generate "sourcehut-dispatch-config.ini"
-+          (filterAttrs (k: v: k == "git.sr.ht::dispatch")
-+          cfg.settings);
-+      environment.etc."ssh/sourcehut/subdir/srht-dispatch" = {
-+        # sshd_config(5): The program must be owned by root, not writable by group or others
-+        mode = "0755";
-+        source = pkgs.writeShellScript "srht-dispatch" ''
-+          set -e
-+          cd /etc/ssh/sourcehut/subdir
-+          ${cfg.python}/bin/gitsrht-dispatch "$@"
-+        '';
-+      };
-+      systemd.services.sshd = {
-+        #path = optional cfg.git.enable [ cfg.git.package ];
-+        serviceConfig = {
-+          BindReadOnlyPaths =
-+            # Note that those /usr/bin/* paths are hardcoded in multiple places in *.sr.ht,
-+            # for instance to get the user from the [git.sr.ht::dispatch] settings.
-+            # *srht-keys needs to:
-+            # - access a redis-server in [sr.ht] redis-host,
-+            # - access the PostgreSQL server in [*.sr.ht] connection-string,
-+            # - query metasrht-api (through the HTTP API).
-+            # Using this has the side effect of creating empty files in /usr/bin/
-+            optionals cfg.builds.enable [
-+              "${pkgs.writeShellScript "buildsrht-keys-wrapper" ''
-+                set -e
-+                cd /run/sourcehut/buildsrht/subdir
-+                set -x
-+                exec -a "$0" ${pkgs.sourcehut.buildsrht}/bin/buildsrht-keys "$@"
-+              ''}:/usr/bin/buildsrht-keys"
-+              "${pkgs.sourcehut.buildsrht}/bin/master-shell:/usr/bin/master-shell"
-+              "${pkgs.sourcehut.buildsrht}/bin/runner-shell:/usr/bin/runner-shell"
-+            ] ++
-+            optionals cfg.git.enable [
-+              # /path/to/gitsrht-keys calls /path/to/gitsrht-shell,
-+              # or [git.sr.ht] shell= if set.
-+              "${pkgs.writeShellScript "gitsrht-keys-wrapper" ''
-+                set -e
-+                cd /run/sourcehut/gitsrht/subdir
-+                set -x
-+                exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-keys "$@"
-+              ''}:/usr/bin/gitsrht-keys"
-+              "${pkgs.writeShellScript "gitsrht-shell-wrapper" ''
-+                set -e
-+                cd /run/sourcehut/gitsrht/subdir
-+                set -x
-+                exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-shell "$@"
-+              ''}:/usr/bin/gitsrht-shell"
-+              "${pkgs.writeShellScript "gitsrht-update-hook" ''
-+                set -e
-+                test -e "''${PWD%/*}"/config.ini ||
-+                # Git hooks are run relative to their repository's directory,
-+                # but gitsrht-update-hook looks up ../config.ini
-+                ln -s /run/sourcehut/gitsrht/config.ini "''${PWD%/*}"/config.ini
-+                # hooks/post-update calls /usr/bin/gitsrht-update-hook as hooks/stage-3
-+                # but this wrapper being a bash script, it overrides $0 with /usr/bin/gitsrht-update-hook
-+                # hence this hack to put hooks/stage-3 back into gitsrht-update-hook's $0
-+                if test "''${STAGE3:+set}"
-+                then
-+                  set -x
-+                  exec -a hooks/stage-3 ${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook "$@"
-+                else
-+                  export STAGE3=set
-+                  set -x
-+                  exec -a "$0" ${pkgs.sourcehut.gitsrht}/bin/gitsrht-update-hook "$@"
-+                fi
-+              ''}:/usr/bin/gitsrht-update-hook"
-+            ] ++
-+            optionals cfg.hg.enable [
-+              # /path/to/hgsrht-keys calls /path/to/hgsrht-shell,
-+              # or [hg.sr.ht] shell= if set.
-+              "${pkgs.writeShellScript "hgsrht-keys-wrapper" ''
-+                set -e
-+                cd /run/sourcehut/hgsrht/subdir
-+                set -x
-+                exec -a "$0" ${pkgs.sourcehut.hgsrht}/bin/hgsrht-keys "$@"
-+              ''}:/usr/bin/hgsrht-keys"
-+              "${pkgs.writeShellScript "hgsrht-shell-wrapper" ''
-+                set -e
-+                cd /run/sourcehut/hgsrht/subdir
-+                set -x
-+                exec -a "$0" ${pkgs.sourcehut.hgsrht}/bin/hgsrht-shell "$@"
-+              ''}:/usr/bin/hgsrht-shell"
-+              # Mercurial's changegroup hooks are run relative to their repository's directory,
-+              # but hgsrht-hook-changegroup looks up ./config.ini
-+              "${pkgs.writeShellScript "hgsrht-hook-changegroup" ''
-+                set -e
-+                test -e "''$PWD"/config.ini ||
-+                ln -s /run/sourcehut/hgsrht/config.ini "''$PWD"/config.ini
-+                set -x
-+                exec -a "$0" ${cfg.python}/bin/hgsrht-hook-changegroup "$@"
-+              ''}:/usr/bin/hgsrht-hook-changegroup"
-+            ];
-+        };
-+      };
-+    })
-+  ]);
-+
-+  imports = [
-+
-+    (import ./service.nix "builds" {
-+      inherit configIniOfService;
-+      srvsrht = "buildsrht";
-+      port = 5002;
-+      # TODO: a celery worker on the master and worker are apparently needed
-+      extraServices.buildsrht-worker = let
-+        qemuPackage = pkgs.qemu_kvm;
-+        serviceName = "buildsrht-worker";
-+        statePath = "/var/lib/sourcehut/${serviceName}";
-+        in mkIf cfg.builds.enableWorker {
-+        path = [ pkgs.openssh pkgs.docker ];
-+        preStart = ''
-+          set -x
-+          if test -z "$(docker images -q qemu:latest 2>/dev/null)" \
-+          || test "$(cat ${statePath}/docker-image-qemu)" != "${qemuPackage.version}"
-+          then
-+            # Create and import qemu:latest image for docker
-+            ${pkgs.dockerTools.streamLayeredImage {
-+              name = "qemu";
-+              tag = "latest";
-+              contents = [ qemuPackage ];
-+            }} | docker load
-+            # Mark down current package version
-+            echo '${qemuPackage.version}' >${statePath}/docker-image-qemu
-+          fi
-+        '';
-+        serviceConfig = {
-+          ExecStart = "${pkgs.sourcehut.buildsrht}/bin/builds.sr.ht-worker";
-+          BindPaths = [ cfg.settings."builds.sr.ht::worker".buildlogs ];
-+          LogsDirectory = [ "sourcehut/${serviceName}" ];
-+          RuntimeDirectory = [ "sourcehut/${serviceName}/subdir" ];
-+          StateDirectory = [ "sourcehut/${serviceName}" ];
-+          TimeoutStartSec = "1800s";
-+          # builds.sr.ht-worker looks up ../config.ini
-+          WorkingDirectory = "-"+"/run/sourcehut/${serviceName}/subdir";
-+        };
-+      };
-+      extraConfig = let
-+        image_dirs = flatten (
-+          mapAttrsToList (distro: revs:
-+            mapAttrsToList (rev: archs:
-+              mapAttrsToList (arch: image:
-+                pkgs.runCommand "buildsrht-images" { } ''
-+                  mkdir -p $out/${distro}/${rev}/${arch}
-+                  ln -s ${image}/*.qcow2 $out/${distro}/${rev}/${arch}/root.img.qcow2
-+                ''
-+              ) archs
-+            ) revs
-+          ) cfg.builds.images
-+        );
-+        image_dir_pre = pkgs.symlinkJoin {
-+          name = "builds.sr.ht-worker-images-pre";
-+          paths = image_dirs;
-+            # FIXME: not working, apparently because ubuntu/latest is a broken link
-+            # ++ [ "${pkgs.sourcehut.buildsrht}/lib/images" ];
-+        };
-+        image_dir = pkgs.runCommand "builds.sr.ht-worker-images" { } ''
-+          mkdir -p $out/images
-+          cp -Lr ${image_dir_pre}/* $out/images
-+        '';
-+        in mkMerge [
-+        {
-+          users.users.${cfg.builds.user}.shell = pkgs.bash;
-+
-+          virtualisation.docker.enable = true;
-+
-+          services.sourcehut.settings = mkMerge [
-+            { # Note that git.sr.ht::dispatch is not a typo,
-+              # gitsrht-dispatch always use this section
-+              "git.sr.ht::dispatch"."/usr/bin/buildsrht-keys" =
-+                mkDefault "${cfg.builds.user}:${cfg.builds.group}";
-+            }
-+            (mkIf cfg.builds.enableWorker {
-+              "builds.sr.ht::worker".shell = "/usr/bin/runner-shell";
-+              "builds.sr.ht::worker".images = mkDefault "${image_dir}/images";
-+              "builds.sr.ht::worker".controlcmd = mkDefault "${image_dir}/images/control";
-+            })
-+          ];
-+        }
-+        (mkIf cfg.builds.enableWorker {
-+          users.groups = {
-+            docker.members = [ cfg.builds.user ];
-+          };
-+        })
-+        (mkIf (cfg.builds.enableWorker && cfg.nginx.enable) {
-+          # Allow nginx access to buildlogs
-+          users.users.${nginx.user}.extraGroups = [ cfg.builds.group ];
-+          systemd.services.nginx = {
-+            serviceConfig.BindReadOnlyPaths = [ cfg.settings."builds.sr.ht::worker".buildlogs ];
-+          };
-+          services.nginx.virtualHosts."logs.${domain}" = mkMerge [ {
-+            /* FIXME: is a listen needed?
-+            listen = with builtins;
-+              # FIXME: not compatible with IPv6
-+              let address = split ":" cfg.settings."builds.sr.ht::worker".name; in
-+              [{ addr = elemAt address 0; port = lib.toInt (elemAt address 2); }];
-+            */
-+            locations."/logs/".alias = cfg.settings."builds.sr.ht::worker".buildlogs + "/";
-+          } cfg.nginx.virtualHost ];
-+        })
-+      ];
-+    })
-+
-+    (import ./service.nix "dispatch" {
-+      inherit configIniOfService;
-+      port = 5005;
-+    })
-+
-+    (import ./service.nix "git" (let
-+      baseService = {
-+        path = [ cfg.git.package ];
-+        serviceConfig.BindPaths = [ "${cfg.settings."git.sr.ht".repos}:/var/lib/sourcehut/gitsrht/repos" ];
-+      };
-+      in {
-+      inherit configIniOfService;
-+      mainService = mkMerge [ baseService {
-+        serviceConfig.StateDirectory = [ "sourcehut/gitsrht" "sourcehut/gitsrht/repos" ];
-+        preStart = mkIf (!versionAtLeast config.system.stateVersion "22.05") (mkBefore ''
-+          # Fix Git hooks of repositories pre-dating https://github.com/NixOS/nixpkgs/pull/133984
-+          (
-+          set +f
-+          shopt -s nullglob
-+          for h in /var/lib/sourcehut/gitsrht/repos/~*/*/hooks/{pre-receive,update,post-update}
-+          do ln -fnsv /usr/bin/gitsrht-update-hook "$h"; done
-+          )
-+        '');
-+      } ];
-+      port = 5001;
-+      webhooks = true;
-+      extraTimers.gitsrht-periodic = {
-+        service = baseService;
-+        timerConfig.OnCalendar = ["*:0/20"];
-+      };
-+      extraConfig = mkMerge [
-+        {
-+          # https://stackoverflow.com/questions/22314298/git-push-results-in-fatal-protocol-error-bad-line-length-character-this
-+          # Probably could use gitsrht-shell if output is restricted to just parameters...
-+          users.users.${cfg.git.user}.shell = pkgs.bash;
-+          services.sourcehut.settings = {
-+            "git.sr.ht::dispatch"."/usr/bin/gitsrht-keys" =
-+              mkDefault "${cfg.git.user}:${cfg.git.group}";
-+          };
-+          systemd.services.sshd = baseService;
-+        }
-+        (mkIf cfg.nginx.enable {
-+          services.nginx.virtualHosts."git.${domain}" = {
-+            locations."/authorize" = {
-+              proxyPass = "http://${cfg.listenAddress}:${toString cfg.git.port}";
-+              extraConfig = ''
-+                proxy_pass_request_body off;
-+                proxy_set_header Content-Length "";
-+                proxy_set_header X-Original-URI $request_uri;
-+              '';
-+            };
-+            locations."~ ^/([^/]+)/([^/]+)/(HEAD|info/refs|objects/info/.*|git-upload-pack).*$" = {
-+              root = "/var/lib/sourcehut/gitsrht/repos";
-+              fastcgiParams = {
-+                GIT_HTTP_EXPORT_ALL = "";
-+                GIT_PROJECT_ROOT = "$document_root";
-+                PATH_INFO = "$uri";
-+                SCRIPT_FILENAME = "${cfg.git.package}/bin/git-http-backend";
-+              };
-+              extraConfig = ''
-+                auth_request /authorize;
-+                fastcgi_read_timeout 500s;
-+                fastcgi_pass unix:/run/gitsrht-fcgiwrap.sock;
-+                gzip off;
-+              '';
-+            };
-+          };
-+          systemd.sockets.gitsrht-fcgiwrap = {
-+            before = [ "nginx.service" ];
-+            wantedBy = [ "sockets.target" "gitsrht.service" ];
-+            # This path remains accessible to nginx.service, which has no RootDirectory=
-+            socketConfig.ListenStream = "/run/gitsrht-fcgiwrap.sock";
-+            socketConfig.SocketUser = nginx.user;
-+            socketConfig.SocketMode = "600";
-+          };
-+        })
-+      ];
-+      extraServices.gitsrht-fcgiwrap = mkIf cfg.nginx.enable {
-+        serviceConfig = {
-+          # Socket is passed by gitsrht-fcgiwrap.socket
-+          ExecStart = "${pkgs.fcgiwrap}/sbin/fcgiwrap -c ${toString cfg.git.fcgiwrap.preforkProcess}";
-+          # No need for config.ini
-+          ExecStartPre = mkForce [];
-+          User = null;
-+          DynamicUser = true;
-+          BindReadOnlyPaths = [ "${cfg.settings."git.sr.ht".repos}:/var/lib/sourcehut/gitsrht/repos" ];
-+          IPAddressDeny = "any";
-+          InaccessiblePaths = [ "-+/run/postgresql" "-+/run/redis-sourcehut" ];
-+          PrivateNetwork = true;
-+          RestrictAddressFamilies = mkForce [ "none" ];
-+          SystemCallFilter = mkForce [
-+            "@system-service"
-+            "~@aio" "~@keyring" "~@memlock" "~@privileged" "~@resources" "~@setuid"
-+            # @timer is needed for alarm()
-+          ];
-+        };
-+      };
-+    }))
-+
-+    (import ./service.nix "hg" (let
-+      baseService = {
-+        path = [ cfg.hg.package ];
-+        serviceConfig.BindPaths = [ "${cfg.settings."hg.sr.ht".repos}:/var/lib/sourcehut/hgsrht/repos" ];
-+      };
-+      in {
-+      inherit configIniOfService;
-+      mainService = mkMerge [ baseService {
-+        serviceConfig.StateDirectory = [ "sourcehut/hgsrht" "sourcehut/hgsrht/repos" ];
-+      } ];
-+      port = 5010;
-+      webhooks = true;
-+      extraTimers.hgsrht-periodic = {
-+        service = baseService;
-+        timerConfig.OnCalendar = ["*:0/20"];
-+      };
-+      extraTimers.hgsrht-clonebundles = mkIf cfg.hg.cloneBundles {
-+        service = baseService;
-+        timerConfig.OnCalendar = ["daily"];
-+        timerConfig.AccuracySec = "1h";
-+      };
-+      extraConfig = mkMerge [
-+        {
-+          users.users.${cfg.hg.user}.shell = pkgs.bash;
-+          services.sourcehut.settings = {
-+            # Note that git.sr.ht::dispatch is not a typo,
-+            # gitsrht-dispatch always uses this section.
-+            "git.sr.ht::dispatch"."/usr/bin/hgsrht-keys" =
-+              mkDefault "${cfg.hg.user}:${cfg.hg.group}";
-+          };
-+          systemd.services.sshd = baseService;
-+        }
-+        (mkIf cfg.nginx.enable {
-+          # Allow nginx access to repositories
-+          users.users.${nginx.user}.extraGroups = [ cfg.hg.group ];
-+          services.nginx.virtualHosts."hg.${domain}" = {
-+            locations."/authorize" = {
-+              proxyPass = "http://${cfg.listenAddress}:${toString cfg.hg.port}";
-+              extraConfig = ''
-+                proxy_pass_request_body off;
-+                proxy_set_header Content-Length "";
-+                proxy_set_header X-Original-URI $request_uri;
-+              '';
-+            };
-+            # Let clients reach pull bundles. We don't really need to lock this down even for
-+            # private repos because the bundles are named after the revision hashes...
-+            # so someone would need to know or guess a SHA value to download anything.
-+            # TODO: proxyPass to an hg serve service?
-+            locations."~ ^/[~^][a-z0-9_]+/[a-zA-Z0-9_.-]+/\\.hg/bundles/.*$" = {
-+              root = "/var/lib/nginx/hgsrht/repos";
-+              extraConfig = ''
-+                auth_request /authorize;
-+                gzip off;
-+              '';
-+            };
-+          };
-+          systemd.services.nginx = {
-+            serviceConfig.BindReadOnlyPaths = [ "${cfg.settings."hg.sr.ht".repos}:/var/lib/nginx/hgsrht/repos" ];
-+          };
-+        })
-+      ];
-+    }))
-+
-+    (import ./service.nix "hub" {
-+      inherit configIniOfService;
-+      port = 5014;
-+      extraConfig = {
-+        services.nginx = mkIf cfg.nginx.enable {
-+          virtualHosts."hub.${domain}" = mkMerge [ {
-+            serverAliases = [ domain ];
-+          } cfg.nginx.virtualHost ];
-+        };
-+      };
-+    })
-+
-+    (import ./service.nix "lists" (let
-+      srvsrht = "listssrht";
-+      in {
-+      inherit configIniOfService;
-+      port = 5006;
-+      webhooks = true;
-+      # Receive the mail from Postfix and enqueue them into Redis and PostgreSQL
-+      extraServices.listssrht-lmtp = {
-+        wants = [ "postfix.service" ];
-+        unitConfig.JoinsNamespaceOf = optional cfg.postfix.enable "postfix.service";
-+        serviceConfig.ExecStart = "${cfg.python}/bin/listssrht-lmtp";
-+        # Avoid crashing: os.chown(sock, os.getuid(), sock_gid)
-+        serviceConfig.PrivateUsers = mkForce false;
-+      };
-+      # Dequeue the mails from Redis and dispatch them
-+      extraServices.listssrht-process = {
-+        serviceConfig = {
-+          preStart = ''
-+            cp ${pkgs.writeText "${srvsrht}-webhooks-celeryconfig.py" cfg.lists.process.celeryConfig} \
-+               /run/sourcehut/${srvsrht}-webhooks/celeryconfig.py
-+          '';
-+          ExecStart = "${cfg.python}/bin/celery --app listssrht.process worker --hostname listssrht-process@%%h " + concatStringsSep " " cfg.lists.process.extraArgs;
-+          # Avoid crashing: os.getloadavg()
-+          ProcSubset = mkForce "all";
-+        };
+@@ -952,12 +957,12 @@ in
+           ) cfg.builds.images
+         );
+         image_dir_pre = pkgs.symlinkJoin {
+-          name = "builds.sr.ht-worker-images-pre";
++          name = "buildsrht-worker-images-pre";
+           paths = image_dirs;
+             # FIXME: not working, apparently because ubuntu/latest is a broken link
+             # ++ [ "${pkgs.sourcehut.buildsrht}/lib/images" ];
+         };
+-        image_dir = pkgs.runCommand "builds.sr.ht-worker-images" { } ''
++        image_dir = pkgs.runCommand "buildsrht-worker-images" { } ''
+           mkdir -p $out/images
+           cp -Lr ${image_dir_pre}/* $out/images
+         '';
+@@ -1081,6 +1086,11 @@ in
+           };
+         })
+       ];
++      extraServices.gitsrht-api = {
++        serviceConfig.Restart = "always";
++        serviceConfig.RestartSec = "2s";
++        serviceConfig.ExecStart = "${pkgs.sourcehut.gitsrht}/bin/gitsrht-api -b ${cfg.listenAddress}:${toString (cfg.git.port + 100)}";
 +      };
-+      extraConfig = mkIf cfg.postfix.enable {
-+        users.groups.${postfix.group}.members = [ cfg.lists.user ];
-+        services.sourcehut.settings."lists.sr.ht::mail".sock-group = postfix.group;
-+        services.postfix = {
-+          destination = [ "lists.${domain}" ];
-+          # FIXME: an accurate recipient list should be queried
-+          # from the lists.sr.ht PostgreSQL database to avoid backscattering.
-+          # But usernames are unfortunately not in that database but in meta.sr.ht.
-+          # Note that two syntaxes are allowed:
-+          # - ~username/list-name@lists.${domain}
-+          # - u.username.list-name@lists.${domain}
-+          localRecipients = [ "@lists.${domain}" ];
-+          transport = ''
-+            lists.${domain} lmtp:unix:${cfg.settings."lists.sr.ht::worker".sock}
-+          '';
-+        };
+       extraServices.gitsrht-fcgiwrap = mkIf cfg.nginx.enable {
+         serviceConfig = {
+           # Socket is passed by gitsrht-fcgiwrap.socket
+@@ -1124,6 +1134,11 @@ in
+         timerConfig.OnCalendar = ["daily"];
+         timerConfig.AccuracySec = "1h";
+       };
++      extraServices.hgsrht-api = {
++        serviceConfig.Restart = "always";
++        serviceConfig.RestartSec = "2s";
++        serviceConfig.ExecStart = "${pkgs.sourcehut.hgsrht}/bin/hgsrht-api -b ${cfg.listenAddress}:${toString (cfg.hg.port + 100)}";
 +      };
-+    }))
-+
-+    (import ./service.nix "man" {
-+      inherit configIniOfService;
-+      port = 5004;
-+    })
-+
-+    (import ./service.nix "meta" {
-+      inherit configIniOfService;
-+      port = 5000;
-+      webhooks = true;
-+      extraServices.metasrht-api = {
+       extraConfig = mkMerge [
+         {
+           users.users.${cfg.hg.user}.shell = pkgs.bash;
+@@ -1184,6 +1199,11 @@ in
+       inherit configIniOfService;
+       port = 5006;
+       webhooks = true;
++      extraServices.listssrht-api = {
 +        serviceConfig.Restart = "always";
 +        serviceConfig.RestartSec = "2s";
-+        preStart = "set -x\n" + concatStringsSep "\n\n" (attrValues (mapAttrs (k: s:
-+          let srvMatch = builtins.match "^([a-z]*)\\.sr\\.ht$" k;
-+              srv = head srvMatch;
-+          in
-+          # Configure client(s) as "preauthorized"
-+          optionalString (srvMatch != null && cfg.${srv}.enable && ((s.oauth-client-id or null) != null)) ''
-+            # Configure ${srv}'s OAuth client as "preauthorized"
-+            ${postgresql.package}/bin/psql '${cfg.settings."meta.sr.ht".connection-string}' \
-+              -c "UPDATE oauthclient SET preauthorized = true WHERE client_id = '${s.oauth-client-id}'"
-+          ''
-+          ) cfg.settings));
-+        serviceConfig.ExecStart = "${pkgs.sourcehut.metasrht}/bin/metasrht-api -b ${cfg.listenAddress}:${toString (cfg.meta.port + 100)}";
++        serviceConfig.ExecStart = "${pkgs.sourcehut.listssrht}/bin/listssrht-api -b ${cfg.listenAddress}:${toString (cfg.lists.port + 100)}";
 +      };
+       # Receive the mail from Postfix and enqueue them into Redis and PostgreSQL
+       extraServices.listssrht-lmtp = {
+         wants = [ "postfix.service" ];
+@@ -1232,6 +1252,10 @@ in
+       inherit configIniOfService;
+       port = 5000;
+       webhooks = true;
 +      extraTimers.metasrht-daily.timerConfig = {
 +        OnCalendar = ["daily"];
 +        AccuracySec = "1h";
 +      };
-+      extraConfig = mkMerge [
-+        {
-+          assertions = [
-+            { assertion = let s = cfg.settings."meta.sr.ht::billing"; in
-+                          s.enabled == "yes" -> (s.stripe-public-key != null && s.stripe-secret-key != null);
-+              message = "If meta.sr.ht::billing is enabled, the keys must be defined.";
-+            }
-+          ];
-+          environment.systemPackages = optional cfg.meta.enable
-+            (pkgs.writeShellScriptBin "metasrht-manageuser" ''
-+              set -eux
-+              if test "$(${pkgs.coreutils}/bin/id -n -u)" != '${cfg.meta.user}'
-+              then exec sudo -u '${cfg.meta.user}' "$0" "$@"
-+              else
-+                # In order to load config.ini
-+                if cd /run/sourcehut/metasrht
-+                then exec ${cfg.python}/bin/metasrht-manageuser "$@"
-+                else cat <<EOF
-+                  Please run: sudo systemctl start metasrht
-+              EOF
-+                  exit 1
-+                fi
-+              fi
-+            '');
-+        }
-+        (mkIf cfg.nginx.enable {
-+          services.nginx.virtualHosts."meta.${domain}" = {
-+            locations."/query" = {
-+              proxyPass = cfg.settings."meta.sr.ht".api-origin;
-+              extraConfig = ''
-+                if ($request_method = 'OPTIONS') {
-+                  add_header 'Access-Control-Allow-Origin' '*';
-+                  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
-+                  add_header 'Access-Control-Allow-Headers' 'User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
-+                  add_header 'Access-Control-Max-Age' 1728000;
-+                  add_header 'Content-Type' 'text/plain; charset=utf-8';
-+                  add_header 'Content-Length' 0;
-+                  return 204;
-+                }
-+
-+                add_header 'Access-Control-Allow-Origin' '*';
-+                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
-+                add_header 'Access-Control-Allow-Headers' 'User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
-+                add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
-+              '';
-+            };
-+          };
-+        })
-+      ];
-+    })
-+
-+    (import ./service.nix "pages" {
-+      inherit configIniOfService;
-+      port = 5112;
-+      mainService = let
-+        srvsrht = "pagessrht";
-+        version = pkgs.sourcehut.${srvsrht}.version;
-+        stateDir = "/var/lib/sourcehut/${srvsrht}";
-+        iniKey = "pages.sr.ht";
-+        in {
-+        preStart = mkBefore ''
-+          set -x
-+          # Use the /run/sourcehut/${srvsrht}/config.ini
-+          # installed by a previous ExecStartPre= in baseService
-+          cd /run/sourcehut/${srvsrht}
-+
-+          if test ! -e ${stateDir}/db; then
-+            ${postgresql.package}/bin/psql '${cfg.settings.${iniKey}.connection-string}' -f ${pkgs.sourcehut.pagessrht}/share/sql/schema.sql
-+            echo ${version} >${stateDir}/db
-+          fi
-+
-+          ${optionalString cfg.settings.${iniKey}.migrate-on-upgrade ''
-+            # Just try all the migrations because they're not linked to the version
-+            for sql in ${pkgs.sourcehut.pagessrht}/share/sql/migrations/*.sql; do
-+              ${postgresql.package}/bin/psql '${cfg.settings.${iniKey}.connection-string}' -f "$sql" || true
-+            done
-+          ''}
-+
-+          # Disable webhook
-+          touch ${stateDir}/webhook
-+        '';
-+        serviceConfig = {
-+          ExecStart = mkForce "${pkgs.sourcehut.pagessrht}/bin/pages.sr.ht -b ${cfg.listenAddress}:${toString cfg.pages.port}";
-+        };
-+      };
-+    })
-+
-+    (import ./service.nix "paste" {
-+      inherit configIniOfService;
-+      port = 5011;
-+    })
-+
-+    (import ./service.nix "todo" {
-+      inherit configIniOfService;
-+      port = 5003;
-+      webhooks = true;
-+      extraServices.todosrht-lmtp = {
-+        wants = [ "postfix.service" ];
-+        unitConfig.JoinsNamespaceOf = optional cfg.postfix.enable "postfix.service";
-+        serviceConfig.ExecStart = "${cfg.python}/bin/todosrht-lmtp";
-+        # Avoid crashing: os.chown(sock, os.getuid(), sock_gid)
-+        serviceConfig.PrivateUsers = mkForce false;
-+      };
-+      extraConfig = mkIf cfg.postfix.enable {
-+        users.groups.${postfix.group}.members = [ cfg.todo.user ];
-+        services.sourcehut.settings."todo.sr.ht::mail".sock-group = postfix.group;
-+        services.postfix = {
-+          destination = [ "todo.${domain}" ];
-+          # FIXME: an accurate recipient list should be queried
-+          # from the todo.sr.ht PostgreSQL database to avoid backscattering.
-+          # But usernames are unfortunately not in that database but in meta.sr.ht.
-+          # Note that two syntaxes are allowed:
-+          # - ~username/tracker-name@todo.${domain}
-+          # - u.username.tracker-name@todo.${domain}
-+          localRecipients = [ "@todo.${domain}" ];
-+          transport = ''
-+            todo.${domain} lmtp:unix:${cfg.settings."todo.sr.ht::mail".sock}
-+          '';
-+        };
+       extraServices.metasrht-api = {
+         serviceConfig.Restart = "always";
+         serviceConfig.RestartSec = "2s";
+@@ -1248,10 +1272,6 @@ in
+           ) cfg.settings));
+         serviceConfig.ExecStart = "${pkgs.sourcehut.metasrht}/bin/metasrht-api -b ${cfg.listenAddress}:${toString (cfg.meta.port + 100)}";
+       };
+-      extraTimers.metasrht-daily.timerConfig = {
+-        OnCalendar = ["daily"];
+-        AccuracySec = "1h";
+-      };
+       extraConfig = mkMerge [
+         {
+           assertions = [
+@@ -1348,6 +1368,11 @@ in
+       inherit configIniOfService;
+       port = 5003;
+       webhooks = true;
++      extraServices.todosrht-api = {
++        serviceConfig.Restart = "always";
++        serviceConfig.RestartSec = "2s";
++        serviceConfig.ExecStart = "${pkgs.sourcehut.todosrht}/bin/todosrht-api -b ${cfg.listenAddress}:${toString (cfg.todo.port + 100)}";
 +      };
-+    })
-+
-+    (mkRenamedOptionModule [ "services" "sourcehut" "originBase" ]
-+                           [ "services" "sourcehut" "settings" "sr.ht" "global-domain" ])
-+    (mkRenamedOptionModule [ "services" "sourcehut" "address" ]
-+                           [ "services" "sourcehut" "listenAddress" ])
-+
-+  ];
-+
-   meta.doc = ./sourcehut.xml;
--  meta.maintainers = with maintainers; [ tomberek ];
-+  meta.maintainers = with maintainers; [ julm tomberek ];
- }
+       extraServices.todosrht-lmtp = {
+         wants = [ "postfix.service" ];
+         unitConfig.JoinsNamespaceOf = optional cfg.postfix.enable "postfix.service";
 diff --git a/nixos/modules/services/misc/sourcehut/dispatch.nix b/nixos/modules/services/misc/sourcehut/dispatch.nix
 deleted file mode 100644
-index a9db17bebe8..00000000000
+index 292a51d3e1c..00000000000
 --- a/nixos/modules/services/misc/sourcehut/dispatch.nix
 +++ /dev/null
-@@ -1,125 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,127 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.dispatch;
 -  iniKey = "dispatch.sr.ht";
@@ -2419,6 +413,7 @@ index a9db17bebe8..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/dispatchsrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/dispatchsrht"'';
 -      description = ''
 -        State path for dispatch.sr.ht.
 -      '';
@@ -2506,15 +501,16 @@ index a9db17bebe8..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/git.nix b/nixos/modules/services/misc/sourcehut/git.nix
 deleted file mode 100644
-index 2653d77876d..00000000000
+index ff110905d18..00000000000
 --- a/nixos/modules/services/misc/sourcehut/git.nix
 +++ /dev/null
-@@ -1,215 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,217 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  scfg = cfg.git;
 -  iniKey = "git.sr.ht";
 -
@@ -2553,6 +549,7 @@ index 2653d77876d..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/gitsrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/gitsrht"'';
 -      description = ''
 -        State path for git.sr.ht.
 -      '';
@@ -2717,7 +714,7 @@ index 2653d77876d..00000000000
 -                fastcgi_param PATH_INFO $uri;
 -                fastcgi_param GIT_PROJECT_ROOT $document_root;
 -                fastcgi_read_timeout 500s;
--                include ${pkgs.nginx}/conf/fastcgi_params;
+-                include ${config.services.nginx.package}/conf/fastcgi_params;
 -                gzip off;
 -            }
 -      '';
@@ -2727,15 +724,16 @@ index 2653d77876d..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/hg.nix b/nixos/modules/services/misc/sourcehut/hg.nix
 deleted file mode 100644
-index 5cd36bb0455..00000000000
+index 6ba1df8b6dd..00000000000
 --- a/nixos/modules/services/misc/sourcehut/hg.nix
 +++ /dev/null
-@@ -1,173 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,175 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  scfg = cfg.hg;
 -  iniKey = "hg.sr.ht";
 -
@@ -2773,6 +771,7 @@ index 5cd36bb0455..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/hgsrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/hgsrht"'';
 -      description = ''
 -        State path for hg.sr.ht.
 -      '';
@@ -2906,15 +905,16 @@ index 5cd36bb0455..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/hub.nix b/nixos/modules/services/misc/sourcehut/hub.nix
 deleted file mode 100644
-index be3ea21011c..00000000000
+index 7d137a76505..00000000000
 --- a/nixos/modules/services/misc/sourcehut/hub.nix
 +++ /dev/null
-@@ -1,118 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,120 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.hub;
 -  iniKey = "hub.sr.ht";
@@ -2950,6 +950,7 @@ index be3ea21011c..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/hubsrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/hubsrht"'';
 -      description = ''
 -        State path for hub.sr.ht.
 -      '';
@@ -3030,18 +1031,19 @@ index be3ea21011c..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/lists.nix b/nixos/modules/services/misc/sourcehut/lists.nix
 deleted file mode 100644
-index 7b1fe9fd463..00000000000
+index 76f155caa05..00000000000
 --- a/nixos/modules/services/misc/sourcehut/lists.nix
 +++ /dev/null
-@@ -1,185 +0,0 @@
+@@ -1,187 +0,0 @@
 -# Email setup is fairly involved, useful references:
 -# https://drewdevault.com/2018/08/05/Local-mail-server.html
 -
--{ config, lib, pkgs, ... }:
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.lists;
 -  iniKey = "lists.sr.ht";
@@ -3078,6 +1080,7 @@ index 7b1fe9fd463..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/listssrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/listssrht"'';
 -      description = ''
 -        State path for lists.sr.ht.
 -      '';
@@ -3221,15 +1224,16 @@ index 7b1fe9fd463..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/man.nix b/nixos/modules/services/misc/sourcehut/man.nix
 deleted file mode 100644
-index 7693396d187..00000000000
+index 8ca271c32ee..00000000000
 --- a/nixos/modules/services/misc/sourcehut/man.nix
 +++ /dev/null
-@@ -1,122 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,124 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.man;
 -  iniKey = "man.sr.ht";
@@ -3265,6 +1269,7 @@ index 7693396d187..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/mansrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/mansrht"'';
 -      description = ''
 -        State path for man.sr.ht.
 -      '';
@@ -3349,15 +1354,16 @@ index 7693396d187..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/meta.nix b/nixos/modules/services/misc/sourcehut/meta.nix
 deleted file mode 100644
-index 56127a824eb..00000000000
+index 33e4f2332b5..00000000000
 --- a/nixos/modules/services/misc/sourcehut/meta.nix
 +++ /dev/null
-@@ -1,211 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,213 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.meta;
 -  iniKey = "meta.sr.ht";
@@ -3394,6 +1400,7 @@ index 56127a824eb..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/metasrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/metasrht"'';
 -      description = ''
 -        State path for meta.sr.ht.
 -      '';
@@ -3566,15 +1573,16 @@ index 56127a824eb..00000000000
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/paste.nix b/nixos/modules/services/misc/sourcehut/paste.nix
 deleted file mode 100644
-index b2d5151969e..00000000000
+index b481ebaf891..00000000000
 --- a/nixos/modules/services/misc/sourcehut/paste.nix
 +++ /dev/null
-@@ -1,133 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,135 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.paste;
 -  iniKey = "paste.sr.ht";
@@ -3611,6 +1619,7 @@ index b2d5151969e..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/pastesrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/pastesrht"'';
 -      description = ''
 -        State path for pastesrht.sr.ht.
 -      '';
@@ -3704,506 +1713,30 @@ index b2d5151969e..00000000000
 -  };
 -}
 diff --git a/nixos/modules/services/misc/sourcehut/service.nix b/nixos/modules/services/misc/sourcehut/service.nix
-index 65b4ad020f9..ba304fed08a 100644
+index f1706ad0a6a..4ecc7a72669 100644
 --- a/nixos/modules/services/misc/sourcehut/service.nix
 +++ b/nixos/modules/services/misc/sourcehut/service.nix
-@@ -1,66 +1,381 @@
--{ config, pkgs, lib }:
--serviceCfg: serviceDrv: iniKey: attrs:
-+srv:
-+{ configIniOfService
-+, srvsrht ? "${srv}srht" # Because "buildsrht" does not follow that pattern (missing an "s").
-+, iniKey ? "${srv}.sr.ht"
-+, webhooks ? false
-+, extraTimers ? {}
-+, mainService ? {}
-+, extraServices ? {}
-+, extraConfig ? {}
-+, port
-+}:
-+{ config, lib, pkgs, ... }:
-+
-+with lib;
- let
-+  inherit (config.services) postgresql;
-+  redis = config.services.redis.servers."sourcehut-${srvsrht}";
-+  inherit (config.users) users;
-   cfg = config.services.sourcehut;
--  cfgIni = cfg.settings."${iniKey}";
--  pgSuperUser = config.services.postgresql.superUser;
--
--  setupDB = pkgs.writeScript "${serviceDrv.pname}-gen-db" ''
--    #! ${cfg.python}/bin/python
--    from ${serviceDrv.pname}.app import db
--    db.create()
--  '';
-+  configIni = configIniOfService srv;
-+  srvCfg = cfg.${srv};
-+  baseService = serviceName: { allowStripe ? false }: extraService: let
-+    runDir = "/run/sourcehut/${serviceName}";
-+    rootDir = "/run/sourcehut/chroots/${serviceName}";
-+    in
-+    mkMerge [ extraService {
-+    after = [ "network.target" ] ++
-+      optional cfg.postgresql.enable "postgresql.service" ++
-+      optional cfg.redis.enable "redis-sourcehut-${srvsrht}.service";
-+    requires =
-+      optional cfg.postgresql.enable "postgresql.service" ++
-+      optional cfg.redis.enable "redis-sourcehut-${srvsrht}.service";
-+    path = [ pkgs.gawk ];
-+    environment.HOME = runDir;
-+    serviceConfig = {
-+      User = mkDefault srvCfg.user;
-+      Group = mkDefault srvCfg.group;
-+      RuntimeDirectory = [
-+        "sourcehut/${serviceName}"
-+        # Used by *srht-keys which reads ../config.ini
-+        "sourcehut/${serviceName}/subdir"
-+        "sourcehut/chroots/${serviceName}"
-+      ];
-+      RuntimeDirectoryMode = "2750";
-+      # No need for the chroot path once inside the chroot
-+      InaccessiblePaths = [ "-+${rootDir}" ];
-+      # g+rx is for group members (eg. fcgiwrap or nginx)
-+      # to read Git/Mercurial repositories, buildlogs, etc.
-+      # o+x is for intermediate directories created by BindPaths= and like,
-+      # as they're owned by root:root.
-+      UMask = "0026";
-+      RootDirectory = rootDir;
-+      RootDirectoryStartOnly = true;
-+      PrivateTmp = true;
-+      MountAPIVFS = true;
-+      # config.ini is looked up in there, before /etc/srht/config.ini
-+      # Note that it fails to be set in ExecStartPre=
-+      WorkingDirectory = mkDefault ("-"+runDir);
-+      BindReadOnlyPaths = [
-+        builtins.storeDir
-+        "/etc"
-+        "/run/booted-system"
-+        "/run/current-system"
-+        "/run/systemd"
-+        ] ++
-+        optional cfg.postgresql.enable "/run/postgresql" ++
-+        optional cfg.redis.enable "/run/redis-sourcehut-${srvsrht}";
-+      # LoadCredential= are unfortunately not available in ExecStartPre=
-+      # Hence this one is run as root (the +) with RootDirectoryStartOnly=
-+      # to reach credentials wherever they are.
-+      # Note that each systemd service gets its own ${runDir}/config.ini file.
-+      ExecStartPre = mkBefore [("+"+pkgs.writeShellScript "${serviceName}-credentials" ''
-+        set -x
-+        # Replace values begining with a '<' by the content of the file whose name is after.
-+        gawk '{ if (match($0,/^([^=]+=)<(.+)/,m)) { getline f < m[2]; print m[1] f } else print $0 }' ${configIni} |
-+        ${optionalString (!allowStripe) "gawk '!/^stripe-secret-key=/' |"}
-+        install -o ${srvCfg.user} -g root -m 400 /dev/stdin ${runDir}/config.ini
-+      '')];
-+      # The following options are only for optimizing:
-+      # systemd-analyze security
-+      AmbientCapabilities = "";
-+      CapabilityBoundingSet = "";
-+      # ProtectClock= adds DeviceAllow=char-rtc r
-+      DeviceAllow = "";
-+      LockPersonality = true;
-+      MemoryDenyWriteExecute = true;
-+      NoNewPrivileges = true;
-+      PrivateDevices = true;
-+      PrivateMounts = true;
-+      PrivateNetwork = mkDefault false;
-+      PrivateUsers = true;
-+      ProcSubset = "pid";
-+      ProtectClock = true;
-+      ProtectControlGroups = true;
-+      ProtectHome = true;
-+      ProtectHostname = true;
-+      ProtectKernelLogs = true;
-+      ProtectKernelModules = true;
-+      ProtectKernelTunables = true;
-+      ProtectProc = "invisible";
-+      ProtectSystem = "strict";
-+      RemoveIPC = true;
-+      RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
-+      RestrictNamespaces = true;
-+      RestrictRealtime = true;
-+      RestrictSUIDSGID = true;
-+      #SocketBindAllow = [ "tcp:${toString srvCfg.port}" "tcp:${toString srvCfg.prometheusPort}" ];
-+      #SocketBindDeny = "any";
-+      SystemCallFilter = [
-+        "@system-service"
-+        "~@aio" "~@keyring" "~@memlock" "~@privileged" "~@resources" "~@timer"
-+        "@chown" "@setuid"
-+      ];
-+      SystemCallArchitectures = "native";
-+    };
-+  } ];
- in
--with serviceCfg; with lib; recursiveUpdate
- {
--  environment.HOME = statePath;
--  path = [ config.services.postgresql.package ] ++ (attrs.path or [ ]);
--  restartTriggers = [ config.environment.etc."sr.ht/config.ini".source ];
--  serviceConfig = {
--    Type = "simple";
--    User = user;
--    Group = user;
--    Restart = "always";
--    WorkingDirectory = statePath;
--  } // (if (cfg.statePath == "/var/lib/sourcehut/${serviceDrv.pname}") then {
--          StateDirectory = [ "sourcehut/${serviceDrv.pname}" ];
--        } else {})
--  ;
-+  options.services.sourcehut.${srv} = {
-+    enable = mkEnableOption "${srv} service";
--  preStart = ''
--    if ! test -e ${statePath}/db; then
--      # Setup the initial database
--      ${setupDB}
-+    user = mkOption {
-+      type = types.str;
-+      default = srvsrht;
-+      description = ''
-+        User for ${srv}.sr.ht.
-+      '';
-+    };
--      # Set the initial state of the database for future database upgrades
--      if test -e ${cfg.python}/bin/${serviceDrv.pname}-migrate; then
--        # Run alembic stamp head once to tell alembic the schema is up-to-date
--        ${cfg.python}/bin/${serviceDrv.pname}-migrate stamp head
--      fi
-+    group = mkOption {
-+      type = types.str;
-+      default = srvsrht;
-+      description = ''
-+        Group for ${srv}.sr.ht.
-+        Membership grants access to the Git/Mercurial repositories by default,
-+        but not to the config.ini file (where secrets are).
-+      '';
-+    };
--      printf "%s" "${serviceDrv.version}" > ${statePath}/db
--    fi
-+    port = mkOption {
-+      type = types.port;
-+      default = port;
-+      description = ''
-+        Port on which the "${srv}" backend should listen.
-+      '';
-+    };
--    # Update copy of each users' profile to the latest
--    # See https://lists.sr.ht/~sircmpwn/sr.ht-admins/<20190302181207.GA13778%40cirno.my.domain>
--    if ! test -e ${statePath}/webhook; then
--      # Update ${iniKey}'s users' profile copy to the latest
--      ${cfg.python}/bin/srht-update-profiles ${iniKey}
-+    redis = {
-+      host = mkOption {
-+        type = types.str;
-+        default = "unix:/run/redis-sourcehut-${srvsrht}/redis.sock?db=0";
-+        example = "redis://shared.wireguard:6379/0";
-+        description = ''
-+          The redis host URL. This is used for caching and temporary storage, and must
-+          be shared between nodes (e.g. git1.sr.ht and git2.sr.ht), but need not be
-+          shared between services. It may be shared between services, however, with no
-+          ill effect, if this better suits your infrastructure.
-+        '';
-+      };
-+    };
--      touch ${statePath}/webhook
--    fi
-+    postgresql = {
-+      database = mkOption {
-+        type = types.str;
-+        default = "${srv}.sr.ht";
-+        description = ''
-+          PostgreSQL database name for the ${srv}.sr.ht service,
-+          used if <xref linkend="opt-services.sourcehut.postgresql.enable"/> is <literal>true</literal>.
-+        '';
-+      };
-+    };
--    ${optionalString (builtins.hasAttr "migrate-on-upgrade" cfgIni && cfgIni.migrate-on-upgrade == "yes") ''
--      if [ "$(cat ${statePath}/db)" != "${serviceDrv.version}" ]; then
--        # Manage schema migrations using alembic
--        ${cfg.python}/bin/${serviceDrv.pname}-migrate -a upgrade head
-+    gunicorn = {
-+      extraArgs = mkOption {
-+        type = with types; listOf str;
-+        default = ["--timeout 120" "--workers 1" "--log-level=info"];
-+        description = "Extra arguments passed to Gunicorn.";
-+      };
-+    };
-+  } // optionalAttrs webhooks {
-+    webhooks = {
-+      extraArgs = mkOption {
-+        type = with types; listOf str;
-+        default = ["--loglevel DEBUG" "--pool eventlet" "--without-heartbeat"];
-+        description = "Extra arguments passed to the Celery responsible for webhooks.";
-+      };
-+      celeryConfig = mkOption {
-+        type = types.lines;
-+        default = "";
-+        description = "Content of the <literal>celeryconfig.py</literal> used by the Celery responsible for webhooks.";
-+      };
-+    };
-+  };
--        # Mark down current package version
--        printf "%s" "${serviceDrv.version}" > ${statePath}/db
--      fi
--    ''}
-+  config = lib.mkIf (cfg.enable && srvCfg.enable) (mkMerge [ extraConfig {
-+    users = {
-+      users = {
-+        "${srvCfg.user}" = {
-+          isSystemUser = true;
-+          group = mkDefault srvCfg.group;
-+          description = mkDefault "sourcehut user for ${srv}.sr.ht";
-+        };
-+      };
-+      groups = {
-+        "${srvCfg.group}" = { };
-+      } // optionalAttrs (cfg.postgresql.enable
-+        && hasSuffix "0" (postgresql.settings.unix_socket_permissions or "")) {
-+        "postgres".members = [ srvCfg.user ];
-+      } // optionalAttrs (cfg.redis.enable
-+        && hasSuffix "0" (redis.settings.unixsocketperm or "")) {
-+        "redis-sourcehut-${srvsrht}".members = [ srvCfg.user ];
-+      };
-+    };
--    ${attrs.preStart or ""}
--  '';
-+    services.nginx = mkIf cfg.nginx.enable {
-+      virtualHosts."${srv}.${cfg.settings."sr.ht".global-domain}" = mkMerge [ {
-+        forceSSL = mkDefault true;
-+        locations."/".proxyPass = "http://${cfg.listenAddress}:${toString srvCfg.port}";
-+        locations."/static" = {
-+          root = "${pkgs.sourcehut.${srvsrht}}/${pkgs.sourcehut.python.sitePackages}/${srvsrht}";
-+          extraConfig = mkDefault ''
-+            expires 30d;
-+          '';
-+        };
-+      } cfg.nginx.virtualHost ];
-+    };
-+
-+    services.postgresql = mkIf cfg.postgresql.enable {
-+      authentication = ''
-+        local ${srvCfg.postgresql.database} ${srvCfg.user} trust
-+      '';
-+      ensureDatabases = [ srvCfg.postgresql.database ];
-+      ensureUsers = map (name: {
-+          inherit name;
-+          ensurePermissions = { "DATABASE \"${srvCfg.postgresql.database}\"" = "ALL PRIVILEGES"; };
-+        }) [srvCfg.user];
-+    };
-+
-+    services.sourcehut.services = mkDefault (filter (s: cfg.${s}.enable)
-+      [ "builds" "dispatch" "git" "hg" "hub" "lists" "man" "meta" "pages" "paste" "todo" ]);
-+
-+    services.sourcehut.settings = mkMerge [
-+      {
-+        "${srv}.sr.ht".origin = mkDefault "https://${srv}.${cfg.settings."sr.ht".global-domain}";
-+      }
-+
-+      (mkIf cfg.postgresql.enable {
-+        "${srv}.sr.ht".connection-string = mkDefault "postgresql:///${srvCfg.postgresql.database}?user=${srvCfg.user}&host=/run/postgresql";
-+      })
-+    ];
-+
-+    services.redis.servers."sourcehut-${srvsrht}" = mkIf cfg.redis.enable {
-+      enable = true;
-+      databases = 3;
-+      syslog = true;
-+      # TODO: set a more informed value
-+      save = mkDefault [ [1800 10] [300 100] ];
-+      settings = {
-+        # TODO: set a more informed value
-+        maxmemory = mkDefault "128MB";
-+        maxmemory-policy = mkDefault "volatile-ttl";
-+      };
-+    };
-+
-+    systemd.services = mkMerge [
-+      {
-+        "${srvsrht}" = baseService srvsrht { allowStripe = srv == "meta"; } (mkMerge [
-+        {
-+          description = "sourcehut ${srv}.sr.ht website service";
-+          before = optional cfg.nginx.enable "nginx.service";
-+          wants = optional cfg.nginx.enable "nginx.service";
-+          wantedBy = [ "multi-user.target" ];
-+          path = optional cfg.postgresql.enable postgresql.package;
-+          # Beware: change in credentials' content will not trigger restart.
-+          restartTriggers = [ configIni ];
-+          serviceConfig = {
-+            Type = "simple";
-+            Restart = mkDefault "always";
-+            #RestartSec = mkDefault "2min";
-+            StateDirectory = [ "sourcehut/${srvsrht}" ];
-+            StateDirectoryMode = "2750";
-+            ExecStart = "${cfg.python}/bin/gunicorn ${srvsrht}.app:app --name ${srvsrht} --bind ${cfg.listenAddress}:${toString srvCfg.port} " + concatStringsSep " " srvCfg.gunicorn.extraArgs;
-+          };
-+          preStart = let
-+            version = pkgs.sourcehut.${srvsrht}.version;
-+            stateDir = "/var/lib/sourcehut/${srvsrht}";
-+            in mkBefore ''
-+            set -x
-+            # Use the /run/sourcehut/${srvsrht}/config.ini
-+            # installed by a previous ExecStartPre= in baseService
-+            cd /run/sourcehut/${srvsrht}
-+
-+            if test ! -e ${stateDir}/db; then
-+              # Setup the initial database.
-+              # Note that it stamps the alembic head afterward
-+              ${cfg.python}/bin/${srvsrht}-initdb
-+              echo ${version} >${stateDir}/db
-+            fi
-+
-+            ${optionalString cfg.settings.${iniKey}.migrate-on-upgrade ''
-+              if [ "$(cat ${stateDir}/db)" != "${version}" ]; then
-+                # Manage schema migrations using alembic
-+                ${cfg.python}/bin/${srvsrht}-migrate -a upgrade head
-+                echo ${version} >${stateDir}/db
-+              fi
-+            ''}
-+
-+            # Update copy of each users' profile to the latest
-+            # See https://lists.sr.ht/~sircmpwn/sr.ht-admins/<20190302181207.GA13778%40cirno.my.domain>
-+            if test ! -e ${stateDir}/webhook; then
-+              # Update ${iniKey}'s users' profile copy to the latest
-+              ${cfg.python}/bin/srht-update-profiles ${iniKey}
-+              touch ${stateDir}/webhook
-+            fi
-+          '';
-+        } mainService ]);
-+      }
-+
-+      (mkIf webhooks {
-+        "${srvsrht}-webhooks" = baseService "${srvsrht}-webhooks" {}
-+          {
-+            description = "sourcehut ${srv}.sr.ht webhooks service";
-+            after = [ "${srvsrht}.service" ];
-+            wantedBy = [ "${srvsrht}.service" ];
-+            partOf = [ "${srvsrht}.service" ];
-+            preStart = ''
-+              cp ${pkgs.writeText "${srvsrht}-webhooks-celeryconfig.py" srvCfg.webhooks.celeryConfig} \
-+                 /run/sourcehut/${srvsrht}-webhooks/celeryconfig.py
-+            '';
-+            serviceConfig = {
-+              Type = "simple";
-+              Restart = "always";
-+              ExecStart = "${cfg.python}/bin/celery --app ${srvsrht}.webhooks worker --hostname ${srvsrht}-webhooks@%%h " + concatStringsSep " " srvCfg.webhooks.extraArgs;
-+              # Avoid crashing: os.getloadavg()
-+              ProcSubset = mkForce "all";
-+            };
-+          };
-+      })
-+
-+      (mkIf cfg.redis.enable {
-+        "redis-sourcehut-${srvsrht}" = {
-+          serviceConfig.partOf = [ "${srvsrht}.service" ];
-+        };
-+      })
-+
-+      (mapAttrs (timerName: timer: (baseService timerName {} (mkMerge [
-+        {
-+          description = "sourcehut ${timerName} service";
-+          after = [ "network.target" "${srvsrht}.service" ];
-+          serviceConfig = {
-+            Type = "oneshot";
-+            ExecStart = "${cfg.python}/bin/${timerName}";
-+          };
-+        }
-+        (timer.service or {})
-+      ]))) extraTimers)
-+
-+      (mapAttrs (serviceName: extraService: baseService serviceName {} (mkMerge [
-+        {
-+          description = "sourcehut ${serviceName} service";
-+          # So that extraServices have the PostgreSQL database initialized.
-+          after = [ "${srvsrht}.service" ];
-+          wantedBy = [ "${srvsrht}.service" ];
-+          partOf = [ "${srvsrht}.service" ];
-+          serviceConfig = {
-+            Type = "simple";
-+            Restart = mkDefault "always";
-+          };
-+        }
-+        extraService
-+      ])) extraServices)
-+    ];
-+
-+    systemd.timers = mapAttrs (timerName: timer:
-+      {
-+        description = "sourcehut timer for ${timerName}";
-+        wantedBy = [ "timers.target" ];
-+        inherit (timer) timerConfig;
-+      }) extraTimers;
-+  } ]);
- }
--  (builtins.removeAttrs attrs [ "path" "preStart" ])
-diff --git a/nixos/modules/services/misc/sourcehut/sourcehut.xml b/nixos/modules/services/misc/sourcehut/sourcehut.xml
-index ab9a8c6cb4b..41094f65a94 100644
---- a/nixos/modules/services/misc/sourcehut/sourcehut.xml
-+++ b/nixos/modules/services/misc/sourcehut/sourcehut.xml
-@@ -14,13 +14,12 @@
-   <title>Basic usage</title>
-   <para>
-    Sourcehut is a Python and Go based set of applications.
--   <literal><link linkend="opt-services.sourcehut.enable">services.sourcehut</link></literal>
--   by default will use
-+   This NixOS module also provides basic configuration integrating Sourcehut into locally running
-    <literal><link linkend="opt-services.nginx.enable">services.nginx</link></literal>,
--   <literal><link linkend="opt-services.nginx.enable">services.redis</link></literal>,
--   <literal><link linkend="opt-services.nginx.enable">services.cron</link></literal>,
-+   <literal><link linkend="opt-services.redis.servers">services.redis.servers.sourcehut</link></literal>,
-+   <literal><link linkend="opt-services.postfix.enable">services.postfix</link></literal>
-    and
--   <literal><link linkend="opt-services.postgresql.enable">services.postgresql</link></literal>.
-+   <literal><link linkend="opt-services.postgresql.enable">services.postgresql</link></literal> services.
-   </para>
-   <para>
-@@ -42,18 +41,23 @@ in {
-   services.sourcehut = {
-     <link linkend="opt-services.sourcehut.enable">enable</link> = true;
--    <link linkend="opt-services.sourcehut.originBase">originBase</link> = fqdn;
--    <link linkend="opt-services.sourcehut.services">services</link> = [ "meta" "man" "git" ];
-+    <link linkend="opt-services.sourcehut.git.enable">git.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.man.enable">man.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.meta.enable">meta.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.nginx.enable">nginx.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.postfix.enable">postfix.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.postgresql.enable">postgresql.enable</link> = true;
-+    <link linkend="opt-services.sourcehut.redis.enable">redis.enable</link> = true;
-     <link linkend="opt-services.sourcehut.settings">settings</link> = {
-         "sr.ht" = {
-           environment = "production";
-           global-domain = fqdn;
-           origin = "https://${fqdn}";
-           # Produce keys with srht-keygen from <package>sourcehut.coresrht</package>.
--          network-key = "SECRET";
--          service-key = "SECRET";
-+          network-key = "/run/keys/path/to/network-key";
-+          service-key = "/run/keys/path/to/service-key";
-         };
--        webhooks.private-key= "SECRET";
-+        webhooks.private-key= "/run/keys/path/to/webhook-key";
-     };
-   };
+@@ -148,7 +148,7 @@ in
+     redis = {
+       host = mkOption {
+         type = types.str;
+-        default = "unix:/run/redis-sourcehut-${srvsrht}/redis.sock?db=0";
++        default = "unix:///run/redis-sourcehut-${srvsrht}/redis.sock?db=0";
+         example = "redis://shared.wireguard:6379/0";
+         description = ''
+           The redis host URL. This is used for caching and temporary storage, and must
 diff --git a/nixos/modules/services/misc/sourcehut/todo.nix b/nixos/modules/services/misc/sourcehut/todo.nix
 deleted file mode 100644
-index aec773b0669..00000000000
+index 262fa48f59d..00000000000
 --- a/nixos/modules/services/misc/sourcehut/todo.nix
 +++ /dev/null
-@@ -1,161 +0,0 @@
--{ config, lib, pkgs, ... }:
+@@ -1,163 +0,0 @@
+-{ config, lib, options, pkgs, ... }:
 -
 -with lib;
 -let
 -  cfg = config.services.sourcehut;
+-  opt = options.services.sourcehut;
 -  cfgIni = cfg.settings;
 -  scfg = cfg.todo;
 -  iniKey = "todo.sr.ht";
@@ -4240,6 +1773,7 @@ index aec773b0669..00000000000
 -    statePath = mkOption {
 -      type = types.path;
 -      default = "${cfg.statePath}/todosrht";
+-      defaultText = literalExpression ''"''${config.${opt.statePath}}/todosrht"'';
 -      description = ''
 -        State path for todo.sr.ht.
 -      '';
@@ -4360,598 +1894,277 @@ index aec773b0669..00000000000
 -    };
 -  };
 -}
-diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
-index a6eb2c03258..eb0238c0ca1 100644
---- a/nixos/tests/all-tests.nix
-+++ b/nixos/tests/all-tests.nix
-@@ -412,6 +412,7 @@ in
-   solanum = handleTest ./solanum.nix {};
-   solr = handleTest ./solr.nix {};
-   sonarr = handleTest ./sonarr.nix {};
-+  sourcehut = handleTest ./sourcehut.nix {};
-   spacecookie = handleTest ./spacecookie.nix {};
-   spike = handleTest ./spike.nix {};
-   sslh = handleTest ./sslh.nix {};
 diff --git a/nixos/tests/sourcehut.nix b/nixos/tests/sourcehut.nix
-index b56a14ebf85..d1536c59322 100644
+index 34a60247e00..6998f4f0c10 100644
 --- a/nixos/tests/sourcehut.nix
 +++ b/nixos/tests/sourcehut.nix
-@@ -1,29 +1,197 @@
--import ./make-test-python.nix ({ pkgs, ... }:
-+import ./make-test-python.nix ({ pkgs, lib, ... }:
-+let
-+  domain = "sourcehut.localdomain";
-+  # Note that wildcard certificates just under the TLD (eg. *.com)
-+  # would be rejected by clients like curl.
-+  tls-cert = pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
-+    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 36500 \
-+      -subj '/CN=${domain}' -extensions v3_req \
-+      -addext 'subjectAltName = DNS:*.${domain}'
-+    install -D -t $out key.pem cert.pem
-+  '';
-+
-+  images = {
-+    nixos.unstable.x86_64 =
-+      let
-+        systemConfig = { pkgs, ... }: {
-+          # passwordless ssh server
-+          services.openssh = {
-+            enable = true;
-+            permitRootLogin = "yes";
-+            extraConfig = "PermitEmptyPasswords yes";
-+          };
-+
-+          users = {
-+            mutableUsers = false;
-+            # build user
-+            extraUsers."build" = {
-+              isNormalUser = true;
-+              uid = 1000;
-+              extraGroups = [ "wheel" ];
-+              password = "";
-+            };
-+            users.root.password = "";
-+          };
-+
-+          security.sudo.wheelNeedsPassword = false;
-+          nix.trustedUsers = [ "root" "build" ];
-+          documentation.nixos.enable = false;
-+
-+          # builds.sr.ht-image-specific network settings
-+          networking = {
-+            hostName = "build";
-+            dhcpcd.enable = false;
-+            defaultGateway.address = "10.0.2.2";
-+            usePredictableInterfaceNames = false;
-+            interfaces."eth0".ipv4.addresses = [{
-+              address = "10.0.2.15";
-+              prefixLength = 25;
-+            }];
-+            enableIPv6 = false;
-+            nameservers = [
-+              # OpenNIC anycast
-+              "185.121.177.177"
-+              "169.239.202.202"
-+              # Google
-+              "8.8.8.8"
-+            ];
-+            firewall.allowedTCPPorts = [ 22 ];
-+          };
-+
-+          environment.systemPackages = [
-+            pkgs.gitMinimal
-+            #pkgs.mercurial
-+            pkgs.curl
-+            pkgs.gnupg
-+          ];
-+        };
-+        qemuConfig = { pkgs, ... }: {
-+          imports = [ systemConfig ];
-+          fileSystems."/".device = "/dev/disk/by-label/nixos";
-+          boot.initrd.availableKernelModules = [
-+            "ahci"
-+            "ehci_pci"
-+            "sd_mod"
-+            "usb_storage"
-+            "usbhid"
-+            "virtio_balloon"
-+            "virtio_blk"
-+            "virtio_pci"
-+            "virtio_ring"
-+            "xhci_pci"
-+          ];
-+          boot.loader = {
-+            grub = {
-+              version = 2;
-+              device = "/dev/vda";
-+            };
-+            timeout = 0;
-+          };
-+        };
-+        config = (import (pkgs.path + "/nixos/lib/eval-config.nix") {
-+          inherit pkgs; modules = [ qemuConfig ];
-+          system = "x86_64-linux";
-+        }).config;
-+      in
-+      import (pkgs.path + "/nixos/lib/make-disk-image.nix") {
-+        inherit pkgs lib config;
-+        diskSize = 16000;
-+        format = "qcow2-compressed";
-+        contents = [
-+          { source = pkgs.writeText "gitconfig" ''
-+              [user]
-+                name = builds.sr.ht
-+                email = build@sr.ht
-+            '';
-+            target = "/home/build/.gitconfig";
-+            user = "build";
-+            group = "users";
-+            mode = "644";
-+          }
-+        ];
-+      };
-+  };
-+
-+in
- {
-   name = "sourcehut";
-   meta.maintainers = [ pkgs.lib.maintainers.tomberek ];
--  machine = { config, pkgs, ... }: {
--    virtualisation.memorySize = 2048;
--    networking.firewall.allowedTCPPorts = [ 80 ];
-+  machine = { config, pkgs, nodes, ... }: {
-+    # buildsrht needs space
-+    virtualisation.diskSize = 4 * 1024;
-+    virtualisation.memorySize = 2 * 1024;
-+    networking.domain = domain;
-+    networking.extraHosts = ''
-+      ${config.networking.primaryIPAddress} meta.${domain}
-+      ${config.networking.primaryIPAddress} builds.${domain}
-+    '';
-     services.sourcehut = {
-       enable = true;
--      services = [ "meta" ];
--      originBase = "sourcehut";
--      settings."sr.ht".service-key =   "8888888888888888888888888888888888888888888888888888888888888888";
--      settings."sr.ht".network-key = "0000000000000000000000000000000000000000000=";
--      settings.webhooks.private-key = "0000000000000000000000000000000000000000000=";
-+      services = [ "meta" "builds" ];
-+      nginx.enable = true;
-+      nginx.virtualHost = {
-+        forceSSL = true;
-+        sslCertificate = "${tls-cert}/cert.pem";
-+        sslCertificateKey = "${tls-cert}/key.pem";
-+      };
-+      postgresql.enable = true;
-+      redis.enable = true;
-+
-+      meta.enable = true;
-+      builds = {
-+        enable = true;
-+        # FIXME: see why it does not seem to activate fully.
-+        #enableWorker = true;
-+        inherit images;
-+      };
-+      settings."sr.ht" = {
-+        global-domain = config.networking.domain;
-+        service-key = pkgs.writeText "service-key" "8b327279b77e32a3620e2fc9aabce491cc46e7d821fd6713b2a2e650ce114d01";
-+        network-key = pkgs.writeText "network-key" "cEEmc30BRBGkgQZcHFksiG7hjc6_dK1XR2Oo5Jb9_nQ=";
-+      };
-+      settings."builds.sr.ht" = {
-+        oauth-client-secret = pkgs.writeText "buildsrht-oauth-client-secret" "2260e9c4d9b8dcedcef642860e0504bc";
-+        oauth-client-id = "299db9f9c2013170";
-+      };
-+      settings.webhooks.private-key = pkgs.writeText "webhook-key" "Ra3IjxgFiwG9jxgp4WALQIZw/BMYt30xWiOsqD0J7EA=";
-+    };
-+
-+    networking.firewall.allowedTCPPorts = [ 443 ];
-+    security.pki.certificateFiles = [ "${tls-cert}/cert.pem" ];
-+    services.nginx = {
-+      enable = true;
-+      recommendedGzipSettings = true;
-+      recommendedOptimisation = true;
-+      recommendedTlsSettings = true;
-+      recommendedProxySettings = true;
-+    };
-+
-+    services.postgresql = {
-+      enable = true;
-+      enableTCPIP = false;
-+      settings.unix_socket_permissions = "0770";
-     };
-   };
-   testScript = ''
-     start_all()
-     machine.wait_for_unit("multi-user.target")
-+
-+    # Testing metasrht
-+    machine.wait_for_unit("metasrht-api.service")
+@@ -195,6 +195,7 @@ in
+     # Testing metasrht
+     machine.wait_for_unit("metasrht-api.service")
      machine.wait_for_unit("metasrht.service")
++    machine.wait_for_unit("metasrht-webhooks.service")
      machine.wait_for_open_port(5000)
--    machine.succeed("curl -sL http://localhost:5000 | grep meta.sourcehut")
-+    machine.succeed("curl -sL http://localhost:5000 | grep meta.${domain}")
-+    machine.succeed("curl -sL http://meta.${domain} | grep meta.${domain}")
-+
-+    # Testing buildsrht
-+    machine.wait_for_unit("buildsrht.service")
-+    machine.wait_for_open_port(5002)
-+    machine.succeed("curl -sL http://localhost:5002 | grep builds.${domain}")
-+    #machine.wait_for_unit("buildsrht-worker.service")
-   '';
- })
+     machine.succeed("curl -sL http://localhost:5000 | grep meta.${domain}")
+     machine.succeed("curl -sL http://meta.${domain} | grep meta.${domain}")
 diff --git a/pkgs/applications/version-management/sourcehut/builds.nix b/pkgs/applications/version-management/sourcehut/builds.nix
-index c8163caf8ea..f8bd0ca927c 100644
+index 350afd07fe1..99d6a05c4eb 100644
 --- a/pkgs/applications/version-management/sourcehut/builds.nix
 +++ b/pkgs/applications/version-management/sourcehut/builds.nix
-@@ -11,26 +11,54 @@
+@@ -1,7 +1,7 @@
+ { lib
+ , fetchFromSourcehut
+-, buildPythonPackage
+ , buildGoModule
++, buildPythonPackage
+ , srht
+ , redis
+ , celery
+@@ -9,21 +9,29 @@
+ , markdown
+ , ansi2html
  , python
++, unzip
  }:
  let
--  version = "0.66.7";
--
--  buildWorker = src: buildGoModule {
--    inherit src version;
--    pname = "builds-sr-ht-worker";
--
--    vendorSha256 = "sha256-giOaldV46aBqXyFH/cQVsbUr6Rb4VMhbBO86o48tRZY=";
--  };
--in
--buildPythonPackage rec {
--  inherit version;
--  pname = "buildsrht";
-+  version = "0.74.9";
+-  version = "0.75.2";
++  version = "0.80.0";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "builds.sr.ht";
      rev = version;
--    sha256 = "sha256-2MLs/DOXHjEYarXDVUcPZe3o0fmZbzVxn528SE72lhM=";
-+    sha256 = "sha256-YX8NRxq+TBgGN6bm9ea8QJAqOequPt0gDxvCn7yxLfY=";
+-    sha256 = "sha256-SwyxMzmp9baRQ0vceuEn/OpfIv7z7jwq/l67hdOHXjM=";
++    sha256 = "sha256-SzA9bOXiXULRD4Eq9xBbbmMUpXT8egOtooZFF4p79ms=";
    };
  
-+  worker = buildGoModule {
+-  buildWorker = src: buildGoModule {
++  buildsrht-api = buildGoModule ({
+     inherit src version;
+-    pname = "builds-sr-ht-worker";
++    pname = "buildsrht-api";
++    modRoot = "api";
++    vendorSha256 = "sha256-roTwqtg4Y846PNtLdRN/LV3Jd0LVElqjFy3DJcrwoaI=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
++  buildsrht-worker = buildGoModule {
 +    inherit src version;
 +    sourceRoot = "source/worker";
 +    pname = "buildsrht-worker";
-+
-+    vendorSha256 = "sha256-7zlt5305P3KzGrs4wUyAU1+FpoBMyl+yjkLSzqUybxg=";
-+
-+    # What follows is only to update go-redis,
-+    # and thus also using a patched srht-keys.
-+    # go.{mod,sum} could be patched directly but that would be less resilient
-+    # to changes from upstream, and thus harder to maintain the patching
-+    # while it hasn't been merged upstream.
-+
-+    overrideModAttrs = old: {
-+      preBuild = ''
-+        go get github.com/go-redis/redis/v8
-+        go get github.com/go-redis/redis@none
-+        go mod tidy
-+      '';
-+      # Pass updated go.{mod,sum} from go-modules to worker's vendor/go.{mod,sum}
-+      postInstall = ''
-+        cp --reflink=auto go.* $out/
-+      '';
-+    };
-+
-+    patches = [
-+      # Update go-redis to support Unix sockets
-+      patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
-+    ];
-+    patchFlags = ["-p2"];
-+    postConfigure = ''
-+      cp -v vendor/go.{mod,sum} .
-+    '';
-+  };
-+in
-+buildPythonPackage rec {
-+  inherit src version;
-+  pname = "buildsrht";
-+
+     vendorSha256 = "sha256-Pf1M9a43eK4jr6QMi6kRHA8DodXQU0pqq9ua5VC3ER0=";
+   };
+ in
+@@ -31,10 +39,10 @@ buildPythonPackage rec {
+   inherit src version;
+   pname = "buildsrht";
+-  patches = [
+-    # Revert change breaking Unix socket support for Redis
+-    patches/redis-socket/build/0001-Revert-Add-build-submission-and-queue-monitoring.patch
+-  ];
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api worker" ""
++  '';
    nativeBuildInputs = srht.nativeBuildInputs;
  
-   propagatedBuildInputs = [
-@@ -53,13 +81,17 @@ buildPythonPackage rec {
+@@ -58,7 +66,8 @@ buildPythonPackage rec {
  
      cp -r images $out/lib
      cp contrib/submit_image_build $out/bin/builds.sr.ht
 -    cp ${buildWorker "${src}/worker"}/bin/worker $out/bin/builds.sr.ht-worker
-+    cp ${worker}/bin/worker $out/bin/builds.sr.ht-worker
++    ln -s ${buildsrht-api}/bin/api $out/bin/buildsrht-api
++    ln -s ${buildsrht-worker}/bin/worker $out/bin/buildsrht-worker
    '';
  
-+  pythonImportsCheck = [ "buildsrht" ];
-+
-+  passthru = { inherit worker; };
-+
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/builds.sr.ht";
-     description = "Continuous integration service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
+   pythonImportsCheck = [ "buildsrht" ];
 diff --git a/pkgs/applications/version-management/sourcehut/core.nix b/pkgs/applications/version-management/sourcehut/core.nix
-index 7c3a516ed9d..48f0591dae2 100644
+index 805da8c3282..0648f21910f 100644
 --- a/pkgs/applications/version-management/sourcehut/core.nix
 +++ b/pkgs/applications/version-management/sourcehut/core.nix
-@@ -1,6 +1,7 @@
+@@ -1,5 +1,5 @@
  { lib
- , fetchgit
+-, fetchgit
++, fetchFromSourcehut
  , fetchNodeModules
-+, buildGoModule
  , buildPythonPackage
  , pgpy
- , flask
-@@ -25,17 +26,16 @@
- , sassc
- , nodejs
- , redis
--, writeText
- }:
+@@ -29,12 +29,13 @@
  
  buildPythonPackage rec {
    pname = "srht";
--  version = "0.67.4";
-+  version = "0.68.6";
+-  version = "0.68.14";
++  version = "0.68.24";
  
-   src = fetchgit {
-     url = "https://git.sr.ht/~sircmpwn/core.sr.ht";
+-  src = fetchgit {
+-    url = "https://git.sr.ht/~sircmpwn/core.sr.ht";
++  src = fetchFromSourcehut {
++    owner = "~sircmpwn";
++    repo = "core.sr.ht";
      rev = version;
--    sha256 = "sha256-XvzFfcBK5Mq8p7xEBAF/eupUE1kkUBh5k+ByM/WA9bc=";
-+    sha256 = "sha256-AKbpHCUdPGiwC278Sjuzi83uaEgSOKpOo+7as3dFsKo=";
+-    sha256 = "sha256-BY3W2rwrg0mhH3CltgUqg6Xv8Ve5VZNY/lI1cfbAjYM=";
++    sha256 = "sha256-ipukga6vfBgDIXOQCejCkU/iTmBt5egIjB+NlJyL2yo=";
      fetchSubmodules = true;
    };
  
-@@ -46,9 +46,33 @@ buildPythonPackage rec {
-   };
+@@ -47,6 +48,8 @@ buildPythonPackage rec {
    patches = [
--    ./disable-npm-install.patch
-+    # Disable check for npm
-+    patches/disable-npm-install.patch
-+    # Add Unix socket support for redis-host=
-+    patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
+     # Disable check for npm
+     ./disable-npm-install.patch
++    # Fix Unix socket support in RedisQueueCollector
++    patches/redis-socket/core/0001-Fix-Unix-socket-support-in-RedisQueueCollector.patch
    ];
  
-+  passthru = {
-+    core-go = buildGoModule rec {
-+      pname = "core-go";
-+      version = "31e77bac08eedc3d9bf64274b341466f66acf548";
-+      src = fetchgit {
-+        url = "https://git.sr.ht/~sircmpwn/core-go";
-+        rev = version;
-+        sha256 = "sha256-nC/IBsd0lv9uQX6fFnMHLkXAefRItW9jbimL97ICUPc=";
-+        fetchSubmodules = true;
-+      };
-+
-+      vendorSha256 = "sha256-6ibD74VeIfH2g+aqohdDWXkhLFG3QC+CsVTyLGgr/xg=";
-+
-+      patches = [
-+        # Replace x/crypto package by ProtonMail/go-crypto to support ed25519 OpenPGP keys
-+        patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-+      ];
-+      patchFlags = ["-p1"];
-+    };
-+  };
-+
    nativeBuildInputs = [
-     sassc
-     nodejs
-@@ -87,6 +111,7 @@ buildPythonPackage rec {
-   '';
-   dontUseSetuptoolsCheck = true;
-+  pythonImportsCheck = [ "srht" ];
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/srht";
 diff --git a/pkgs/applications/version-management/sourcehut/default.nix b/pkgs/applications/version-management/sourcehut/default.nix
-index 401a1437b7d..e269cbf4346 100644
+index 00810f208cc..aee65dee3bb 100644
 --- a/pkgs/applications/version-management/sourcehut/default.nix
 +++ b/pkgs/applications/version-management/sourcehut/default.nix
-@@ -13,6 +13,7 @@ let
-   python = python3.override {
-     packageOverrides = self: super: {
-       srht = self.callPackage ./core.nix { inherit fetchNodeModules; };
-+      core-go = self.srht.core-go;
-       buildsrht = self.callPackage ./builds.nix { };
-       dispatchsrht = self.callPackage ./dispatch.nix { };
-@@ -22,16 +23,19 @@ let
-       listssrht = self.callPackage ./lists.nix { };
-       mansrht = self.callPackage ./man.nix { };
-       metasrht = self.callPackage ./meta.nix { };
-+      pagessrht = self.callPackage ./pages.nix { };
-       pastesrht = self.callPackage ./paste.nix { };
-       todosrht = self.callPackage ./todo.nix { };
+@@ -2,6 +2,7 @@
+ , openssl
+ , callPackage
+ , recurseIntoAttrs
++, nixosTests
+ }:
  
-       scmsrht = self.callPackage ./scm.nix { };
-+      srht-keys = self.scmsrht.srht-keys;
-     };
-   };
- in
- with python.pkgs; recurseIntoAttrs {
-   inherit python;
-   coresrht = toPythonApplication srht;
-+  core-go = srht.core-go;
-   buildsrht = toPythonApplication buildsrht;
-   dispatchsrht = toPythonApplication dispatchsrht;
-   gitsrht = toPythonApplication gitsrht;
-@@ -40,6 +44,8 @@ with python.pkgs; recurseIntoAttrs {
-   listssrht = toPythonApplication listssrht;
-   mansrht = toPythonApplication mansrht;
-   metasrht = toPythonApplication metasrht;
-+  pagessrht = pagessrht;
+ # To expose the *srht modules, they have to be a python module so we use `buildPythonModule`
+@@ -44,4 +45,7 @@ with python.pkgs; recurseIntoAttrs {
+   pagessrht = pagessrht;
    pastesrht = toPythonApplication pastesrht;
    todosrht = toPythonApplication todosrht;
-+  srht-keys = scmsrht.srht-keys;
- }
-diff --git a/pkgs/applications/version-management/sourcehut/dispatch.nix b/pkgs/applications/version-management/sourcehut/dispatch.nix
-index 637c6f9c1df..32516b437ec 100644
---- a/pkgs/applications/version-management/sourcehut/dispatch.nix
-+++ b/pkgs/applications/version-management/sourcehut/dispatch.nix
-@@ -9,13 +9,13 @@
- buildPythonPackage rec {
-   pname = "dispatchsrht";
--  version = "0.15.8";
-+  version = "0.15.33";
-   src = fetchFromSourcehut {
-     owner = "~sircmpwn";
-     repo = "dispatch.sr.ht";
-     rev = version;
--    sha256 = "sha256-zWCGPjIgMKHXHJUs9aciV7IFgo0rpahon6KXHDwcfss=";
-+    sha256 = "sha256-xNYJ5zFlMB9CgW6H9bmjhRfhpty44A90gDrjgV6wFl4=";
-   };
-   nativeBuildInputs = srht.nativeBuildInputs;
-@@ -31,10 +31,12 @@ buildPythonPackage rec {
-     export SRHT_PATH=${srht}/${python.sitePackages}/srht
-   '';
-+  pythonImportsCheck = [ "dispatchsrht" ];
-+
-   meta = with lib; {
-     homepage = "https://dispatch.sr.ht/~sircmpwn/dispatch.sr.ht";
-     description = "Task dispatcher and service integration tool for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
++  passthru.tests = {
++    nixos-sourcehut = nixosTests.sourcehut;
++  };
  }
+diff --git a/pkgs/applications/version-management/sourcehut/fix-gqlgen-trimpath.nix b/pkgs/applications/version-management/sourcehut/fix-gqlgen-trimpath.nix
+new file mode 100644
+index 00000000000..1f94913292e
+--- /dev/null
++++ b/pkgs/applications/version-management/sourcehut/fix-gqlgen-trimpath.nix
+@@ -0,0 +1,32 @@
++{ unzip }:
++{
++  overrideModAttrs = (_: {
++    # No need to workaround -trimpath: it's not used in go-modules,
++    # but do download `go generate`'s dependencies nonetheless.
++    preBuild = ''
++      set -x
++      go generate ./loaders
++      go generate ./graph
++      set +x
++    '';
++  });
++
++  # Workaround:
++  #   go: git.sr.ht/~emersion/go-emailthreads@v0.0.0-20220412093310-4fd792e343ba: module lookup disabled by GOPROXY=off
++  #   tidy failed: go mod tidy failed: exit status 1
++  #   graph/generate.go:10: running "go": exit status 1
++  proxyVendor = true;
++
++  # Workaround -trimpath in the package derivation:
++  # https://github.com/99designs/gqlgen/issues/1537
++  # This is to give `go generate ./graph` access to gqlgen's *.gotpl files
++  # If it fails, the gqlgenVersion may have to be updated.
++  preBuild = let gqlgenVersion = "0.17.2"; in ''
++    set -x
++    ${unzip}/bin/unzip ''${GOPROXY#"file://"}/github.com/99designs/gqlgen/@v/v${gqlgenVersion}.zip
++    go generate ./loaders
++    go generate ./graph
++    rm -rf github.com
++    set +x
++  '';
++}
 diff --git a/pkgs/applications/version-management/sourcehut/git.nix b/pkgs/applications/version-management/sourcehut/git.nix
-index e44fb9cd6c6..05fbdfb6098 100644
+index 318bee4cf51..a721da0ecd3 100644
 --- a/pkgs/applications/version-management/sourcehut/git.nix
 +++ b/pkgs/applications/version-management/sourcehut/git.nix
-@@ -6,42 +6,109 @@
+@@ -1,57 +1,67 @@
+ { lib
+ , fetchFromSourcehut
+-, buildPythonPackage
+ , buildGoModule
++, buildPythonPackage
+ , python
  , srht
  , pygit2
  , scmsrht
-+, srht-keys
++, unzip
  }:
  let
--  version = "0.72.8";
-+  version = "0.75.1";
+-  version = "0.77.3";
++  version = "0.78.18";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "git.sr.ht";
      rev = version;
--    sha256 = "sha256-AB2uzajO5PtcpJfbOOTfuDFM6is5K39v3AZJ1hShRNc=";
-+    sha256 = "sha256-yYknyhmKCz/Glf/pcNnGTzLNvOha+x/68/YgnMIm9Uk=";
+-    sha256 = "sha256-eJvXCcmdiUzTK0EqNJkLEZsAfr6toD/378HObnMbOWM=";
++    sha256 = "sha256-pGWphdFKaOIBIKWMxfNAFqXZQx/qHcrwb5Ylj9uag7s=";
    };
  
 -  buildShell = src: buildGoModule {
-+  gitsrht-shell = buildGoModule {
++  gitApi = buildGoModule ({
      inherit src version;
-+    sourceRoot = "source/gitsrht-shell";
-     pname = "gitsrht-shell";
-     vendorSha256 = "sha256-aqUFICp0C2reqb2p6JCPAUIRsxzSv0t9BHoNWrTYfqk=";
-   };
+-    pname = "gitsrht-shell";
+-    vendorSha256 = "sha256-aqUFICp0C2reqb2p6JCPAUIRsxzSv0t9BHoNWrTYfqk=";
+-  };
++    pname = "gitsrht-api";
++    modRoot = "api";
++    vendorSha256 = "sha256-0YI20liP0X1McfiSUy29zJk2UqqAPBIfIfPLoJOE1uI=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
  
 -  buildDispatcher = src: buildGoModule {
-+  gitsrht-dispatch = buildGoModule {
++  gitDispatch = buildGoModule {
      inherit src version;
 -    pname = "gitsrht-dispatcher";
-+    sourceRoot = "source/gitsrht-dispatch";
 +    pname = "gitsrht-dispatch";
++    modRoot = "gitsrht-dispatch";
      vendorSha256 = "sha256-qWXPHo86s6iuRBhRMtmD5jxnAWKdrWHtA/iSUkdw89M=";
-+    patches = [
-+      # Add support for supplementary groups
-+      patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
-+    ];
-+    patchFlags = ["-p2"];
    };
  
 -  buildKeys = src: buildGoModule {
-+  gitsrht-keys = buildGoModule {
++  gitKeys = buildGoModule {
      inherit src version;
-+    sourceRoot = "source/gitsrht-keys";
      pname = "gitsrht-keys";
--    vendorSha256 = "1d94cqy7x0q0agwg515xxsbl70b3qrzxbzsyjhn1pbyj532brn7f";
-+    vendorSha256 = "sha256-SOI7wimFthY+BwsDtMuyqKS1hCaEa3R90Q0qaA9boyE=";
-+
-+    # What follows is only to update go-redis,
-+    # and thus also using a patched srht-keys.
-+    # go.{mod,sum} could be patched directly but that would be less resilient
-+    # to changes from upstream, and thus harder to maintain the patching
-+    # while it hasn't been merged upstream.
-+
-+    overrideModAttrs = _: {
-+      preBuild = ''
-+        # This is a fixed-output derivation so it is not allowed to reference other derivations,
-+        # but here srht-keys will be copied to vendor/ by go mod vendor
-+        ln -s ${srht-keys} srht-keys
-+        go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys=$PWD/srht-keys
-+        go get github.com/go-redis/redis/v8
-+        go get github.com/go-redis/redis@none
-+        go mod tidy
-+      '';
-+      # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
-+      postInstall = ''
-+        cp --reflink=auto go.* $out/
-+      '';
-+    };
-+
-+    patches = [
-+      # Update go-redis to support Unix sockets
-+      patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
-+    ];
-+    patchFlags = ["-p2"];
-+    postConfigure = ''
-+      cp -v vendor/go.{mod,sum} .
-+    '';
++    modRoot = "gitsrht-keys";
+     vendorSha256 = "sha256-9pojS69HCKVHUceyOpGtv9ewcxFD4WsOVsEzkmWJkF4=";
    };
  
 -  buildUpdateHook = src: buildGoModule {
-+  gitsrht-update-hook = buildGoModule {
++  gitShell = buildGoModule {
      inherit src version;
-+    sourceRoot = "source/gitsrht-update-hook";
-     pname = "gitsrht-update-hook";
--    vendorSha256 = "0fwzqpjv8x5y3w3bfjd0x0cvqjjak23m0zj88hf32jpw49xmjkih";
--  };
-+    vendorSha256 = "sha256-L/tGwbBSwhtGhHcinCK/0lsp1ffXjiHXCmGgsY9s2Nc=";
+-    pname = "gitsrht-update-hook";
+-    vendorSha256 = "sha256-sBlG7EFqdDm7CkAHVX50Mf4N3sl1rPNmWExG/bfbfGA=";
++    pname = "gitsrht-shell";
++    modRoot = "gitsrht-shell";
++    vendorSha256 = "sha256-WqfvSPuVsOHA//86u33atMfeA11+DJhjLmWy8Ivq0NI=";
+   };
  
 -  updateHook = buildUpdateHook "${src}/gitsrht-update-hook";
-+    # What follows is only to update go-redis
-+    # and thus also using a patched srht-keys.
-+
-+    overrideModAttrs = old: {
-+      preBuild = ''
-+        # This is a fixed-output derivation so it is not allowed to reference other derivations,
-+        # but here srht-keys will be copied to vendor/ by go mod vendor
-+        ln -s ${srht-keys} srht-keys
-+        go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys=$PWD/srht-keys
-+        go get github.com/go-redis/redis/v8
-+        go get github.com/go-redis/redis@none
-+        go mod tidy
-+      '';
-+      # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
-+      postInstall = ''
-+        cp --reflink=auto go.* $out/
-+      '';
-+    };
-+
-+    patches = [
-+      # Update go-redis to support Unix sockets
-+      patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
-+    ];
-+    patchFlags = ["-p2"];
-+    postConfigure = ''
-+      cp -v vendor/go.{mod,sum} .
-+    '';
++  gitUpdateHook = buildGoModule {
++    inherit src version;
++    pname = "gitsrht-update-hook";
++    modRoot = "gitsrht-update-hook";
++    vendorSha256 = "sha256-Bc3yPabS2S+qiroHFKrtkII/CfzBDYQ6xWxKHAME+Tc=";
 +  };
  
  in
  buildPythonPackage rec {
-@@ -63,19 +130,21 @@ buildPythonPackage rec {
+   inherit src version;
+   pname = "gitsrht";
+-  patches = [
+-    # Revert change breaking Unix socket support for Redis
+-    patches/redis-socket/git/0001-Revert-Add-webhook-queue-monitoring.patch
+-  ];
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api gitsrht-dispatch gitsrht-keys gitsrht-shell gitsrht-update-hook" ""
++  '';
+   nativeBuildInputs = srht.nativeBuildInputs;
+@@ -68,14 +78,12 @@ buildPythonPackage rec {
  
    postInstall = ''
      mkdir -p $out/bin
@@ -4959,3007 +2172,713 @@ index e44fb9cd6c6..05fbdfb6098 100644
 -    cp ${buildDispatcher "${src}/gitsrht-dispatch"}/bin/gitsrht-dispatch $out/bin/gitsrht-dispatch
 -    cp ${buildKeys "${src}/gitsrht-keys"}/bin/gitsrht-keys $out/bin/gitsrht-keys
 -    cp ${updateHook}/bin/gitsrht-update-hook $out/bin/gitsrht-update-hook
-+    cp ${gitsrht-shell}/bin/gitsrht-shell $out/bin/gitsrht-shell
-+    cp ${gitsrht-dispatch}/bin/gitsrht-dispatch $out/bin/gitsrht-dispatch
-+    cp ${gitsrht-keys}/bin/gitsrht-keys $out/bin/gitsrht-keys
-+    cp ${gitsrht-update-hook}/bin/gitsrht-update-hook $out/bin/gitsrht-update-hook
++    ln -s ${gitApi}/bin/api $out/bin/gitsrht-api
++    ln -s ${gitDispatch}/bin/gitsrht-dispatch $out/bin/gitsrht-dispatch
++    ln -s ${gitKeys}/bin/gitsrht-keys $out/bin/gitsrht-keys
++    ln -s ${gitShell}/bin/gitsrht-shell $out/bin/gitsrht-shell
++    ln -s ${gitUpdateHook}/bin/gitsrht-update-hook $out/bin/gitsrht-update-hook
    '';
-   passthru = {
+-  passthru = {
 -    inherit updateHook;
-+    inherit gitsrht-shell gitsrht-dispatch gitsrht-keys gitsrht-update-hook;
-   };
+-  };
+   pythonImportsCheck = [ "gitsrht" ];
  
-+  pythonImportsCheck = [ "gitsrht" ];
-+
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/git.sr.ht";
-     description = "Git repository hosting service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/hg.nix b/pkgs/applications/version-management/sourcehut/hg.nix
-index cddb76cabf2..fe325760885 100644
+index f3e778b2f31..2aa4cc2c505 100644
 --- a/pkgs/applications/version-management/sourcehut/hg.nix
 +++ b/pkgs/applications/version-management/sourcehut/hg.nix
-@@ -10,12 +10,12 @@
+@@ -1,21 +1,41 @@
+ { lib
+ , fetchhg
++, buildGoModule
+ , buildPythonPackage
+ , srht
+ , hglib
+ , scmsrht
+ , unidiff
+ , python
++, unzip
+ }:
  
  buildPythonPackage rec {
    pname = "hgsrht";
--  version = "0.27.4";
-+  version = "0.29.1";
+-  version = "0.29.4";
++  version = "0.31.2";
  
    src = fetchhg {
      url = "https://hg.sr.ht/~sircmpwn/hg.sr.ht";
      rev = version;
--    sha256 = "1c0qfi0gmbfngvds6917fy9ii2iglawn429757rh7b4bvzn7n6mr";
-+    sha256 = "WgL4PDyUz+yfB4cAjBK2JcFfh5CbAW83c0zdHIvwLIA=";
+-    sha256 = "Jn9M/R5tJK/GeJDWGo3LWCK2nwsfI9zh+/yo2M+X6Sk=";
++    sha256 = "F0dBykSSrlis+mumULLxvKNxD75DWR9+IDTYbmhkMDI=";
++  };
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api hgsrht-keys" ""
++  '';
++
++  hgsrht-api = buildGoModule ({
++    inherit src version;
++    pname = "hgsrht-api";
++    modRoot = "api";
++    vendorSha256 = "sha256-W7A22qSIgJgcfS7xYNrmbYKaZBXbDtPilM9I6DxmTeU=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
++
++  hgsrht-keys = buildGoModule {
++    inherit src version;
++    pname = "hgsrht-keys";
++    modRoot = "hgsrht-keys";
++    vendorSha256 = "sha256-7ti8xCjSrxsslF7/1X/GY4FDl+69hPL4UwCDfjxmJLU=";
    };
  
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -32,10 +32,12 @@ buildPythonPackage rec {
+@@ -32,6 +52,11 @@ buildPythonPackage rec {
      export SRHT_PATH=${srht}/${python.sitePackages}/srht
    '';
  
-+  pythonImportsCheck = [ "hgsrht" ];
++  postInstall = ''
++    ln -s ${hgsrht-api}/bin/api $out/bin/hgsrht-api
++    ln -s ${hgsrht-keys}/bin/hgsrht-keys $out/bin/hgsrht-keys
++  '';
 +
+   pythonImportsCheck = [ "hgsrht" ];
    meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/hg.sr.ht";
-     description = "Mercurial repository hosting service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/hub.nix b/pkgs/applications/version-management/sourcehut/hub.nix
-index 17cb3fe4b61..3447531bb25 100644
+index 511ec359fc4..75d9efe5bd9 100644
 --- a/pkgs/applications/version-management/sourcehut/hub.nix
 +++ b/pkgs/applications/version-management/sourcehut/hub.nix
 @@ -6,13 +6,13 @@
  
  buildPythonPackage rec {
    pname = "hubsrht";
--  version = "0.13.1";
-+  version = "0.14.1";
+-  version = "0.14.4";
++  version = "0.14.14";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "hub.sr.ht";
      rev = version;
--    sha256 = "sha256-Kqzy4mh5Nn1emzHBco/LVuXro/tW3NX+OYqdEwBSQ/U=";
-+    sha256 = "sha256-IWaNsmHreLIklDrdtWv3JQJA+0p0rCT10cjevG05We4=";
+-    sha256 = "sha256-7HF+jykWGqzPWA0YtJZQZU7pnID1yexcqLkEf2HpnSs=";
++    sha256 = "sha256-4n6oQ+AAvdJY/5KflxAp62chjyrlSUkmt319DKZk33w=";
    };
  
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -26,11 +26,12 @@ buildPythonPackage rec {
-   '';
-   dontUseSetuptoolsCheck = true;
-+  pythonImportsCheck = [ "hubsrht" ];
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/hub.sr.ht";
-     description = "Project hub service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/lists.nix b/pkgs/applications/version-management/sourcehut/lists.nix
-index b419b49f7b5..2dcea79b83a 100644
+index 3ba6375a913..b9a00ffd213 100644
 --- a/pkgs/applications/version-management/sourcehut/lists.nix
 +++ b/pkgs/applications/version-management/sourcehut/lists.nix
-@@ -12,13 +12,13 @@
+@@ -1,5 +1,6 @@
+ { lib
+ , fetchFromSourcehut
++, buildGoModule
+ , buildPythonPackage
+ , srht
+ , asyncpg
+@@ -8,23 +9,31 @@
+ , emailthreads
+ , redis
+ , python
++, unzip
+ }:
  
  buildPythonPackage rec {
    pname = "listssrht";
--  version = "0.48.19";
-+  version = "0.50.5";
+-  version = "0.51.7";
++  version = "0.51.10";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "lists.sr.ht";
      rev = version;
--    sha256 = "sha256-bsakEMyvWaxiE4/SGcAP4mlGG9jkdHfFxpt9H+TJn/8=";
-+    sha256 = "sha256-6jFG2D7lIPHoenW9Nhj/24mlszO3i0xVpj6jFDTKOVg=";
+-    sha256 = "sha256-oNY5A98oVoL2JKO0fU/8YVl8u7ywmHb/RHD8A6z9yIM=";
++    sha256 = "sha256-f8KvMctDva31W5c6uAIDDZ0eUrRL5ha10ew2pLEnJtw=";
    };
  
+-  patches = [
+-    # Revert change breaking Unix socket support for Redis
+-    patches/redis-socket/lists/0001-Revert-Add-webhook-queue-monitoring.patch
+-  ];
++  listssrht-api = buildGoModule ({
++    inherit src version;
++    pname = "listssrht-api";
++    modRoot = "api";
++    vendorSha256 = "sha256-xnmMkRSokbhWD+kz0XQ9AinYdm6/50FRBISURPvlzD0=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
++
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api" ""
++  '';
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -37,10 +37,12 @@ buildPythonPackage rec {
+@@ -42,6 +51,10 @@ buildPythonPackage rec {
      export SRHT_PATH=${srht}/${python.sitePackages}/srht
    '';
  
-+  pythonImportsCheck = [ "listssrht" ];
++  postInstall = ''
++    ln -s ${listssrht-api}/bin/api $out/bin/listssrht-api
++  '';
 +
+   pythonImportsCheck = [ "listssrht" ];
    meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/lists.sr.ht";
-     description = "Mailing list service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/man.nix b/pkgs/applications/version-management/sourcehut/man.nix
-index bd331f000a7..2d4d152e3aa 100644
+index 8d43f297a4f..ccee76defde 100644
 --- a/pkgs/applications/version-management/sourcehut/man.nix
 +++ b/pkgs/applications/version-management/sourcehut/man.nix
 @@ -8,13 +8,13 @@
  
  buildPythonPackage rec {
    pname = "mansrht";
--  version = "0.15.12";
-+  version = "0.15.22";
+-  version = "0.15.23";
++  version = "0.15.25";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "man.sr.ht";
      rev = version;
--    sha256 = "sha256-MqH/8K9XRvEg6P7GHE6XXtWnhDP3wT8iGoNaFtYQbio=";
-+    sha256 = "sha256-curouf+eNCKprDI23blGs4AzJMry6zlCLDt/+0j5c8A=";
+-    sha256 = "sha256-xrBptXdwMee+YkPup/BYL/iXBhCzSUQ5htSHIw/1Ncc=";
++    sha256 = "sha256-Mq3IHsqSkFHVdmy3g0E+9oLnKORthgv3lqvWyrKMIuU=";
    };
  
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -29,10 +29,12 @@ buildPythonPackage rec {
-     export SRHT_PATH=${srht}/${python.sitePackages}/srht
-   '';
-+  pythonImportsCheck = [ "mansrht" ];
-+
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/man.sr.ht";
-     description = "Wiki service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/meta.nix b/pkgs/applications/version-management/sourcehut/meta.nix
-index 86d293973d7..243a3ffcbbc 100644
+index ab19cc88d25..896279addd3 100644
 --- a/pkgs/applications/version-management/sourcehut/meta.nix
 +++ b/pkgs/applications/version-management/sourcehut/meta.nix
-@@ -16,21 +16,45 @@
+@@ -16,32 +16,34 @@
  , weasyprint
  , prometheus-client
  , python
-+, core-go
++, unzip
  }:
  let
--  version = "0.53.14";
-+  version = "0.56.24";
+-  version = "0.57.5";
++  version = "0.58.8";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "meta.sr.ht";
      rev = version;
--    sha256 = "sha256-/+r/XLDkcSTW647xPMh5bcJmR2xZNNH74AJ5jemna2k=";
-+    sha256 = "sha256-ANRE63IR/Qv1dEX+5qR4pr1Af85KyV6h8oLXP266Q/Y=";
+-    sha256 = "sha256-qsCwZaCiqvY445U053OCWD98jlIUi9NB2jWVP2oW3Vk=";
++    sha256 = "sha256-lnEt5UoQBd5qlkD+nE6KL5DP4jf1FrAjgA06/mgRxTs=";
    };
  
 -  buildApi = src: buildGoModule {
-+  metasrht-api = buildGoModule {
++  metasrht-api = buildGoModule ({
      inherit src version;
-+    sourceRoot = "source/api";
      pname = "metasrht-api";
--    vendorSha256 = "sha256-eZyDrr2VcNMxI++18qUy7LA1Q1YDlWCoRtl00L8lfR4=";
-+    vendorSha256 = "sha256-LnqH8dwVt8+yabjn0WLGhI3Iz+tV1/8aA1HcXXnupmM=";
-+    overrideModAttrs = _: {
-+      preBuild = ''
-+        # This is a fixed-output derivation so it is not allowed to reference other derivations,
-+        # but here core-go will be copied to vendor/ by go mod vendor
-+        ln -s ${core-go} core-go
-+        go mod edit -replace git.sr.ht/~sircmpwn/scm.sr.ht/core-go=$PWD/core-go
-+        go mod tidy
-+      '';
-+      # Pass updated go.{mod,sum} from go-modules to gitsrht-keys' vendor/go.{mod,sum}
-+      postInstall = ''
-+        cp --reflink=auto go.* $out/
-+      '';
-+    };
-+
-+    patches = [
-+      # Replace x/crypto package by ProtonMail/go-crypto to support ed25519 OpenPGP keys
-+      patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-+    ];
-+    patchFlags = ["-p2"];
-+    postConfigure = ''
-+      cp -v vendor/go.{mod,sum} .
-+    '';
-   };
+-    vendorSha256 = "sha256-8Ubrr9qRlgW2wsLHrPHwulSWLz+gp4VPcTvOZpg8TYM=";
+-  };
++    modRoot = "api";
++    vendorSha256 = "sha256-3s9PYUy4qS06zyTIRDvnAmhfrjVLBa/03Nu3tMcIReI=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
  
  in
-@@ -63,13 +87,18 @@ buildPythonPackage rec {
+ buildPythonPackage rec {
+   pname = "metasrht";
+   inherit version src;
+-  patches = [
+-    # Revert change breaking Unix socket support for Redis
+-    patches/redis-socket/meta/0001-Revert-Add-webhook-queue-monitoring.patch
+-  ];
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api" ""
++  '';
+   nativeBuildInputs = srht.nativeBuildInputs;
+@@ -68,7 +70,7 @@ buildPythonPackage rec {
  
    postInstall = ''
      mkdir -p $out/bin
 -    cp ${buildApi "${src}/api/"}/bin/api $out/bin/metasrht-api
-+    cp ${metasrht-api}/bin/api $out/bin/metasrht-api
++    ln -s ${metasrht-api}/bin/api $out/bin/metasrht-api
    '';
-+  passthru = {
-+    inherit metasrht-api;
-+  };
-+
-+  pythonImportsCheck = [ "metasrht" ];
  
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/meta.sr.ht";
-     description = "Account management service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
+   pythonImportsCheck = [ "metasrht" ];
 diff --git a/pkgs/applications/version-management/sourcehut/pages.nix b/pkgs/applications/version-management/sourcehut/pages.nix
-new file mode 100644
-index 00000000000..c49e49c2664
---- /dev/null
+index b6a18b5bda7..faa6dbb4d49 100644
+--- a/pkgs/applications/version-management/sourcehut/pages.nix
 +++ b/pkgs/applications/version-management/sourcehut/pages.nix
-@@ -0,0 +1,30 @@
-+{ lib
-+, fetchFromSourcehut
-+, buildGoModule
-+}:
-+
-+buildGoModule rec {
-+  pname = "pagessrht";
-+  version = "0.5.1";
-+
-+  src = fetchFromSourcehut {
-+    owner = "~sircmpwn";
-+    repo = "pages.sr.ht";
-+    rev = version;
-+    sha256 = "sha256-Cab8zx+9WHHAB1rBoyZACq7lx9JdRBGzI1H+Yu9qHfs=";
-+  };
-+
-+  vendorSha256 = "sha256-udr+1y5ApQCSPhs3yQTTi9QfzRbz0A9COYuFMjQGa74=";
-+
-+  postInstall = ''
-+    mkdir -p $out/share/sql/
-+    cp -r -t $out/share/sql/ schema.sql migrations
-+  '';
-+
-+  meta = with lib; {
-+    homepage = "https://git.sr.ht/~sircmpwn/pages.sr.ht";
-+    description = "Web hosting service for the sr.ht network";
-+    license = licenses.agpl3Only;
-+    maintainers = with maintainers; [ eadwu ];
-+  };
-+}
+@@ -1,20 +1,21 @@
+ { lib
+ , fetchFromSourcehut
+ , buildGoModule
++, unzip
+ }:
+-buildGoModule rec {
++buildGoModule (rec {
+   pname = "pagessrht";
+-  version = "0.6.2";
++  version = "0.7.3";
+   src = fetchFromSourcehut {
+     owner = "~sircmpwn";
+     repo = "pages.sr.ht";
+     rev = version;
+-    sha256 = "sha256-ob0+t9V2o8lhVC6fXbi1rNm0Mnbs+GoyAmhBqVZ13PA=";
++    sha256 = "sha256-fHhf4VQ82/k4g8pzyuN9Pr2f8mxT8zw+2Nq0nw1Msks=";
+   };
+-  vendorSha256 = "sha256-b0sHSH0jkKoIVq045N96wszuLJDegkkj0v50nuDFleU=";
++  vendorSha256 = "sha256-/+XVl6PZUMOZIiuO6vEu0dacefz2hDSObaP8JsItSTw=";
+   postInstall = ''
+     mkdir -p $out/share/sql/
+@@ -27,4 +28,6 @@ buildGoModule rec {
+     license = licenses.agpl3Only;
+     maintainers = with maintainers; [ eadwu ];
+   };
+-}
++  # There is no ./loaders but this does not cause troubles
++  # to go generate
++} // import ./fix-gqlgen-trimpath.nix {inherit unzip;})
 diff --git a/pkgs/applications/version-management/sourcehut/paste.nix b/pkgs/applications/version-management/sourcehut/paste.nix
-index 0d8c9135493..c411f8e8c95 100644
+index c411f8e8c95..fbbc5fcd6a9 100644
 --- a/pkgs/applications/version-management/sourcehut/paste.nix
 +++ b/pkgs/applications/version-management/sourcehut/paste.nix
 @@ -8,13 +8,13 @@
  
  buildPythonPackage rec {
    pname = "pastesrht";
--  version = "0.12.1";
-+  version = "0.13.6";
+-  version = "0.13.6";
++  version = "0.13.7";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "paste.sr.ht";
      rev = version;
--    sha256 = "sha256-QQhd2LeH9BLmlHilhsv+9fZ+RPNmEMSmOpFA3dsMBFc=";
-+    sha256 = "sha256-Khcqk86iD9nxiKXN3+8mSLNoDau2qXNFOrLdkVu+rH8=";
+-    sha256 = "sha256-Khcqk86iD9nxiKXN3+8mSLNoDau2qXNFOrLdkVu+rH8=";
++    sha256 = "sha256-EzcS6Zbh+wJinC/GKJOSWUPORODpKEA3tLpLGqoVGBU=";
    };
  
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -29,10 +29,12 @@ buildPythonPackage rec {
-     export SRHT_PATH=${srht}/${python.sitePackages}/srht
-   '';
-+  pythonImportsCheck = [ "pastesrht" ];
-+
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/paste.sr.ht";
-     description = "Ad-hoc text file hosting service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
-diff --git a/pkgs/applications/version-management/sourcehut/disable-npm-install.patch b/pkgs/applications/version-management/sourcehut/patches/disable-npm-install.patch
-similarity index 100%
-rename from pkgs/applications/version-management/sourcehut/disable-npm-install.patch
-rename to pkgs/applications/version-management/sourcehut/patches/disable-npm-install.patch
-diff --git a/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-new file mode 100644
-index 00000000000..bb4deb35a26
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/core-go/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-@@ -0,0 +1,953 @@
-+From cadb1eab7bd39aa47e5e6e3bd7a70fc582793a7d Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Sat, 4 Dec 2021 13:37:47 +0100
-+Subject: [PATCH core-go] Replace x/crypto package by ProtonMail/go-crypto to
-+ support ed25519 OpenPGP keys
-+
-+---
-+ email/worker.go |   2 +-
-+ go.mod          |  21 +-
-+ go.sum          | 642 +++++-------------------------------------------
-+ 3 files changed, 68 insertions(+), 597 deletions(-)
-+
-+diff --git a/email/worker.go b/email/worker.go
-+index 437864f..57f0b33 100644
-+--- a/email/worker.go
-++++ b/email/worker.go
-+@@ -16,7 +16,7 @@ import (
-+      _ "github.com/emersion/go-message/charset"
-+      "github.com/emersion/go-message/mail"
-+      "github.com/emersion/go-pgpmail"
-+-     "golang.org/x/crypto/openpgp"
-++     "github.com/ProtonMail/go-crypto/openpgp"
-+ 
-+      "git.sr.ht/~sircmpwn/core-go/config"
-+ )
-+diff --git a/go.mod b/go.mod
-+index c94fcd4..b542689 100644
-+--- a/go.mod
-++++ b/go.mod
-+@@ -6,31 +6,28 @@ require (
-+      git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3
-+      git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3
-+      git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917
-+-     github.com/99designs/gqlgen v0.13.0
-++     github.com/99designs/gqlgen v0.14.0
-+      github.com/DATA-DOG/go-sqlmock v1.5.0
-+      github.com/Masterminds/squirrel v1.4.0
-+-     github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd
-+-     github.com/emersion/go-pgpmail v0.1.0
-++     github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3
-++     github.com/emersion/go-message v0.15.0
-++     github.com/emersion/go-pgpmail v0.2.0
-+      github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
-+      github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7
-+-     github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect
-+      github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001
-+      github.com/go-chi/chi v4.1.2+incompatible
-+-     github.com/go-kit/kit v0.10.0 // indirect
-+-     github.com/go-redis/redis/v8 v8.2.3
-+-     github.com/golang/protobuf v1.5.2 // indirect
-++     github.com/go-redis/redis/v8 v8.11.4
-+      github.com/google/uuid v1.0.0
-++     github.com/hashicorp/golang-lru v0.5.1 // indirect
-+      github.com/kavu/go_reuseport v1.5.0
-+      github.com/lib/pq v1.8.0
-+-     github.com/martinlindhe/base36 v1.1.0
-+-     github.com/prometheus/client_golang v1.11.0
-+-     github.com/prometheus/common v0.30.0 // indirect
-++     github.com/mitchellh/mapstructure v1.1.2 // indirect
-++     github.com/prometheus/client_golang v1.7.1
-+      github.com/prometheus/procfs v0.7.3 // indirect
-+      github.com/stretchr/testify v1.6.1
-+      github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
-+      github.com/vektah/gqlparser v1.3.1
-+-     github.com/vektah/gqlparser/v2 v2.1.0
-+-     golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
-++     github.com/vektah/gqlparser/v2 v2.2.0
-+      golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
-+      google.golang.org/protobuf v1.27.1 // indirect
-+ )
-+diff --git a/go.sum b/go.sum
-+index b2481e7..ca76d28 100644
-+--- a/go.sum
-++++ b/go.sum
-+@@ -1,297 +1,114 @@
-+-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-+-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-+-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-+-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-+-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-+-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-+-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-+-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-+-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-+-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-+-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-+-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-+-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-+-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-+-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-+-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-+-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-+-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-+-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-+-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-+-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-+-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-+-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-+-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-+-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-+-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-+-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-+-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-+-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-+-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-+-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-+-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-+-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201002192337-cc78e95c493c h1:DHYVIt2TT6Nx+CK78om/isyzUp8ZCcGAs8lofsR8EAA=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201002192337-cc78e95c493c/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201006201820-f2599e406ecb h1:2Yodrugga89JpSewI+TOj4zUOeujnDdpIAvC91qIpys=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201006201820-f2599e406ecb/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009194917-181b76f9491b h1:7tYMLNLFAjN3R+Q2mRGjQ4TDbYHUdoMmqlTB9++gTB0=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009194917-181b76f9491b/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009195117-58f54dd4c3e8 h1:MSiW/2sDb2KjidhG/orqaQZfu0bpQcKr9Sbu8aRqS9o=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201009195117-58f54dd4c3e8/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201013160733-35ca012e4dc8 h1:ltrdYYclC4wQEg3QdcG2hgYAFCk+6/l2vU1OXygKXVA=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20201013160733-35ca012e4dc8/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+ git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3 h1:9WCv5cK67s2SiY/R4DWT/OchEsFnfYDz3lbevKxZ4QI=
-+ git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20210820135308-520d48c60a15 h1:6iFAymJT/Ozo0ReU2Bjz1ZA/jmUm+1H/mk7G6TUg6qQ=
-+-git.sr.ht/~sircmpwn/dowork v0.0.0-20210820135308-520d48c60a15/go.mod h1:8neHEO3503w/rNtttnR0JFpQgM/GFhaafVwvkPsFIDw=
-+ git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3 h1:4wDp4BKF7NQqoh73VXpZsB/t1OEhDpz/zEpmdQfbjDk=
-+ git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
-+-git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018 h1:89QMorzx6ML69PKPoayL3HuSfb7WqAlxD1dZ7DyzD0k=
-+-git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
-+ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 h1:/pfEvB399XDXksu4vyjfNTytWn/nbbKiNhvjtpgc4pY=
-+ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
-+-github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
-+-github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
-++github.com/99designs/gqlgen v0.14.0 h1:Wg8aNYQUjMR/4v+W3xD+7SizOy6lSvVeQ06AobNQAXI=
-++github.com/99designs/gqlgen v0.14.0/go.mod h1:S7z4boV+Nx4VvzMUpVrY/YuHjFX4n7rDyuTqvAkuoRE=
-+ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-+-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-+ github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
-+ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-+-github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-+ github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
-+ github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA=
-+-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-+-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-+-github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
-+-github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
-++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g=
-++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
-+ github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
-+-github.com/agnivade/levenshtein v1.0.3 h1:M5ZnqLOoZR8ygVq0FfkXsNOKzMCk0xRiow0R5+5VkQ0=
-+-github.com/agnivade/levenshtein v1.0.3/go.mod h1:4SFRZbbXWLF4MU1T9Qg0pGgH3Pjs+t6ie5efyrwRJXs=
-++github.com/agnivade/levenshtein v1.1.0 h1:n6qGwyHG61v3ABce1rPVZklEYRT8NFpCMrpZdBUbYGM=
-++github.com/agnivade/levenshtein v1.1.0/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
-+ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-+ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-+ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-+ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-+-github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-++github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
-+ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-+-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-+-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-++github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
-+ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
-+-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-+-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-+-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-+-github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
-+-github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
-+-github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-+-github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-+ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-+ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-+ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-+ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-+-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-+-github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
-+-github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-+-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-+-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
-+ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-+-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-+-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-+-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-+-github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
-+-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-+-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-+-github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
-+-github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-+-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-+-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-+-github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-++github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
-++github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-+ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-+-github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-+ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-+ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-+ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-+-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-+ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
-+ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-+-github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
-+-github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-+-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-+-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-+-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-+-github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-+-github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
-+-github.com/emersion/go-message v0.12.0 h1:mZnv35eZ6lB6EftTQBgYXspOH0FQdhpFhSUhA9i6/Zg=
-+-github.com/emersion/go-message v0.12.0/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
-+-github.com/emersion/go-message v0.12.1-0.20200903165315-e1abe21f389a h1:3C6qIGgPr1qAT0ikRD5NbyKpME/iHCDeXhpv/JJsFsE=
-+-github.com/emersion/go-message v0.12.1-0.20200903165315-e1abe21f389a/go.mod h1:kYIioST9GDHte9/BRWgi93rpqbDuFftMjKSMaXS8ABo=
-+-github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd h1:6CXxdoOzAyQForkd2U/JNceVyNpmg92alCU2R+4dwIY=
-+-github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd/go.mod h1:SXSs/8KamlsyxjpHL1Q3yf5Jrv7QG5icuvPK1SMcnzw=
-+-github.com/emersion/go-pgpmail v0.1.0 h1:+NuU9UtGnmmKvmI8evxmTAPXfUod6Gbf2uYT7rxTZ7w=
-+-github.com/emersion/go-pgpmail v0.1.0/go.mod h1:9Sy6uI+dlTN56tcWMtBQHqNDeea27xYItaiZ/3XC76g=
-++github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
-++github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
-++github.com/emersion/go-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY=
-++github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
-++github.com/emersion/go-pgpmail v0.2.0 h1:BU9kEGQcDVXi6n0v3JBsWAikyo63xsUGZ1lnVaWa6ks=
-++github.com/emersion/go-pgpmail v0.2.0/go.mod h1:8mQ8Rpn+w28DDaiP8HvJuZjSAymaWr87K3zA/bwwkU0=
-+ github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ=
-+ github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
-+-github.com/emersion/go-smtp v0.14.0 h1:RYW203p+EcPjL8Z/ZpT9lZ6iOc8MG1MQzEx1UKEkXlA=
-+-github.com/emersion/go-smtp v0.14.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
-+-github.com/emersion/go-smtp v0.15.0 h1:3+hMGMGrqP/lqd7qoxZc1hTU8LY8gHV9RFGWlqSDmP8=
-+-github.com/emersion/go-smtp v0.15.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
-+ github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7 h1:y2h9HJElyAP5kgYujXAJC1DvlcTgCUhtYr/BlXnlGfs=
-+ github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
-+-github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe h1:40SWqY0zE3qCi6ZrtTf5OUdNm5lDnGnjRSq9GgmeTrg=
-+-github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
-+ github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
-+ github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
-+-github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-+-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-+-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-+-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-+-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-+-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-+ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 h1:/UMxx5lGDg30aioUL9e7xJnbJfJeX7vhcm57fa5udaI=
-+ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfbpSMHwY503FclkV/lZTBh2YlOmLLSda12uL8c=
-+-github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
-+-github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
-+ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-+ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-+-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-+-github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-+ github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
-+ github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-+-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-+-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-+-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-+ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-+ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-+-github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
-+-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
-+ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-+ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-+-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-+-github.com/go-redis/redis/v8 v8.2.3 h1:eNesND+DWt/sjQOtPFxAbQkTIXaXX00qNLxjVWkZ70k=
-+-github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw=
-+-github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-++github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg=
-++github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
-+ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-+-github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
-+-github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-++github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-+ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-+-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-+-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-+-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-+-github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-+-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-+-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-+-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-+-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-+-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-+-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-++github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-+ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-+-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-+-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
-+ github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-+ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-+ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-+ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-+ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-+-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-+-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
-+ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-+-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-+ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-+ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-+ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-+-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-+-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-+-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-+-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-+ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-+ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-+ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-++github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
-++github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-+-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-+-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-+-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-+-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-+-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-+-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-+-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-+-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-+-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-+-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-+ github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
-+ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-+-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-+-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-+-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-+ github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-+-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-+ github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-+-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-+-github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-+-github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-+ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
-+ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-+-github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-+-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-+-github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-+-github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
-+-github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-+-github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-+-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-+-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-+-github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-+-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-+-github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-+-github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-+-github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-+-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-+-github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-+-github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-+-github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-+-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
-+ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-+ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
-+ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-+-github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-+-github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-+-github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-+-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-+ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-+-github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
-+-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-+-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-+-github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
-+-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-+-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-+-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-+ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-+-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+-github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+-github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-+-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-+-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-+ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-+-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-+ github.com/kavu/go_reuseport v1.5.0 h1:UNuiY2OblcqAtVDE8Gsg1kZz8zbBWg907sP1ceBV+bk=
-+ github.com/kavu/go_reuseport v1.5.0/go.mod h1:CG8Ee7ceMFSMnx/xr25Vm0qXaj2Z4i5PWoUx+JZ5/CU=
-+-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-++github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
-+ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-+ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-+-github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-+ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-++github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
-+ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-+ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-++github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-+ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-+ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
-+ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
-+@@ -299,31 +116,13 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR
-+ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
-+ github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
-+ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-+-github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
-+-github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-+ github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
-+-github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
-+-github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
-+-github.com/martinlindhe/base36 v1.1.0 h1:cIwvvwYse/0+1CkUPYH5ZvVIYG3JrILmQEIbLuar02Y=
-+-github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
-+ github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
-+-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-+ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-+-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-+-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-+ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-+ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-+-github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-+ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
-+ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-+-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-+-github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-+-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-+-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-+-github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
-+-github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-+-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+-github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047 h1:zCoDWFD5nrJJVjbXiDZcVhOBSzKn3o9LgRLLMRNuru8=
-+ github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-+ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+@@ -332,487 +131,162 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
-+ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-+ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-+ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-+-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-+-github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
-+-github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
-+-github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
-+-github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
-+-github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+-github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+-github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-+ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-+-github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
-+-github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
-+-github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-++github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-++github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-+ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-+-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-+-github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-+-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-++github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
-++github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-+ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-+ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-+-github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-+-github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
-+-github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
-++github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
-++github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-+ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
-+ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-+-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-+-github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
-+-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-+-github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-+-github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-+-github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
-+-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-+-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-+-github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
-+-github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
-+-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-+ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+-github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-+ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-+-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-+ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-+-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-+ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-+-github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
-+ github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
-+ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-+-github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
-+-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-+ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-+-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-+ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+-github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+ github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
-+ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+-github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-+ github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
-+ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-+-github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4=
-+-github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
-+-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-+-github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug=
-+-github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-+-github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-+-github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
-+ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-+-github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
-+-github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-+-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-+ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
-+ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-+-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-+-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-+-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-+ github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-+ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-+-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-+-github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
-+-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-+ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-++github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
-+ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-+ github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-+ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-+ github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
-+ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-+ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-+-github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-+-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-+-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-+-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-+-github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-+-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-+-github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-+-github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-+-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-+-github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
-+ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-+ github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-++github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-+ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
-+ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-+-github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-+-github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-+-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-+ github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
-+ github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=
-+ github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU=
-+ github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
-+-github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns=
-+-github.com/vektah/gqlparser/v2 v2.1.0/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms=
-+-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-+-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-++github.com/vektah/gqlparser/v2 v2.2.0 h1:bAc3slekAAJW6sZTi07aGq0OrfaCjj4jxARAaC7g2EM=
-++github.com/vektah/gqlparser/v2 v2.2.0/go.mod h1:i3mQIGIrbK2PD1RrCeMTlVbkF2FJ6WkU1KJlJlC+3F4=
-+ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-+-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-+-go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-+-go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-+-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+-go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-+-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-+-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-+-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-+-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-+-go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
-+-go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
-+-go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-+-go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-+-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-+-go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-+-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-+-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-+-go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-++github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-+ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-+-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-+ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-+-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+-golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
-+-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-+-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-+-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-+-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-+-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-+-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-+-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-+-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-+-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-+-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-+-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-+-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-+-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-+-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-+-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-+-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-+-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-+-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-+-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-+-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-+-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-+-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-+-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-+-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-+-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-+-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-+-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-+-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-++golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8=
-++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-+ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-+ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-+-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-+ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-+-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-+-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-+-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-++golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-++golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
-++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-+ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-++golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-+-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80=
-+ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf h1:AvBTl0xbF/KtHyvm61X4gSPF7/dKJ/xQqJwKr1Qu9no=
-+-golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM=
-+-golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs=
-+-golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-++golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-+ golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
-+ golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-+ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-+-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-+ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-+-golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e h1:0kyKOEC0chG7FKmnf/1uNwvDLc3NtNTRip2rXAN9nwI=
-+-golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-+-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
-+ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-+-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-+-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-+-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-+-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-+-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-++golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
-++golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-+ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-+-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-+-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-+-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-+-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-+-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-+-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-+ golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-+-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-+-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-+-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-+-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-+-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-+-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-+-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-+-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-+-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-+-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-+-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-+-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-+-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-+-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-+-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-++golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-++golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-++golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-+ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-+ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-+-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-+-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-+-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-+-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-+-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-+-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-+-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-+-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-+-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-+-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-+-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-+-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-+-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-+-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-+-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-+-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-+-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-+-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-+-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-+-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-+-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-+-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+-google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
-+-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-+-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-+-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-+-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-+-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-+-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-+-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-+-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-+-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-+-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-+-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-+-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-+-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-+-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-+-google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
-+-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-+-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-+-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-+-google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-+-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-+-google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-+-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-+-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-+-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-+-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-+-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-+-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-+-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-+-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-+ google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-+ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-+ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-+ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-+ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-+-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-+-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
-+ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-+-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-+-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-+-google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
-+-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-+ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-+ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-+ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
-+ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-+ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
-+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-+-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-++gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
-+ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-+-gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-+-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-+ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-+-gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
-+-gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
-+-gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
-+-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-+ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-+-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-+-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-+ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-++gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-+ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-+-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-+-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-+-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-+-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-+-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-+-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-+-sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
-+-sourcegraph.com/sourcegraph/appdash v0.0.0-20180110180208-2cc67fd64755/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
-+ sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
-+ sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k=
-+-- 
-+2.33.1
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-new file mode 100644
-index 00000000000..43edb9ccfe6
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/openpgp-ed25519/meta.sr.ht/0001-Replace-x-crypto-package-by-ProtonMail-go-crypto-to-.patch
-@@ -0,0 +1,526 @@
-+From 9d6325b1fc4b2cfda47421aa88f2e875ff413824 Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Sat, 4 Dec 2021 14:09:25 +0100
-+Subject: [PATCH meta.sr.ht] Replace x/crypto package by ProtonMail/go-crypto
-+ to support ed25519 OpenPGP keys
-+
-+---
-+ api/go.mod                    | 166 +++++++++++++++++++++++++++++++++-
-+ api/go.sum                    |  65 ++++++++++++-
-+ api/graph/schema.resolvers.go |   4 +-
-+ 3 files changed, 228 insertions(+), 7 deletions(-)
-+
-+diff --git a/api/go.mod b/api/go.mod
-+index f3c8f2f..bddd9b7 100644
-+--- a/api/go.mod
-++++ b/api/go.mod
-+@@ -3,18 +3,178 @@ module git.sr.ht/~sircmpwn/meta.sr.ht/api
-+ go 1.14
-+ 
-+ require (
-+-     git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee
-+-     github.com/99designs/gqlgen v0.13.0
-++     dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 // indirect
-++     git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 // indirect
-++     github.com/99designs/gqlgen v0.8.3
-++     github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 // indirect
-++     github.com/DATA-DOG/go-sqlmock v1.5.0 // indirect
-+      github.com/Masterminds/squirrel v1.4.0
-++     github.com/VividCortex/gohistogram v1.0.0 // indirect
-++     github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 // indirect
-++     github.com/agnivade/levenshtein v1.0.3 // indirect
-++     github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
-++     github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
-++     github.com/apache/thrift v0.13.0 // indirect
-++     github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e // indirect
-++     github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
-++     github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a // indirect
-++     github.com/aws/aws-lambda-go v1.13.3 // indirect
-++     github.com/aws/aws-sdk-go v1.27.0 // indirect
-++     github.com/aws/aws-sdk-go-v2 v0.18.0 // indirect
-++     github.com/beorn7/perks v1.0.1 // indirect
-++     github.com/casbin/casbin/v2 v2.1.2 // indirect
-++     github.com/cenkalti/backoff v2.2.1+incompatible // indirect
-++     github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect
-++     github.com/cespare/xxhash/v2 v2.1.1 // indirect
-++     github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec // indirect
-++     github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa // indirect
-++     github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect
-++     github.com/coreos/go-semver v0.2.0 // indirect
-++     github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 // indirect
-++     github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf // indirect
-++     github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
-++     github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
-++     github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 // indirect
-++     github.com/edsrzf/mmap-go v1.0.0 // indirect
-+      github.com/emersion/go-message v0.13.1-0.20201112194930-f77964fe28bd
-++     github.com/emersion/go-smtp v0.15.1-0.20211103212524-30169acc42e7 // indirect
-++     github.com/envoyproxy/go-control-plane v0.7.1 // indirect
-++     github.com/envoyproxy/protoc-gen-validate v0.1.0 // indirect
-++     github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 // indirect
-++     github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db // indirect
-++     github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 // indirect
-++     github.com/fsnotify/fsnotify v1.4.9 // indirect
-++     github.com/go-chi/chi v4.1.2+incompatible // indirect
-++     github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 // indirect
-++     github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 // indirect
-++     github.com/go-kit/kit v0.9.0 // indirect
-++     github.com/go-kit/log v0.1.0 // indirect
-++     github.com/gogo/googleapis v1.1.0 // indirect
-++     github.com/gogo/protobuf v1.2.1 // indirect
-++     github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
-++     github.com/golang/protobuf v1.5.2 // indirect
-++     github.com/google/btree v1.0.0 // indirect
-++     github.com/google/martian v2.1.0+incompatible // indirect
-++     github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 // indirect
-++     github.com/google/renameio v0.1.0 // indirect
-+      github.com/google/uuid v1.1.2
-++     github.com/googleapis/gax-go/v2 v2.0.5 // indirect
-++     github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect
-++     github.com/gorilla/mux v1.7.3 // indirect
-++     github.com/gorilla/websocket v1.4.2 // indirect
-++     github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect
-++     github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
-++     github.com/grpc-ecosystem/grpc-gateway v1.9.5 // indirect
-++     github.com/hashicorp/consul/sdk v0.3.0 // indirect
-++     github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
-++     github.com/hashicorp/go-msgpack v0.5.3 // indirect
-++     github.com/hashicorp/go-rootcerts v1.0.0 // indirect
-++     github.com/hashicorp/go-sockaddr v1.0.0 // indirect
-++     github.com/hashicorp/go-syslog v1.0.0 // indirect
-++     github.com/hashicorp/go-version v1.2.0 // indirect
-++     github.com/hashicorp/go.net v0.0.1 // indirect
-+      github.com/hashicorp/golang-lru v0.5.4 // indirect
-++     github.com/hashicorp/logutils v1.0.0 // indirect
-++     github.com/hashicorp/memberlist v0.1.0 // indirect
-++     github.com/hashicorp/serf v0.8.1 // indirect
-++     github.com/hudl/fargo v1.3.0 // indirect
-++     github.com/inconshreveable/mousetrap v1.0.0 // indirect
-++     github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d // indirect
-++     github.com/jonboulle/clockwork v0.1.0 // indirect
-++     github.com/jpillora/backoff v1.0.0 // indirect
-++     github.com/json-iterator/go v1.1.11 // indirect
-++     github.com/jstemmer/go-junit-report v0.9.1 // indirect
-++     github.com/jtolds/gls v4.20.0+incompatible // indirect
-++     github.com/julienschmidt/httprouter v1.3.0 // indirect
-++     github.com/kavu/go_reuseport v1.5.0 // indirect
-++     github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 // indirect
-+      github.com/kr/text v0.2.0 // indirect
-+      github.com/lib/pq v1.8.0
-++     github.com/lightstep/lightstep-tracer-go v0.16.0 // indirect
-++     github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 // indirect
-++     github.com/lyft/protoc-gen-validate v0.0.13 // indirect
-++     github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007 // indirect
-++     github.com/mattn/go-colorable v0.1.4 // indirect
-++     github.com/mattn/go-isatty v0.0.12 // indirect
-++     github.com/mattn/go-runewidth v0.0.2 // indirect
-++     github.com/miekg/dns v1.0.14 // indirect
-++     github.com/mitchellh/cli v1.0.0 // indirect
-++     github.com/mitchellh/gox v0.4.0 // indirect
-++     github.com/mitchellh/iochan v1.0.0 // indirect
-+      github.com/mitchellh/mapstructure v1.3.2 // indirect
-++     github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
-++     github.com/modern-go/reflect2 v1.0.1 // indirect
-++     github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
-++     github.com/nats-io/jwt v0.0.4 // indirect
-++     github.com/nats-io/nats.go v1.7.2 // indirect
-++     github.com/nats-io/nkeys v0.0.1 // indirect
-++     github.com/nats-io/nuid v1.0.1 // indirect
-+      github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354
-+      github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
-++     github.com/oklog/oklog v0.3.2 // indirect
-++     github.com/oklog/run v1.0.0 // indirect
-++     github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 // indirect
-++     github.com/onsi/ginkgo v1.12.1 // indirect
-++     github.com/onsi/gomega v1.10.0 // indirect
-++     github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 // indirect
-++     github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 // indirect
-++     github.com/opentracing/opentracing-go v1.1.0 // indirect
-++     github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5 // indirect
-++     github.com/openzipkin/zipkin-go v0.1.6 // indirect
-++     github.com/pact-foundation/pact-go v1.0.4 // indirect
-++     github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c // indirect
-++     github.com/pborman/uuid v1.2.0 // indirect
-++     github.com/performancecopilot/speed v3.0.0+incompatible // indirect
-++     github.com/pkg/errors v0.9.1 // indirect
-++     github.com/pkg/profile v1.2.1 // indirect
-++     github.com/prometheus/client_model v0.2.0 // indirect
-++     github.com/prometheus/procfs v0.7.3 // indirect
-++     github.com/rogpeppe/go-internal v1.3.0 // indirect
-++     github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f // indirect
-++     github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da // indirect
-++     github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
-++     github.com/sirupsen/logrus v1.6.0 // indirect
-++     github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect
-++     github.com/smartystreets/goconvey v1.6.3 // indirect
-++     github.com/soheilhy/cmux v0.1.4 // indirect
-++     github.com/sony/gobreaker v0.4.1 // indirect
-++     github.com/spf13/cobra v0.0.3 // indirect
-++     github.com/spf13/pflag v1.0.1 // indirect
-++     github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 // indirect
-++     github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a // indirect
-++     github.com/stretchr/objx v0.1.1 // indirect
-++     github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 // indirect
-++     github.com/urfave/cli/v2 v2.1.1 // indirect
-++     github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec // indirect
-++     github.com/vektah/gqlparser v1.3.1 // indirect
-+      github.com/vektah/gqlparser/v2 v2.1.0
-+-     golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
-++     github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
-++     github.com/yuin/goldmark v1.1.32 // indirect
-++     go.etcd.io/bbolt v1.3.3 // indirect
-++     go.opencensus.io v0.19.0 // indirect
-++     go.opentelemetry.io/otel v0.11.0 // indirect
-++     go.uber.org/atomic v1.4.0 // indirect
-++     go.uber.org/multierr v1.2.0 // indirect
-++     go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee // indirect
-++     go.uber.org/zap v1.11.0 // indirect
-++     golang.org/x/image v0.0.0-20190802002840-cff245a6509b // indirect
-++     golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 // indirect
-++     golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
-++     golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 // indirect
-++     golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
-++     golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
-++     google.golang.org/api v0.1.0 // indirect
-++     google.golang.org/appengine v1.6.0 // indirect
-++     google.golang.org/grpc v1.19.1 // indirect
-++     google.golang.org/protobuf v1.27.1 // indirect
-++     gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
-+      gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
-++     gopkg.in/cheggaaa/pb.v1 v1.0.25 // indirect
-++     gopkg.in/gcfg.v1 v1.2.3 // indirect
-++     gopkg.in/warnings.v0 v0.1.2 // indirect
-++     gopkg.in/yaml.v2 v2.4.0 // indirect
-++     rsc.io/binaryregexp v0.2.0 // indirect
-++     rsc.io/quote/v3 v3.1.0 // indirect
-++     sigs.k8s.io/yaml v1.1.0 // indirect
-++     sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 // indirect
-+ )
-+diff --git a/api/go.sum b/api/go.sum
-+index 2197d0b..7e8385f 100644
-+--- a/api/go.sum
-++++ b/api/go.sum
-+@@ -31,6 +31,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
-+ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-+ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-+ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-++git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-++git.apache.org/thrift.git v0.0.0-20181218151757-9b75e4fe745a/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-+ git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee h1:2ufYP6n7WnHo/5e0v3LHBsbbf2hktgrecpH9VOpAjbQ=
-+ git.sr.ht/~sircmpwn/core-go v0.0.0-20211129095809-31e77bac08ee/go.mod h1:Q2Ey8oZqoCnOsQ/SBpSeN+868Ji7iIwZ2Q3qxd61NRE=
-+ git.sr.ht/~sircmpwn/dowork v0.0.0-20210820133136-d3970e97def3 h1:9WCv5cK67s2SiY/R4DWT/OchEsFnfYDz3lbevKxZ4QI=
-+@@ -39,6 +41,7 @@ git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3 h1:4wDp4BKF7NQqoh7
-+ git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
-+ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917 h1:/pfEvB399XDXksu4vyjfNTytWn/nbbKiNhvjtpgc4pY=
-+ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210227202403-5dae5c48f917/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
-++github.com/99designs/gqlgen v0.8.3/go.mod h1:aLyJw9xUgdJxZ8EqNQxo2pGFhXXJ/hq8t7J4yn8TgI4=
-+ github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
-+ github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
-+ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-+@@ -48,6 +51,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
-+ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-+ github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
-+ github.com/Masterminds/squirrel v1.4.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA=
-++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3 h1:XcF0cTDJeiuZ5NU8w7WUDge0HRwwNRmxj/GGk6KSA6g=
-++github.com/ProtonMail/go-crypto v0.0.0-20211112122917-428f8eabeeb3/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
-+ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-+ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-+ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
-+@@ -123,6 +128,7 @@ github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:
-+ github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
-+ github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
-+ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-++github.com/envoyproxy/go-control-plane v0.7.1/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
-+ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-+ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-+ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-+@@ -163,6 +169,7 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er
-+ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-++github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
-+ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-+ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-+ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-+@@ -223,10 +230,13 @@ github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z
-+ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-+ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-+ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-++github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-+ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
-+ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-+ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-+ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-++github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-++github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-+ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-+ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
-+ github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-+@@ -248,7 +258,9 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l
-+ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
-+ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-+ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-++github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE=
-+ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-++github.com/hashicorp/serf v0.8.1/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
-+ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-+ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-+ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
-+@@ -287,6 +299,7 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm
-+ github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
-+ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-+ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
-++github.com/lightstep/lightstep-tracer-go v0.16.0/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI=
-+ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-+ github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
-+ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
-+@@ -320,10 +333,13 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
-+ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-+ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-++github.com/nats-io/jwt v0.0.4/go.mod h1:Zz0yk+BmWnLzEXz85TpyVuPCIzHNNAaQVZ3EiSlfhcs=
-+ github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
-+ github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
-+ github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
-++github.com/nats-io/nats.go v1.7.2/go.mod h1:yo+8b7YsyprMCRao9okCBtz4Gfr9nSmu5vdOjuV27BE=
-+ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
-++github.com/nats-io/nkeys v0.0.1/go.mod h1:/5AG7AMgoe6jJRxS8l8qz974c6zxp5ApcV7VkXwSciY=
-+ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-+@@ -343,6 +359,7 @@ github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
-+ github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-+ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-+ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-++github.com/onsi/gomega v1.10.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-+ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-+ github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
-+ github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-+@@ -351,7 +368,10 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go
-+ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
-+ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-+ github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-++github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5/go.mod h1:uVHyebswE1cCXr2A73cRM2frx5ld1RJUCJkFNZ90ZiI=
-+ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
-++github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-++github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-+ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-+ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-+ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
-+@@ -368,7 +388,9 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J
-+ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-+ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-++github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-+ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-++github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
-+ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-+ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-+ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
-+@@ -382,6 +404,9 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
-+ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+ github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
-+ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-++github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-++github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-++github.com/prometheus/common v0.0.0-20181218105931-67670fe90761/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-+ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-+@@ -389,7 +414,9 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
-+ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-+ github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug=
-+ github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-++github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-++github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-+ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-+@@ -415,6 +442,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
-+ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-+ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-+ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-++github.com/smartystreets/goconvey v1.6.3/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
-+ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-+ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-+ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-+@@ -438,7 +466,9 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
-+ github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
-++github.com/vektah/dataloaden v0.2.0/go.mod h1:vxM6NuRlgiR0M6wbVTJeKp9vQIs81ZMfCYO+4yq/jbE=
-+ github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=
-++github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
-+ github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU=
-+ github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
-+ github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns=
-+@@ -449,6 +479,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
-+ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-+ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-+ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
-++go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
-++go.opencensus.io v0.19.0/go.mod h1:AYeH0+ZxYyghG8diqaaIq/9P3VgCCt5GF2ldCY4dkFg=
-+ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-+@@ -459,11 +491,14 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-+ go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
-+ go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
-+ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-++go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-+ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-+ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-++go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-+ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
-+ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
-+ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-++go.uber.org/zap v1.11.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-+ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-+ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-+ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-+@@ -474,8 +509,10 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
-+ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
-+ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-++golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8=
-++golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-+ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-+ golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-+ golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-+@@ -488,7 +525,9 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
-+ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-+ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-+ golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-++golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-+ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-++golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-+ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-+ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-+ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-+@@ -506,12 +545,15 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
-+ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-+ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-+ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-++golang.org/x/net v0.0.0-20180404174746-b3c676e531a6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-++golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-++golang.org/x/net v0.0.0-20181217023233-e147a9138326/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+@@ -541,9 +583,12 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
-+ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-+-golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
-++golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-+ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
-++golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-+ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-++golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-+ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-+@@ -566,6 +611,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
-+ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-++golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+@@ -606,8 +652,10 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
-+ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-++golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-+ golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55 h1:rw6UNGRMfarCepjI8qOepea/SXwIBVfTKjztZ5gBbq4=
-+ golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-++golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
-+ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-+ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+@@ -624,6 +672,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
-+ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-++golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-+ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-+@@ -675,6 +724,9 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
-+ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-+ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-++google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-++google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
-+ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-+ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-+ google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-+@@ -694,12 +746,17 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr
-+ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-+ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-+ google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-++google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-++google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-+ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-+ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-+ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-+ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-++google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-++google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-++google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-+ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-+@@ -729,8 +786,11 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
-+ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-+ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-+ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-++google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-++google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
-+ google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-+ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-++google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-+ google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
-+ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-+ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-+@@ -785,6 +845,7 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-+ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-++honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go
-+index b4b5e39..ba232bc 100644
-+--- a/api/graph/schema.resolvers.go
-++++ b/api/graph/schema.resolvers.go
-+@@ -39,8 +39,8 @@ import (
-+      "github.com/lib/pq"
-+      zxcvbn "github.com/nbutton23/zxcvbn-go"
-+      "golang.org/x/crypto/bcrypt"
-+-     "golang.org/x/crypto/openpgp"
-+-     "golang.org/x/crypto/openpgp/packet"
-++     "github.com/ProtonMail/go-crypto/openpgp"
-++     "github.com/ProtonMail/go-crypto/openpgp/packet"
-+      "golang.org/x/crypto/ssh"
-+ )
-+ 
-+-- 
-+2.33.1
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
-new file mode 100644
-index 00000000000..4efd12be875
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0001-worker-update-go-redis-to-support-Unix-sockets.patch
-@@ -0,0 +1,113 @@
-+From 5991960a5d412f0e1bdc505b970248c68b44a720 Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Wed, 15 Sep 2021 19:45:41 +0200
-+Subject: [PATCH builds.sr.ht v3 1/2] worker: update go-redis to support Unix
-+ sockets
-+
-+---
-+ worker/context.go |  4 ++--
-+ worker/main.go    | 11 +++++++----
-+ worker/tasks.go   | 10 +++++-----
-+ 3 files changed, 14 insertions(+), 11 deletions(-)
-+
-+diff --git a/worker/context.go b/worker/context.go
-+index f84a60c..be54717 100644
-+--- a/worker/context.go
-++++ b/worker/context.go
-+@@ -14,7 +14,7 @@ import (
-+      "strings"
-+      "time"
-+ 
-+-     "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      "github.com/google/shlex"
-+      "github.com/pkg/errors"
-+      "github.com/prometheus/client_golang/prometheus"
-+@@ -41,7 +41,7 @@ var (
-+ 
-+ type WorkerContext struct {
-+      Db    *sql.DB
-+-     Redis *redis.Client
-++     Redis *goredis.Client
-+      Conf  func(section, key string) string
-+ }
-+ 
-+diff --git a/worker/main.go b/worker/main.go
-+index 274ba68..e22ab6b 100644
-+--- a/worker/main.go
-++++ b/worker/main.go
-+@@ -1,6 +1,7 @@
-+ package main
-+ 
-+ import (
-++     "context"
-+      "database/sql"
-+      "flag"
-+      "log"
-+@@ -9,7 +10,7 @@ import (
-+      "runtime"
-+      "sync"
-+ 
-+-     "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      "github.com/vaughan0/go-ini"
-+      "git.sr.ht/~sircmpwn/core-go/crypto"
-+ 
-+@@ -26,6 +27,8 @@ var (
-+      jobsMutex sync.Mutex
-+ )
-+ 
-++var redisctx = context.Background()
-++
-+ func main() {
-+      flag.IntVar(&workers, "workers", runtime.NumCPU(),
-+              "configure number of workers")
-+@@ -68,12 +71,12 @@ func main() {
-+      if !ok {
-+              redisHost = "redis://localhost:6379"
-+      }
-+-     ropts, err := redis.ParseURL(redisHost)
-++     ropts, err := goredis.ParseURL(redisHost)
-+      if err != nil {
-+              panic(err)
-+      }
-+-     localRedis := redis.NewClient(ropts)
-+-     if _, err := localRedis.Ping().Result(); err != nil {
-++     localRedis := goredis.NewClient(ropts)
-++     if _, err := localRedis.Ping(redisctx).Result(); err != nil {
-+              panic(err)
-+      }
-+ 
-+diff --git a/worker/tasks.go b/worker/tasks.go
-+index d27bf33..d0c28f1 100644
-+--- a/worker/tasks.go
-++++ b/worker/tasks.go
-+@@ -19,7 +19,7 @@ import (
-+      "time"
-+ 
-+      "git.sr.ht/~sircmpwn/core-go/auth"
-+-     "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      "github.com/kr/pty"
-+      "github.com/minio/minio-go/v6"
-+      "github.com/pkg/errors"
-+@@ -39,12 +39,12 @@ var (
-+      }, []string{"image", "arch"})
-+ )
-+ 
-+-func (ctx *JobContext) Boot(r *redis.Client) func() {
-+-     port, err := r.Incr("builds.sr.ht.ssh-port").Result()
-++func (ctx *JobContext) Boot(r *goredis.Client) func() {
-++     port, err := r.Incr(ctx.Context, "builds.sr.ht.ssh-port").Result()
-+      if err == nil && port < 22000 {
-+-             err = r.Set("builds.sr.ht.ssh-port", 22100, 0).Err()
-++             err = r.Set(ctx.Context, "builds.sr.ht.ssh-port", 22100, 0).Err()
-+      } else if err == nil && port >= 23000 {
-+-             err = r.Set("builds.sr.ht.ssh-port", 22000, 0).Err()
-++             err = r.Set(ctx.Context, "builds.sr.ht.ssh-port", 22000, 0).Err()
-+      }
-+      if err != nil {
-+              panic(errors.Wrap(err, "assign port"))
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch
-new file mode 100644
-index 00000000000..c9368d05c18
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/v3-0002-worker-update-go.-mod-sum-for-go-redis.patch
-@@ -0,0 +1,378 @@
-+From eac18e913e4ee48895b94acfa56cf1c6a3fb49fa Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Wed, 15 Sep 2021 20:11:49 +0200
-+Subject: [PATCH builds.sr.ht v3 2/2] worker: update go.{mod,sum} for go-redis
-+
-+---
-+ worker/go.mod |  8 +------
-+ worker/go.sum | 64 +++++++++++++++++++--------------------------------
-+ 2 files changed, 25 insertions(+), 47 deletions(-)
-+
-+diff --git a/worker/go.mod b/worker/go.mod
-+index 6e9a11c..4893dfa 100644
-+--- a/worker/go.mod
-++++ b/worker/go.mod
-+@@ -2,24 +2,18 @@ module git.sr.ht/~sircmpwn/builds.sr.ht/worker
-+ 
-+ require (
-+      git.sr.ht/~sircmpwn/core-go v0.0.0-20210108160653-070566136c1a
-+-     github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
-+-     github.com/go-redis/redis v6.15.2+incompatible
-++     github.com/go-redis/redis/v8 v8.2.3
-+      github.com/gocelery/gocelery v0.0.0-20201111034804-825d89059344
-+-     github.com/gomodule/redigo v2.0.0+incompatible // indirect
-+      github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
-+-     github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629
-+      github.com/kr/pty v1.1.3
-+      github.com/lib/pq v1.8.0
-+      github.com/martinlindhe/base36 v1.1.0
-+-     github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
-+      github.com/minio/minio-go/v6 v6.0.49
-+      github.com/mitchellh/mapstructure v1.1.2
-+      github.com/pkg/errors v0.9.1
-+      github.com/prometheus/client_golang v1.7.1
-+-     github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b
-+      github.com/streadway/amqp v1.0.0 // indirect
-+      github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
-+-     golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb
-+      gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
-+      gopkg.in/mail.v2 v2.3.1
-+      gopkg.in/yaml.v2 v2.3.0
-+diff --git a/worker/go.sum b/worker/go.sum
-+index 1cd3989..4a2d6d9 100644
-+--- a/worker/go.sum
-++++ b/worker/go.sum
-+@@ -10,6 +10,7 @@ git.sr.ht/~sircmpwn/go-bare v0.0.0-20200812160916-d2c72e1a5018/go.mod h1:BVJwbDf
-+ github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
-+ github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
-+ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-++github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
-+ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-+ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
-+ github.com/Masterminds/squirrel v1.4.0 h1:he5i/EXixZxrBUWcxzDYMiju9WZ3ld/l7QBNuo/eN3w=
-+@@ -25,6 +26,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
-+ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-+ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-+ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-++github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
-+ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-+ github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-+ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-+@@ -36,7 +38,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l
-+ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
-+ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-+ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-+-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
-+ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-+ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-+ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-+@@ -58,8 +59,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
-+ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-+ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-+ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-++github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-+ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-+ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
-+ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-+ github.com/dgryski/trifles v0.0.0-20190318185328-a8d75aae118c/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
-+ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-+@@ -84,22 +87,18 @@ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfb
-+ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
-+ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
-+ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-+ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-+ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-+ github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-+ github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-+-github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df h1:Bao6dhmbTA1KFVxmJ6nBoMuOJit2yjEgLJpIMYpop0E=
-+-github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df/go.mod h1:GJr+FCSXshIwgHBtLglIg9M2l2kQSi6QjVAngtzI08Y=
-+ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-+ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-+ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
-+ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-+ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-+ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-+-github.com/go-redis/redis v6.14.1+incompatible h1:kSJohAREGMr344uMa8PzuIg5OU6ylCbyDkWkkNOfEik=
-+-github.com/go-redis/redis v6.14.1+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-+-github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
-+-github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-++github.com/go-redis/redis/v8 v8.2.3 h1:eNesND+DWt/sjQOtPFxAbQkTIXaXX00qNLxjVWkZ70k=
-+ github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw=
-+ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-+ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-+@@ -114,7 +113,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
-+ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-+ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-+-github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
-+ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-+@@ -136,12 +134,14 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
-+ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-+ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-++github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
-+ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-+ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-+ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
-+ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
-+ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-++github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
-+ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-+ github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-+ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-+@@ -180,12 +180,11 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod
-+ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-+ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-+ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-+-github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629 h1:1dSBUfGlorLAua2CRx0zFN7kQsTpE2DQSmr7rrTNgY8=
-+-github.com/jpillora/longestcommon v0.0.0-20161227235612-adb9d91ee629/go.mod h1:mb5nS4uRANwOJSZj8rlCWAfAcGi72GGMIXx+xGOjA7M=
-+ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-+ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-+ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-++github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-+ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-+ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-+ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-+@@ -200,20 +199,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-+ github.com/kr/pty v1.1.3 h1:/Um6a/ZmD5tF7peoOJ5oN5KMQ0DrGVQSXLNwyckutPk=
-+ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-+ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-++github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-+ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-+ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
-+ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
-+ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
-+ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
-+-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
-+-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-+ github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
-+ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-+ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
-+ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-+ github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
-+ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
-+-github.com/martinlindhe/base36 v1.0.0 h1:eYsumTah144C0A8P1T/AVSUk5ZoLnhfYFM3OGQxB52A=
-+ github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
-+ github.com/martinlindhe/base36 v1.1.0 h1:cIwvvwYse/0+1CkUPYH5ZvVIYG3JrILmQEIbLuar02Y=
-+ github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
-+@@ -228,7 +225,6 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
-+ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
-+ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-+ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-+-github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
-+ github.com/minio/minio-go/v6 v6.0.49 h1:bU4kIa/qChTLC1jrWZ8F+8gOiw1MClubddAJVR4gW3w=
-+ github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg=
-+ github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
-+@@ -242,8 +238,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
-+ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-+ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+ github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+-github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
-+-github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-+ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-+ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-+@@ -259,7 +253,9 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
-+ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
-+ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-++github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-+ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-++github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
-+ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-+ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
-+ github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
-+@@ -267,10 +263,12 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
-+ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-+ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-++github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
-+ github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-+ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-+ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-+ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-++github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
-+ github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-+ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
-+ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
-+@@ -287,22 +285,20 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
-+ github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
-+ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
-+ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-+-github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
-+ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-+ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-+ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
-++github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-+ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-+-github.com/prometheus/client_golang v0.9.1 h1:K47Rk0v/fkEfwfQet2KWhscE0cJzjgCCDBG2KHZoVno=
-+ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-+ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-+ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-+ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
-+ github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
-+ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-+-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
-+ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-+ github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-+ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+@@ -310,15 +306,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
-+ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+ github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
-+ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-+-github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4=
-+-github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-+ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
-+ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-+ github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4=
-+ github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
-+-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ=
-+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-+ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-+@@ -333,36 +326,28 @@ github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
-+ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-+ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-+ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
-+-github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo=
-+-github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-+-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
-+-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-+-github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5 h1:Jw7W4WMfQDxsXvfeFSaS2cHlY7bAF4MGrgnbd0+Uo78=
-+-github.com/satori/go.uuid v1.2.1-0.20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-+ github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM=
-+ github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-+ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-+ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-++github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
-+ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-+-github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b h1:7kJLeBNcPG1orS3ksAFN0qoJGtf8jvwgOh5Q+bsNZvc=
-+-github.com/shicky/gocelery v0.0.0-20180807061531-b2f0dd7ec05b/go.mod h1:kn4CkFIzvsrXBvbNk2hX9DpIM8xo/74mYhiYTpGhYXE=
-+ github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-+ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-+ github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
-+ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-+ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-+ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-++github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
-+ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-+ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-++github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-+ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-+ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-+ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
-+ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-+ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-+-github.com/streadway/amqp v0.0.0-20180806233856-70e15c650864 h1:Oj3PUEs+OUSYUpn35O+BE/ivHGirKixA3+vqA0Atu9A=
-+-github.com/streadway/amqp v0.0.0-20180806233856-70e15c650864/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY=
-+ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-+-github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 h1:WhxRHzgeVGETMlmVfqhRn8RIeeNoPr2Czh33I4Zdccw=
-+ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-+ github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo=
-+ github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
-+@@ -373,6 +358,7 @@ github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
-+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-++github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
-+ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-+ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-+ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-+@@ -391,6 +377,7 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
-+ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
-+ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-++go.opentelemetry.io/otel v0.11.0 h1:IN2tzQa9Gc4ZVKnTaMbPVcHjvzOdg5n9QfnmlqiET7E=
-+ go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0=
-+ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-+ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
-+@@ -403,7 +390,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
-+ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-+ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-+ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+-golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo=
-+ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-+@@ -431,7 +417,6 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r
-+ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-+-golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
-+ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-+ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-+ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-+@@ -451,7 +436,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
-+ golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
-+ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+@@ -460,7 +444,6 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h
-+ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
-+ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+@@ -477,7 +460,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w
-+ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+ golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs=
-+ golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-+-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
-+ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-+ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-+ golang.org/x/text v0.3.4-0.20201021145329-22f1617af38e h1:0kyKOEC0chG7FKmnf/1uNwvDLc3NtNTRip2rXAN9nwI=
-+@@ -502,6 +484,7 @@ golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapK
-+ golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-+ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-+ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-+ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-+ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-+@@ -539,6 +522,7 @@ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod
-+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-+ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-+ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-++gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-+ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-+ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-+ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-+@@ -549,6 +533,7 @@ gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-+ gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
-+ gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
-+ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-+ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-+ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-+ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-+@@ -556,10 +541,9 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-+-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-+ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
-+ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-++gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-+ honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
-new file mode 100644
-index 00000000000..299ad3d83c5
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/v3-0001-add-Unix-socket-support-for-redis-host.patch
-@@ -0,0 +1,30 @@
-+From c0ccc8db051a2f8278edf59b41ed238fa71aa4c0 Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Mon, 23 Aug 2021 18:43:18 +0200
-+Subject: [PATCH core.sr.ht v3] add Unix socket support for redis-host=
-+
-+---
-+ srht/redis.py | 11 ++---------
-+ 1 file changed, 2 insertions(+), 9 deletions(-)
-+
-+diff --git a/srht/redis.py b/srht/redis.py
-+index 8a9347c..2e91c35 100644
-+--- a/srht/redis.py
-++++ b/srht/redis.py
-+@@ -1,11 +1,4 @@
-+-from redis import Redis
-++from redis import from_url
-+ from srht.config import cfg
-+-from urllib.parse import urlparse
-+ 
-+-url = cfg("sr.ht", "redis-host", "redis://localhost")
-+-url = urlparse(url)
-+-
-+-redis = Redis(host=url.hostname,
-+-        port=(url.port or 6379),
-+-        password=url.password,
-+-        db=int(url.path[1:]) if url.path else 0)
-++redis = from_url(cfg("sr.ht", "redis-host", "redis://localhost"))
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
-new file mode 100644
-index 00000000000..48e91ac739b
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0001-gitsrht-keys-update-go-redis-to-support-Unix-sock.patch
-@@ -0,0 +1,26 @@
-+From 083e4791771d998c9a6c881a4101d24296e38252 Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Fri, 27 Aug 2021 15:38:28 +0200
-+Subject: [PATCH git.sr.ht v3 1/3] gitsrht-keys: update go-redis to support
-+ Unix sockets
-+
-+---
-+ gitsrht-keys/main.go | 2 +-
-+ 1 file changed, 1 insertion(+), 1 deletion(-)
-+
-+diff --git a/gitsrht-keys/main.go b/gitsrht-keys/main.go
-+index 0c1aea1..fa17183 100644
-+--- a/gitsrht-keys/main.go
-++++ b/gitsrht-keys/main.go
-+@@ -5,7 +5,7 @@ import (
-+      "os"
-+      "path"
-+ 
-+-     goredis "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      "github.com/vaughan0/go-ini"
-+      "git.sr.ht/~sircmpwn/scm.sr.ht/srht-keys"
-+ )
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
-new file mode 100644
-index 00000000000..41847ac8717
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0002-gitsrht-update-hook-update-go-redis-to-support-Un.patch
-@@ -0,0 +1,109 @@
-+From d9683aced0dc3a94c56de2fde31c1765054900fa Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Fri, 27 Aug 2021 15:39:29 +0200
-+Subject: [PATCH git.sr.ht v3 2/3] gitsrht-update-hook: update go-redis to
-+ support Unix sockets
-+
-+---
-+ gitsrht-update-hook/options.go     | 12 +++++++-----
-+ gitsrht-update-hook/post-update.go |  4 ++--
-+ gitsrht-update-hook/update.go      |  4 ++--
-+ 3 files changed, 11 insertions(+), 9 deletions(-)
-+
-+diff --git a/gitsrht-update-hook/options.go b/gitsrht-update-hook/options.go
-+index 8efbb0a..962502a 100644
-+--- a/gitsrht-update-hook/options.go
-++++ b/gitsrht-update-hook/options.go
-+@@ -1,15 +1,17 @@
-+ package main
-+ 
-+ import (
-++     "context"
-+      "fmt"
-+      "os"
-+      "strconv"
-+      "strings"
-+      "time"
-+ 
-+-     goredis "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+ )
-+ 
-++var ctx = context.Background()
-+ var options map[string]string
-+ 
-+ func loadOptions() {
-+@@ -35,10 +37,10 @@ func loadOptions() {
-+      var n int
-+      if nopts, ok := os.LookupEnv("GIT_PUSH_OPTION_COUNT"); ok {
-+              n, _ = strconv.Atoi(nopts)
-+-             redis.Set(fmt.Sprintf("git.sr.ht.options.%s", uuid),
-++             redis.Set(ctx, fmt.Sprintf("git.sr.ht.options.%s", uuid),
-+                      nopts, 10*time.Minute)
-+      } else {
-+-             nopts, err := redis.Get(fmt.Sprintf(
-++             nopts, err := redis.Get(ctx, fmt.Sprintf(
-+                      "git.sr.ht.options.%s", uuid)).Result()
-+              if err != nil {
-+                      return
-+@@ -51,12 +53,12 @@ func loadOptions() {
-+              opt, ok := os.LookupEnv(fmt.Sprintf("GIT_PUSH_OPTION_%d", i))
-+              optkey := fmt.Sprintf("git.sr.ht.options.%s.%d", uuid, i)
-+              if !ok {
-+-                     opt, err = redis.Get(optkey).Result()
-++                     opt, err = redis.Get(ctx, optkey).Result()
-+                      if err != nil {
-+                              return
-+                      }
-+              } else {
-+-                     redis.Set(optkey, opt, 10*time.Minute)
-++                     redis.Set(ctx, optkey, opt, 10*time.Minute)
-+              }
-+              parts := strings.SplitN(opt, "=", 2)
-+              if len(parts) == 1 {
-+diff --git a/gitsrht-update-hook/post-update.go b/gitsrht-update-hook/post-update.go
-+index d14d616..fcd7864 100644
-+--- a/gitsrht-update-hook/post-update.go
-++++ b/gitsrht-update-hook/post-update.go
-+@@ -15,7 +15,7 @@ import (
-+      "github.com/go-git/go-git/v5/plumbing"
-+      "github.com/go-git/go-git/v5/plumbing/object"
-+      "github.com/go-git/go-git/v5/plumbing/storer"
-+-     goredis "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      _ "github.com/lib/pq"
-+ )
-+ 
-+@@ -220,7 +220,7 @@ func postUpdate() {
-+              var oldref, newref string
-+              var oldobj, newobj object.Object
-+              updateKey := fmt.Sprintf("update.%s.%s", pushUuid, refname)
-+-             update, err := redis.Get(updateKey).Result()
-++             update, err := redis.Get(ctx, updateKey).Result()
-+              if update == "" || err != nil {
-+                      logger.Println("redis.Get: missing key")
-+                      continue
-+diff --git a/gitsrht-update-hook/update.go b/gitsrht-update-hook/update.go
-+index 72c661a..e33fd4b 100644
-+--- a/gitsrht-update-hook/update.go
-++++ b/gitsrht-update-hook/update.go
-+@@ -5,7 +5,7 @@ import (
-+      "os"
-+      "time"
-+ 
-+-     goredis "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+ )
-+ 
-+ // XXX: This is run once for every single ref that's pushed. If someone pushes
-+@@ -31,6 +31,6 @@ func update() {
-+              logger.Fatalf("Failed to parse redis host: %v", err)
-+      }
-+      redis := goredis.NewClient(ropts)
-+-     redis.Set(fmt.Sprintf("update.%s.%s", pushUuid, refname),
-++     redis.Set(ctx, fmt.Sprintf("update.%s.%s", pushUuid, refname),
-+              fmt.Sprintf("%s:%s", oldref, newref), 10*time.Minute)
-+ }
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/0001-Revert-Add-build-submission-and-queue-monitoring.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/0001-Revert-Add-build-submission-and-queue-monitoring.patch
+deleted file mode 100644
+index ae8e95ddc0c..00000000000
+--- a/pkgs/applications/version-management/sourcehut/patches/redis-socket/build/0001-Revert-Add-build-submission-and-queue-monitoring.patch
++++ /dev/null
+@@ -1,69 +0,0 @@
+-From 069b03f85847ed4a9223183b62ee53f420838911 Mon Sep 17 00:00:00 2001
+-From: Julien Moutinho <julm+srht@sourcephile.fr>
+-Date: Thu, 16 Dec 2021 04:54:24 +0100
+-Subject: [PATCH builds.sr.ht] Revert "Add build submission and queue
+- monitoring"
+-
+-This reverts commit 690f1aa16c77e418dc40109cd5e8fdf4a7ed947a.
+-
+-This has broken Unix socket support for Redis
+-See https://lists.sr.ht/~sircmpwn/sr.ht-dev/%3C20211208082636.65665-1-me%40ignaskiela.eu%3E#%3C20211216033723.wefibfulfjhqnhem@sourcephile.fr%3E
+----
+- buildsrht/app.py    | 3 ---
+- buildsrht/runner.py | 9 +--------
+- 2 files changed, 1 insertion(+), 11 deletions(-)
+-
+-diff --git a/buildsrht/app.py b/buildsrht/app.py
+-index e5321a2..7c9977c 100644
+---- a/buildsrht/app.py
+-+++ b/buildsrht/app.py
+-@@ -36,9 +36,6 @@ class BuildApp(SrhtFlask):
+-         self.register_blueprint(secrets)
+-         self.register_blueprint(gql_blueprint)
+- 
+--        from buildsrht.runner import builds_queue_metrics_collector
+--        self.metrics_registry.register(builds_queue_metrics_collector)
+--
+-         @self.context_processor
+-         def inject():
+-             return {
+-diff --git a/buildsrht/runner.py b/buildsrht/runner.py
+-index 7773452..0389c8e 100644
+---- a/buildsrht/runner.py
+-+++ b/buildsrht/runner.py
+-@@ -5,13 +5,10 @@ from srht.config import cfg
+- from srht.database import db
+- from srht.email import send_email
+- from srht.oauth import UserType
+--from srht.metrics import RedisQueueCollector
+--from prometheus_client import Counter
+- 
+- allow_free = cfg("builds.sr.ht", "allow-free", default="no") == "yes"
+- 
+--builds_broker = cfg("builds.sr.ht", "redis")
+--runner = Celery('builds', broker=builds_broker, config_source={
+-+runner = Celery('builds', broker=cfg("builds.sr.ht", "redis"), config_source={
+-     "CELERY_TASK_SERIALIZER": "json",
+-     "CELERY_ACCEPT_CONTENT": ["json"],
+-     "CELERY_RESULT_SERIALIZER": "json",
+-@@ -19,9 +16,6 @@ runner = Celery('builds', broker=builds_broker, config_source={
+-     "CELERY_TASK_PROTOCOL": 1
+- })
+- 
+--builds_queue_metrics_collector = RedisQueueCollector(builds_broker, "buildsrht_builds", "Number of builds currently in queue")
+--builds_submitted = Counter("buildsrht_builds_submited", "Number of builds submitted")
+--
+- def queue_build(job, manifest):
+-     from buildsrht.types import JobStatus
+-     job.status = JobStatus.queued
+-@@ -34,7 +28,6 @@ def queue_build(job, manifest):
+-                 cfg("sr.ht", "owner-email"),
+-                 "Cryptocurrency mining attempt on builds.sr.ht")
+-     else:
+--        builds_submitted.inc()
+-         run_build.delay(job.id, manifest.to_dict())
+- 
+- def requires_payment(user):
+--- 
+-2.34.0
+-
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/0001-Fix-Unix-socket-support-in-RedisQueueCollector.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/0001-Fix-Unix-socket-support-in-RedisQueueCollector.patch
 new file mode 100644
-index 00000000000..9a4b0300921
+index 00000000000..889331f3e07
 --- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/v3-0003-gitsrht-dispatch-add-support-for-supplementary-gr.patch
-@@ -0,0 +1,57 @@
-+From fcbec39a406562c29dfcf7eeef6f284da28bc619 Mon Sep 17 00:00:00 2001
++++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/core/0001-Fix-Unix-socket-support-in-RedisQueueCollector.patch
+@@ -0,0 +1,42 @@
++From 76dd636151735671be74ba9d55f773e190e22827 Mon Sep 17 00:00:00 2001
 +From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Fri, 27 Aug 2021 17:42:33 +0200
-+Subject: [PATCH git.sr.ht v3 3/3] gitsrht-dispatch: add support for
-+ supplementary groups
++Date: Fri, 13 May 2022 22:40:46 +0200
++Subject: [PATCH core.sr.ht] Fix Unix socket support in RedisQueueCollector
 +
-+---
-+ gitsrht-dispatch/main.go | 17 ++++++++++++++---
-+ 1 file changed, 14 insertions(+), 3 deletions(-)
++The broker URL is not necessarily in the format expected by Redis.from_url
 +
-+diff --git a/gitsrht-dispatch/main.go b/gitsrht-dispatch/main.go
-+index d7aee14..5f17b75 100644
-+--- a/gitsrht-dispatch/main.go
-++++ b/gitsrht-dispatch/main.go
-+@@ -17,6 +17,7 @@ type Dispatcher struct {
-+      cmd string
-+      uid int
-+      gid int
-++     gids []int
-+ }
-+ 
-+ func main() {
-+@@ -70,11 +71,20 @@ AuthorizedKeysUser=root`, os.Args[0])
-+              if err != nil {
-+                      logger.Fatalf("Error looking up group %s: %v", spec[1], err)
-+              }
-++             groups, err := user.GroupIds()
-++             if err != nil {
-++                     logger.Fatalf("Error looking up supplementary groups of user %s: %v", spec[0], err)
-++             }
-++             gids := make([]int, len(groups))
-++             for i, grp := range groups {
-++                     sgid, _ := strconv.Atoi(grp)
-++                     gids[i] = sgid
-++             }
-+              uid, _ := strconv.Atoi(user.Uid)
-+              gid, _ := strconv.Atoi(group.Gid)
-+-             dispatchers[uid] = Dispatcher{cmd, uid, gid}
-+-             logger.Printf("Registered dispatcher for %s(%d):%s(%d): %s",
-+-                     spec[0], uid, spec[1], gid, cmd)
-++             dispatchers[uid] = Dispatcher{cmd, uid, gid, gids}
-++             logger.Printf("Registered dispatcher for %s(%d):%s(%d):(%s): %s",
-++                     spec[0], uid, spec[1], gid, strings.Join(groups, ","), cmd)
-+      }
-+ 
-+      var user *osuser.User
-+@@ -93,6 +103,7 @@ AuthorizedKeysUser=root`, os.Args[0])
-+ 
-+      if dispatcher, ok := dispatchers[uid]; ok {
-+              logger.Printf("Dispatching to %s", dispatcher.cmd)
-++             syscall.Setgroups(dispatcher.gids)
-+              syscall.Setgid(dispatcher.gid)
-+              syscall.Setuid(dispatcher.uid)
-+              if err := syscall.Exec(dispatcher.cmd, append([]string{
-+-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
-new file mode 100644
-index 00000000000..191ff61b826
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
-@@ -0,0 +1,61 @@
-+From e244cb7398758f91cc6deaabf278a1b6412ee477 Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Fri, 27 Aug 2021 12:48:56 +0200
-+Subject: [PATCH scm.sr.ht v3 1/2] srht-keys: update go-redis to support Unix
-+ sockets
++Especially, Redis.from_url supports this format for Unix sockets:
++    unix:///run/redis-sourcehut-metasrht/redis.sock?db=0
++See https://redis-py.readthedocs.io/en/stable/#redis.ConnectionPool.from_url
 +
++Whereas Celery+Kombu support Redis but also other transports
++and thus expect another scheme:
++    redis+socket:///run/redis-sourcehut-metasrht/redis.sock?virtual_host=1
++See https://docs.celeryproject.org/en/stable/userguide/configuration.html#redis-backend-settings
++and https://github.com/celery/celery/blob/e5d99801e4b56a02af4a2e183879c767228d2817/celery/backends/redis.py#L299-L352
++and https://github.com/celery/kombu/blob/master/kombu/utils/url.py
 +---
-+ srht-keys/srhtkeys.go | 9 ++++++---
-+ 1 file changed, 6 insertions(+), 3 deletions(-)
-+
-+diff --git a/srht-keys/srhtkeys.go b/srht-keys/srhtkeys.go
-+index be925ed..1a300d5 100644
-+--- a/srht-keys/srhtkeys.go
-++++ b/srht-keys/srhtkeys.go
-+@@ -1,6 +1,7 @@
-+ package srhtkeys
-+ 
-+ import (
-++     "context"
-+      "database/sql"
-+      "encoding/json"
-+      "errors"
-+@@ -12,7 +13,7 @@ import (
-+      "path"
-+      "time"
-+ 
-+-     goredis "github.com/go-redis/redis"
-++     goredis "github.com/go-redis/redis/v8"
-+      "github.com/google/uuid"
-+      _ "github.com/lib/pq"
-+      "github.com/vaughan0/go-ini"
-+@@ -37,6 +38,8 @@ type MetaSSHKey struct {
-+      Owner       MetaUser `json:"owner"`
-+ }
-+ 
-++var ctx = context.Background()
-++
-+ // Stores the SSH key in the database and returns the user's ID.
-+ func storeKey(logger *log.Logger, db *sql.DB, key *MetaSSHKey) (int, error) {
-+      logger.Println("Storing meta.sr.ht key in database")
-+@@ -145,7 +148,7 @@ func fetchKeysFromMeta(logger *log.Logger, config ini.File,
-+      if err != nil {
-+              logger.Printf("Caching SSH key in redis failed: %v", err)
-+      } else {
-+-             redis.Set(cacheKey, cacheBytes, 7*24*time.Hour)
-++             redis.Set(ctx, cacheKey, cacheBytes, 7*24*time.Hour)
-+      }
++ srht/metrics.py | 3 ++-
++ 1 file changed, 2 insertions(+), 1 deletion(-)
++
++diff --git a/srht/metrics.py b/srht/metrics.py
++index 68caf8e..2df5777 100644
++--- a/srht/metrics.py
+++++ b/srht/metrics.py
++@@ -1,11 +1,12 @@
++ import time
+++from celery import Celery
++ from prometheus_client.metrics_core import GaugeMetricFamily
++ from redis import Redis, ResponseError
 + 
-+      return key.Owner.Username, userId
-+@@ -168,7 +171,7 @@ func UserFromKey(logger *log.Logger, config ini.File,
 + 
-+      cacheKey := fmt.Sprintf("%s.ssh-keys.%s", service, b64key)
-+      logger.Printf("Cache key for SSH key lookup: %s", cacheKey)
-+-     cacheBytes, err := redis.Get(cacheKey).Bytes()
-++     cacheBytes, err := redis.Get(ctx, cacheKey).Bytes()
-+      var (
-+              username string
-+              userId   int
++ class RedisQueueCollector:
++     def __init__(self, broker, name, documentation, queue_name="celery"):
++-        self.redis = Redis.from_url(broker)
+++        self.redis = Celery("collector", broker=broker).connection_for_read().channel().client
++         self.queue_name = queue_name
++         self.name = name
++         self.documentation = documentation
 +-- 
-+2.32.0
-+
-diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch
-new file mode 100644
-index 00000000000..c5407a26491
---- /dev/null
-+++ b/pkgs/applications/version-management/sourcehut/patches/redis-socket/scm/v3-0002-srht-keys-update-go.-mod-sum-for-go-redis.patch
-@@ -0,0 +1,155 @@
-+From aeb3e0dc2270e6ab3cd0f651ea735275e527e7ce Mon Sep 17 00:00:00 2001
-+From: Julien Moutinho <julm+srht@sourcephile.fr>
-+Date: Fri, 27 Aug 2021 13:06:27 +0200
-+Subject: [PATCH scm.sr.ht v3 2/2] srht-keys: update go.{mod,sum} for go-redis
-+
-+---
-+ srht-keys/go.mod |   2 +-
-+ srht-keys/go.sum | 103 ++++++++++++++++++++++++++++++++++++++++++++---
-+ 2 files changed, 99 insertions(+), 6 deletions(-)
-+
-+diff --git a/srht-keys/go.mod b/srht-keys/go.mod
-+index d275913..8d1c10a 100644
-+--- a/srht-keys/go.mod
-++++ b/srht-keys/go.mod
-+@@ -4,7 +4,7 @@ go 1.13
-+ 
-+ require (
-+      git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6
-+-     github.com/go-redis/redis v6.15.9+incompatible
-++     github.com/go-redis/redis/v8 v8.11.3
-+      github.com/google/uuid v1.1.1
-+      github.com/lib/pq v1.8.0
-+      github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec
-+diff --git a/srht-keys/go.sum b/srht-keys/go.sum
-+index 974326e..a264a26 100644
-+--- a/srht-keys/go.sum
-++++ b/srht-keys/go.sum
-+@@ -1,26 +1,119 @@
-+-git.sr.ht/~sircmpwn/core-go v0.0.0-20200820135923-98806e712f5e h1:TJqf/neVU5peFAS9WcR1aADXcflPOvAd7ABEirmU7m0=
-+-git.sr.ht/~sircmpwn/core-go v0.0.0-20200820135923-98806e712f5e/go.mod h1:aXSNgRsGoI3tTFKlwD0xm2htbEzKlR2xUm1osRxfhOM=
-+ git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6 h1:Ky6HzcRmbMUxOrWXv04+mb97GkyxO/Nx7v8uJBUdpNk=
-+ git.sr.ht/~sircmpwn/core-go v0.0.0-20201005173246-a9e49d17a1e6/go.mod h1:HpPX22ilJUWKOA4NDhrOcIyblQhdiKHPg4oMJFYdh0Y=
-++github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
-++github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-+ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-++github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-++github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
-++github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-++github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001 h1:/UMxx5lGDg30aioUL9e7xJnbJfJeX7vhcm57fa5udaI=
-+ github.com/fernet/fernet-go v0.0.0-20191111064656-eff2850e6001/go.mod h1:2H9hjfbpSMHwY503FclkV/lZTBh2YlOmLLSda12uL8c=
-+-github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
-+-github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-++github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-++github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-++github.com/go-redis/redis/v8 v8.11.3 h1:GCjoYp8c+yQTJfc0n69iwSiHjvuAdruxl7elnZCxgt8=
-++github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc=
-++github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-++github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-++github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-++github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-++github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-++github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-++github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-++github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-++github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-++github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-++github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-++github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-++github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-++github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-++github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-++github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
-++github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
-+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-++github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-+ github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
-+ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-++github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-++github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-++github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-++github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-++github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-++github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
-++github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-++github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-++github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-++github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
-++github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
-++github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-+ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-++github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-++github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
-+ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec h1:DGmKwyZwEB8dI7tbLt/I/gQuP559o/0FrAkHKlQM/Ks=
-+ github.com/vaughan0/go-ini v0.0.0-20130923145212-a98ad7ee00ec/go.mod h1:owBmyHYMLkxyrugmfwE/DLJyW8Ro9mkphwuVErQ0iUw=
-++github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-+ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-+-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
-++golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-++golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-+ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-++golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-++golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-+ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-++golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-++golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-++golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
-++golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-++golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-++golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-++golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-++golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-+ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
-++golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-++golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-+ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-++golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-++golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
-++golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-++golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-++golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-++golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-++golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-++golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-++google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-++google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-++google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-++google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-++google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-++google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-++google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-++google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
-++google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-++gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
-+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-++gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-++gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-++gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-++gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-++gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-++gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-++gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-++gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
-+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-+-- 
-+2.32.0
++2.35.1
 +
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/0001-Revert-Add-webhook-queue-monitoring.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/0001-Revert-Add-webhook-queue-monitoring.patch
+deleted file mode 100644
+index 4c526dd23e1..00000000000
+--- a/pkgs/applications/version-management/sourcehut/patches/redis-socket/git/0001-Revert-Add-webhook-queue-monitoring.patch
++++ /dev/null
+@@ -1,50 +0,0 @@
+-From 5ccb5386304c26f25b0a9eb10ce9edb6da32f91a Mon Sep 17 00:00:00 2001
+-From: Julien Moutinho <julm+srht@sourcephile.fr>
+-Date: Sat, 12 Feb 2022 00:11:59 +0100
+-Subject: [PATCH git.sr.ht] Revert "Add webhook queue monitoring"
+-
+-This reverts commit 7ea630b776947ab82438d0ffa263b0f9d33ebff3.
+-
+-Which has broken Unix socket support for Redis.
+-See https://lists.sr.ht/~sircmpwn/sr.ht-dev/%3C20211208082636.65665-1-me%40ignaskiela.eu%3E#%3C20211216033723.wefibfulfjhqnhem@sourcephile.fr%3E
+----
+- gitsrht/app.py      | 3 ---
+- gitsrht/webhooks.py | 5 +----
+- 2 files changed, 1 insertion(+), 7 deletions(-)
+-
+-diff --git a/gitsrht/app.py b/gitsrht/app.py
+-index e9ccb56..4928851 100644
+---- a/gitsrht/app.py
+-+++ b/gitsrht/app.py
+-@@ -48,9 +48,6 @@ class GitApp(ScmSrhtFlask):
+-         self.add_template_filter(url_quote)
+-         self.add_template_filter(commit_links)
+- 
+--        from gitsrht.webhooks import webhook_metrics_collector
+--        self.metrics_registry.register(webhook_metrics_collector)
+--
+-         @self.context_processor
+-         def inject():
+-             notice = session.get("notice")
+-diff --git a/gitsrht/webhooks.py b/gitsrht/webhooks.py
+-index 8a203fe..6240d50 100644
+---- a/gitsrht/webhooks.py
+-+++ b/gitsrht/webhooks.py
+-@@ -7,13 +7,10 @@ if not hasattr(db, "session"):
+-     db.init()
+- from srht.webhook import Event
+- from srht.webhook.celery import CeleryWebhook, make_worker
+--from srht.metrics import RedisQueueCollector
+- from scmsrht.webhooks import UserWebhook
+- import sqlalchemy as sa
+- 
+--webhook_broker = cfg("git.sr.ht", "webhooks")
+--worker = make_worker(broker=webhook_broker)
+--webhook_metrics_collector = RedisQueueCollector(webhook_broker, "srht_webhooks", "Webhook queue length")
+-+worker = make_worker(broker=cfg("git.sr.ht", "webhooks"))
+- 
+- class RepoWebhook(CeleryWebhook):
+-     events = [
+--- 
+-2.34.1
+-
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/lists/0001-Revert-Add-webhook-queue-monitoring.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/lists/0001-Revert-Add-webhook-queue-monitoring.patch
+deleted file mode 100644
+index 872d285b9bb..00000000000
+--- a/pkgs/applications/version-management/sourcehut/patches/redis-socket/lists/0001-Revert-Add-webhook-queue-monitoring.patch
++++ /dev/null
+@@ -1,48 +0,0 @@
+-From 730e090f31b150d42be4b4722751f8e4610835b0 Mon Sep 17 00:00:00 2001
+-From: Julien Moutinho <julm+srht@sourcephile.fr>
+-Date: Sat, 12 Feb 2022 00:38:12 +0100
+-Subject: [PATCH lists.sr.ht] Revert "Add webhook queue monitoring"
+-
+-This reverts commit e74e344808e8d523a9786cefcbf64c9a247d7a0e.
+-
+-Which has broken Unix socket support for Redis.
+-See https://lists.sr.ht/~sircmpwn/sr.ht-dev/%3C20211208082636.65665-1-me%40ignaskiela.eu%3E#%3C20211216033723.wefibfulfjhqnhem@sourcephile.fr%3E
+----
+- listssrht/app.py      | 3 ---
+- listssrht/webhooks.py | 5 +----
+- 2 files changed, 1 insertion(+), 7 deletions(-)
+-
+-diff --git a/listssrht/app.py b/listssrht/app.py
+-index aec59f3..83a355d 100644
+---- a/listssrht/app.py
+-+++ b/listssrht/app.py
+-@@ -29,9 +29,6 @@ class ListsApp(SrhtFlask):
+-         self.register_blueprint(user)
+-         self.register_blueprint(gql_blueprint)
+- 
+--        from listssrht.webhooks import webhook_metrics_collector
+--        self.metrics_registry.register(webhook_metrics_collector)
+--
+-         @self.context_processor
+-         def inject():
+-             from listssrht.types import ListAccess
+-diff --git a/listssrht/webhooks.py b/listssrht/webhooks.py
+-index ae5b1cb..86421ba 100644
+---- a/listssrht/webhooks.py
+-+++ b/listssrht/webhooks.py
+-@@ -8,11 +8,8 @@ if not hasattr(db, "session"):
+-     db.init()
+- from srht.webhook import Event
+- from srht.webhook.celery import CeleryWebhook, make_worker
+--from srht.metrics import RedisQueueCollector
+- 
+--webhook_broker = cfg("lists.sr.ht", "webhooks")
+--worker = make_worker(broker=webhook_broker)
+--webhook_metrics_collector = RedisQueueCollector(webhook_broker, "srht_webhooks", "Webhook queue length")
+-+worker = make_worker(broker=cfg("lists.sr.ht", "webhooks"))
+- 
+- class ListWebhook(CeleryWebhook):
+-     events = [
+--- 
+-2.34.1
+-
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/meta/0001-Revert-Add-webhook-queue-monitoring.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/meta/0001-Revert-Add-webhook-queue-monitoring.patch
+deleted file mode 100644
+index 9ec37670b06..00000000000
+--- a/pkgs/applications/version-management/sourcehut/patches/redis-socket/meta/0001-Revert-Add-webhook-queue-monitoring.patch
++++ /dev/null
+@@ -1,48 +0,0 @@
+-From d88bee195797c6c294320617ff14798da94cd0f3 Mon Sep 17 00:00:00 2001
+-From: Julien Moutinho <julm+srht@sourcephile.fr>
+-Date: Thu, 16 Dec 2021 04:52:08 +0100
+-Subject: [PATCH meta.sr.ht] Revert "Add webhook queue monitoring"
+-
+-This reverts commit 9931df3c23094af5179df9ef019ca732b8125dac.
+-
+-This has broken Unix socket support for Redis.
+-See https://lists.sr.ht/~sircmpwn/sr.ht-dev/%3C20211208082636.65665-1-me%40ignaskiela.eu%3E#%3C20211216033723.wefibfulfjhqnhem@sourcephile.fr%3E
+----
+- metasrht/app.py      | 3 ---
+- metasrht/webhooks.py | 5 +----
+- 2 files changed, 1 insertion(+), 7 deletions(-)
+-
+-diff --git a/metasrht/app.py b/metasrht/app.py
+-index b190875..89c59bc 100644
+---- a/metasrht/app.py
+-+++ b/metasrht/app.py
+-@@ -49,9 +49,6 @@ class MetaApp(SrhtFlask):
+-             from metasrht.blueprints.billing import billing
+-             self.register_blueprint(billing)
+- 
+--        from metasrht.webhooks import webhook_metrics_collector
+--        self.metrics_registry.register(webhook_metrics_collector)
+--
+-         @self.context_processor
+-         def inject():
+-             return {
+-diff --git a/metasrht/webhooks.py b/metasrht/webhooks.py
+-index 3e1149e..3f0ba01 100644
+---- a/metasrht/webhooks.py
+-+++ b/metasrht/webhooks.py
+-@@ -7,11 +7,8 @@ if not hasattr(db, "session"):
+-     db.init()
+- from srht.webhook import Event
+- from srht.webhook.celery import CeleryWebhook, make_worker
+--from srht.metrics import RedisQueueCollector
+- 
+--webhook_broker = cfg("meta.sr.ht", "webhooks", "redis://")
+--worker = make_worker(broker=webhook_broker)
+--webhook_metrics_collector = RedisQueueCollector(webhook_broker, "srht_webhooks", "Webhook queue length")
+-+worker = make_worker(broker=cfg("meta.sr.ht", "webhooks", "redis://"))
+- 
+- class UserWebhook(CeleryWebhook):
+-     events = [
+--- 
+-2.34.0
+-
+diff --git a/pkgs/applications/version-management/sourcehut/patches/redis-socket/todo/0001-Revert-Add-webhook-queue-monitoring.patch b/pkgs/applications/version-management/sourcehut/patches/redis-socket/todo/0001-Revert-Add-webhook-queue-monitoring.patch
+deleted file mode 100644
+index 861608c1184..00000000000
+--- a/pkgs/applications/version-management/sourcehut/patches/redis-socket/todo/0001-Revert-Add-webhook-queue-monitoring.patch
++++ /dev/null
+@@ -1,50 +0,0 @@
+-From 42a27ea60d8454552d54e1f51f1b976d1067fc32 Mon Sep 17 00:00:00 2001
+-From: Julien Moutinho <julm+srht@sourcephile.fr>
+-Date: Sat, 12 Feb 2022 00:30:29 +0100
+-Subject: [PATCH todo.sr.ht] Revert "Add webhook queue monitoring"
+-
+-This reverts commit 320a5e8f7cd16ca43928c36f0320593f84d986fa.
+-
+-Which has broken Unix socket support for Redis.
+-See https://lists.sr.ht/~sircmpwn/sr.ht-dev/%3C20211208082636.65665-1-me%40ignaskiela.eu%3E#%3C20211216033723.wefibfulfjhqnhem@sourcephile.fr%3E
+----
+- todosrht/flask.py    | 3 ---
+- todosrht/webhooks.py | 6 +-----
+- 2 files changed, 1 insertion(+), 8 deletions(-)
+-
+-diff --git a/todosrht/flask.py b/todosrht/flask.py
+-index 5e8ac66..9d0fd27 100644
+---- a/todosrht/flask.py
+-+++ b/todosrht/flask.py
+-@@ -43,9 +43,6 @@ class TodoApp(SrhtFlask):
+-         self.add_template_filter(urls.tracker_url)
+-         self.add_template_filter(urls.user_url)
+- 
+--        from todosrht.webhooks import webhook_metrics_collector
+--        self.metrics_registry.register(webhook_metrics_collector)
+--
+-         @self.context_processor
+-         def inject():
+-             return {
+-diff --git a/todosrht/webhooks.py b/todosrht/webhooks.py
+-index eb8e08a..950047f 100644
+---- a/todosrht/webhooks.py
+-+++ b/todosrht/webhooks.py
+-@@ -7,13 +7,9 @@ if not hasattr(db, "session"):
+-     db.init()
+- from srht.webhook import Event
+- from srht.webhook.celery import CeleryWebhook, make_worker
+--from srht.metrics import RedisQueueCollector
+- import sqlalchemy as sa
+- 
+--
+--webhooks_broker = cfg("todo.sr.ht", "webhooks")
+--worker = make_worker(broker=webhooks_broker)
+--webhook_metrics_collector = RedisQueueCollector(webhooks_broker, "srht_webhooks", "Webhook queue length")
+-+worker = make_worker(broker=cfg("todo.sr.ht", "webhooks"))
+- 
+- import todosrht.tracker_import
+- 
+--- 
+-2.34.1
+-
 diff --git a/pkgs/applications/version-management/sourcehut/scm.nix b/pkgs/applications/version-management/sourcehut/scm.nix
-index 1f385265360..55bc2aa9e72 100644
+index 10da3018843..49eea05a7a7 100644
 --- a/pkgs/applications/version-management/sourcehut/scm.nix
 +++ b/pkgs/applications/version-management/sourcehut/scm.nix
-@@ -1,22 +1,57 @@
- { lib
- , fetchFromSourcehut
-+, buildGoModule
- , buildPythonPackage
- , srht
- , redis
- , pyyaml
--, buildsrht
--, writeText
-+, applyPatches
- }:
+@@ -9,13 +9,13 @@
  
  buildPythonPackage rec {
    pname = "scmsrht";
--  version = "0.22.9";
-+  version = "0.22.15";
+-  version = "0.22.19"; # Untagged version
++  version = "0.22.22";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "scm.sr.ht";
      rev = version;
--    sha256 = "sha256-327G6C8FW+iZx+167D7TQsFtV6FGc8MpMVo9L/cUUqU=";
-+    sha256 = "sha256-h4akgDn78ctBF31TX8D8NwUVUVazClPVvCR9xWyQPBk=";
-+  };
-+
-+  passthru = {
-+    srht-keys = buildGoModule {
-+      inherit src version;
-+      sourceRoot = "source/srht-keys";
-+      pname = "srht-keys";
-+      vendorSha256 = "sha256-7j6b9VOpdQ2YcoM1F4xf14IwHg3GFDN6VDbC4gt6wO0=";
-+
-+      # What follows is only to update go-redis
-+      # go.{mod,sum} could be patched directly but that would be less resilient
-+      # to changes from upstream, and thus harder to maintain the patching
-+      # while it hasn't been merged upstream.
-+
-+      overrideModAttrs = old: {
-+        preBuild = ''
-+          go get github.com/go-redis/redis/v8
-+          go get github.com/go-redis/redis@none
-+          go mod tidy
-+        '';
-+        # Pass updated go.{mod,sum} from go-modules to srht-keys's vendor/go.{mod,sum}
-+        postInstall = ''
-+          cp --reflink=auto go.* $out
-+        '';
-+      };
-+
-+      patches = [
-+        # Update go-redis to support Unix sockets
-+        patches/redis-socket/scm/v3-0001-srht-keys-update-go-redis-to-support-Unix-sockets.patch
-+      ];
-+      patchFlags = ["-p2"];
-+      postInstall = ''
-+        cp --reflink=auto *.go vendor/go.* $out
-+      '';
-+    };
+-    sha256 = "sha256-/QryPjWJ2S0Ov9DTdrwbM81HYucHiYcLh0oKacflywI=";
++    sha256 = "sha256-iSzzyI8HZOpOb4dyt520MV/wds14fNag2+UOF09KS7w=";
    };
  
    nativeBuildInputs = srht.nativeBuildInputs;
-@@ -25,7 +60,6 @@ buildPythonPackage rec {
-     srht
-     redis
-     pyyaml
--    buildsrht
-   ];
-   preBuild = ''
-@@ -33,11 +67,12 @@ buildPythonPackage rec {
-   '';
-   dontUseSetuptoolsCheck = true;
-+  pythonImportsCheck = [ "scmsrht" ];
-   meta = with lib; {
-     homepage = "https://git.sr.ht/~sircmpwn/git.sr.ht";
-     description = "Shared support code for sr.ht source control services.";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
-   };
- }
 diff --git a/pkgs/applications/version-management/sourcehut/todo.nix b/pkgs/applications/version-management/sourcehut/todo.nix
-index 85e1f5637b6..da494018fc0 100644
+index 1446e68fa69..67367b71ff9 100644
 --- a/pkgs/applications/version-management/sourcehut/todo.nix
 +++ b/pkgs/applications/version-management/sourcehut/todo.nix
-@@ -12,13 +12,13 @@
+@@ -1,5 +1,6 @@
+ { lib
+ , fetchFromSourcehut
++, buildGoModule
+ , buildPythonPackage
+ , srht
+ , redis
+@@ -8,23 +9,31 @@
+ , pytest
+ , factory_boy
+ , python
++, unzip
+ }:
  
  buildPythonPackage rec {
    pname = "todosrht";
--  version = "0.64.14";
-+  version = "0.65.3";
+-  version = "0.67.2";
++  version = "0.71.2";
  
    src = fetchFromSourcehut {
      owner = "~sircmpwn";
      repo = "todo.sr.ht";
      rev = version;
--    sha256 = "sha256-huIAhn6h1F5w5ST4/yBwr82kAzyYwhLu+gpRuOQgnsE=";
-+    sha256 = "sha256-R6ee+s4zojU/dUAIWbkP6TkBoqQY7FKECxnWZr3n59g=";
-   };
-   nativeBuildInputs = srht.nativeBuildInputs;
-@@ -42,11 +42,12 @@ buildPythonPackage rec {
-   ];
-   dontUseSetuptoolsCheck = true;
-+  pythonImportsCheck = [ "todosrht" ];
-   meta = with lib; {
-     homepage = "https://todo.sr.ht/~sircmpwn/todo.sr.ht";
-     description = "Ticket tracking service for the sr.ht network";
--    license = licenses.agpl3;
-+    license = licenses.agpl3Only;
-     maintainers = with maintainers; [ eadwu ];
+-    sha256 = "sha256-/QHsMlhzyah85ubZyx8j4GDUoITuWcLDJKosbZGeOZU=";
++    sha256 = "sha256-m7FY+jXpwPnK1+b1iQiDGe8JPfAFQp65BzGH6WvNwhM=";
    };
- }
-diff --git a/pkgs/applications/version-management/sourcehut/update.sh b/pkgs/applications/version-management/sourcehut/update.sh
-index 156d4cc35e4..1638313697c 100755
---- a/pkgs/applications/version-management/sourcehut/update.sh
-+++ b/pkgs/applications/version-management/sourcehut/update.sh
-@@ -1,8 +1,11 @@
- #! /usr/bin/env nix-shell
- #! nix-shell -i bash -p git mercurial common-updater-scripts
-+set -eux -o pipefail
--cd "$(dirname "${BASH_SOURCE[0]}")"
-+cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
- root=../../../..
-+tmp=$(mktemp -d)
-+trap 'rm -rf "$tmp"' EXIT
- default() {
-   (cd "$root" && nix-instantiate --eval --strict -A "sourcehut.python.pkgs.$1.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/')
-@@ -13,42 +16,61 @@ version() {
- }
- src_url() {
--  (cd "$root" && nix-instantiate --eval --strict -A "sourcehut.python.pkgs.$1.src.drvAttrs.url" | tr -d '"')
-+  nix-instantiate --eval --strict --expr " with import $root {}; let src = sourcehut.python.pkgs.$1.drvAttrs.src; in src.url or src.meta.homepage" | tr -d '"'
- }
- get_latest_version() {
-   src="$(src_url "$1")"
--  tmp=$(mktemp -d)
--
-+  rm -rf "$tmp"
-   if [ "$1" = "hgsrht" ]; then
--    hg clone "$src" "$tmp" &> /dev/null
-+    hg clone "$src" "$tmp" >/dev/null
-     printf "%s" "$(cd "$tmp" && hg log --limit 1 --template '{latesttag}')"
-   else
--    git clone "$src" "$tmp"
--    printf "%s" "$(cd "$tmp" && git describe $(git rev-list --tags --max-count=1))"
-+    git clone "$src" "$tmp" >/dev/null
-+    printf "%s" "$(cd "$tmp" && git describe "$(git rev-list --tags --max-count=1)")"
-   fi
- }
- update_version() {
-   default_nix="$(default "$1")"
--  version_old="$(version "$1")"
-+  oldVersion="$(version "$1")"
-   version="$(get_latest_version "$1")"
  
-   (cd "$root" && update-source-version "sourcehut.python.pkgs.$1" "$version")
--  git add "$default_nix"
--  git commit -m "$1: $version_old -> $version"
-+  # Update vendorSha256 of Go modules
-+  retry=true
-+  while "$retry"; do
-+    retry=false;
-+    exec < <(exec nix -L build -f "$root" sourcehut.python.pkgs."$1" 2>&1)
-+    while IFS=' :' read -r origin hash; do
-+      case "$origin" in
-+        (expected|specified) oldHash="$hash";;
-+        (got) sed -i "s|$oldHash|$hash|" "$default_nix"; retry=true; break;;
-+        (*) printf >&2 "%s\n" "$origin${hash:+:$hash}"
-+      esac
-+    done
-+  done
+-  patches = [
+-    # Revert change breaking Unix socket support for Redis
+-    patches/redis-socket/todo/0001-Revert-Add-webhook-queue-monitoring.patch
+-  ];
++  postPatch = ''
++    substituteInPlace Makefile \
++      --replace "all: api" ""
++  '';
 +
-+  if [ "$oldVersion" != "$version" ]; then
-+    git add "$default_nix"
-+    git commit -m "sourcehut.$1: $oldVersion -> $version"
-+  fi
- }
++  todosrht-api = buildGoModule ({
++    inherit src version;
++    pname = "todosrht-api";
++    modRoot = "api";
++    vendorSha256 = "sha256-ttGT7lUh8O+9KvbaEGWUsthefXQ2ATeli0tnlXCjZFk=";
++  } // import ./fix-gqlgen-trimpath.nix {inherit unzip;});
  
--services=( "srht" "buildsrht" "dispatchsrht" "gitsrht" "hgsrht" "hubsrht" "listssrht" "mansrht"
--           "metasrht" "pastesrht" "todosrht" "scmsrht" )
--
--# Whether or not a specific service is requested
--if [ -n "$1" ]; then
--  version="$(get_latest_version "$1")"
--  (cd "$root" && update-source-version "sourcehut.python.pkgs.$1" "$version")
-+if [ $# -gt 0 ]; then
-+  services=("$@")
- else
--  for service in "${services[@]}"; do
--    update_version "$service"
--  done
-+  # Beware that some packages must be updated before others,
-+  # eg. srht-keys must be update before gitsrht,
-+  # otherwise this script would enter an infinite loop
-+  # because the reported $oldHash to be changed
-+  # may not actually be in $default_nix
-+  # but in the file of one of its dependencies.
-+  services=( "srht" "scmsrht" "srht-keys" "buildsrht" "dispatchsrht" "gitsrht" "hgsrht" "hubsrht" "listssrht" "mansrht"
-+             "metasrht" "pagessrht" "pastesrht" "todosrht" )
- fi
-+
-+for service in "${services[@]}"; do
-+  update_version "$service"
-+done
-diff --git a/pkgs/development/go-modules/generic/default.nix b/pkgs/development/go-modules/generic/default.nix
-index 3b645f9ce8b..f00ca1984ec 100644
---- a/pkgs/development/go-modules/generic/default.nix
-+++ b/pkgs/development/go-modules/generic/default.nix
-@@ -71,6 +71,7 @@ let
-     inherit (go) GOOS GOARCH;
+   nativeBuildInputs = srht.nativeBuildInputs;
  
-     patches = args.patches or [];
-+    patchFlags = args.patchFlags or [];
-     preBuild = args.preBuild or "";
-     sourceRoot = args.sourceRoot or "";
+@@ -40,6 +49,10 @@ buildPythonPackage rec {
+     export SRHT_PATH=${srht}/${python.sitePackages}/srht
+   '';
  
++  postInstall = ''
++    ln -s ${todosrht-api}/bin/api $out/bin/todosrht-api
++  '';
++
+   # pytest tests fail
+   checkInputs = [
+     pytest