Browse Source

Added auto form generator for dns validation ui

Toby Chui 10 months ago
parent
commit
4fec22a788

+ 2 - 0
api.go

@@ -5,6 +5,7 @@ import (
 	"net/http"
 	"net/http/pprof"
 
+	"imuslab.com/zoraxy/mod/acme/acmedns"
 	"imuslab.com/zoraxy/mod/acme/acmewizard"
 	"imuslab.com/zoraxy/mod/auth"
 	"imuslab.com/zoraxy/mod/netstat"
@@ -191,6 +192,7 @@ func initAPIs() {
 	authRouter.HandleFunc("/api/acme/autoRenew/listDomains", acmeAutoRenewer.HandleLoadAutoRenewDomains)
 	authRouter.HandleFunc("/api/acme/autoRenew/renewPolicy", acmeAutoRenewer.HandleRenewPolicy)
 	authRouter.HandleFunc("/api/acme/autoRenew/renewNow", acmeAutoRenewer.HandleRenewNow)
+	authRouter.HandleFunc("/api/acme/dns/providers", acmedns.HandleServeProvidersJson)
 	authRouter.HandleFunc("/api/acme/wizard", acmewizard.HandleGuidedStepCheck) //ACME Wizard
 
 	//Static Web Server

+ 2 - 2
main.go

@@ -52,9 +52,9 @@ var logOutputToFile = flag.Bool("log", true, "Log terminal output to file")
 
 var (
 	name        = "Zoraxy"
-	version     = "3.0.3"
+	version     = "3.0.4"
 	nodeUUID    = "generic"
-	development = false //Set this to false to use embedded web fs
+	development = true //Set this to false to use embedded web fs
 	bootTime    = time.Now().Unix()
 
 	/*

+ 982 - 0
mod/acme/acmedns/acmedns.go

@@ -0,0 +1,982 @@
+package acmedns
+/*
+	THIS MODULE IS GENERATED AUTOMATICALLY
+	DO NOT EDIT THIS FILE
+*/
+import (
+	"encoding/json"
+	"fmt"
+
+	"github.com/go-acme/lego/v4/challenge"
+	"github.com/go-acme/lego/v4/providers/dns/alidns"
+	"github.com/go-acme/lego/v4/providers/dns/allinkl"
+	"github.com/go-acme/lego/v4/providers/dns/arvancloud"
+	"github.com/go-acme/lego/v4/providers/dns/auroradns"
+	"github.com/go-acme/lego/v4/providers/dns/autodns"
+	"github.com/go-acme/lego/v4/providers/dns/azure"
+	"github.com/go-acme/lego/v4/providers/dns/azuredns"
+	"github.com/go-acme/lego/v4/providers/dns/bindman"
+	"github.com/go-acme/lego/v4/providers/dns/bluecat"
+	"github.com/go-acme/lego/v4/providers/dns/brandit"
+	"github.com/go-acme/lego/v4/providers/dns/bunny"
+	"github.com/go-acme/lego/v4/providers/dns/checkdomain"
+	"github.com/go-acme/lego/v4/providers/dns/civo"
+	"github.com/go-acme/lego/v4/providers/dns/clouddns"
+	"github.com/go-acme/lego/v4/providers/dns/cloudflare"
+	"github.com/go-acme/lego/v4/providers/dns/cloudns"
+	"github.com/go-acme/lego/v4/providers/dns/cloudru"
+	"github.com/go-acme/lego/v4/providers/dns/cloudxns"
+	"github.com/go-acme/lego/v4/providers/dns/conoha"
+	"github.com/go-acme/lego/v4/providers/dns/constellix"
+	"github.com/go-acme/lego/v4/providers/dns/cpanel"
+	"github.com/go-acme/lego/v4/providers/dns/derak"
+	"github.com/go-acme/lego/v4/providers/dns/desec"
+	"github.com/go-acme/lego/v4/providers/dns/digitalocean"
+	"github.com/go-acme/lego/v4/providers/dns/dnshomede"
+	"github.com/go-acme/lego/v4/providers/dns/dnsimple"
+	"github.com/go-acme/lego/v4/providers/dns/dnsmadeeasy"
+	"github.com/go-acme/lego/v4/providers/dns/dnspod"
+	"github.com/go-acme/lego/v4/providers/dns/dode"
+	"github.com/go-acme/lego/v4/providers/dns/domeneshop"
+	"github.com/go-acme/lego/v4/providers/dns/dreamhost"
+	"github.com/go-acme/lego/v4/providers/dns/duckdns"
+	"github.com/go-acme/lego/v4/providers/dns/dyn"
+	"github.com/go-acme/lego/v4/providers/dns/dynu"
+	"github.com/go-acme/lego/v4/providers/dns/easydns"
+	"github.com/go-acme/lego/v4/providers/dns/efficientip"
+	"github.com/go-acme/lego/v4/providers/dns/epik"
+	"github.com/go-acme/lego/v4/providers/dns/exoscale"
+	"github.com/go-acme/lego/v4/providers/dns/freemyip"
+	"github.com/go-acme/lego/v4/providers/dns/gandi"
+	"github.com/go-acme/lego/v4/providers/dns/gandiv5"
+	"github.com/go-acme/lego/v4/providers/dns/gcore"
+	"github.com/go-acme/lego/v4/providers/dns/glesys"
+	"github.com/go-acme/lego/v4/providers/dns/godaddy"
+	"github.com/go-acme/lego/v4/providers/dns/googledomains"
+	"github.com/go-acme/lego/v4/providers/dns/hetzner"
+	"github.com/go-acme/lego/v4/providers/dns/hostingde"
+	"github.com/go-acme/lego/v4/providers/dns/hosttech"
+	"github.com/go-acme/lego/v4/providers/dns/httpnet"
+	"github.com/go-acme/lego/v4/providers/dns/hyperone"
+	"github.com/go-acme/lego/v4/providers/dns/ibmcloud"
+	"github.com/go-acme/lego/v4/providers/dns/iij"
+	"github.com/go-acme/lego/v4/providers/dns/iijdpf"
+	"github.com/go-acme/lego/v4/providers/dns/infoblox"
+	"github.com/go-acme/lego/v4/providers/dns/infomaniak"
+	"github.com/go-acme/lego/v4/providers/dns/internetbs"
+	"github.com/go-acme/lego/v4/providers/dns/inwx"
+	"github.com/go-acme/lego/v4/providers/dns/ionos"
+	"github.com/go-acme/lego/v4/providers/dns/ipv64"
+	"github.com/go-acme/lego/v4/providers/dns/iwantmyname"
+	"github.com/go-acme/lego/v4/providers/dns/joker"
+	"github.com/go-acme/lego/v4/providers/dns/liara"
+	"github.com/go-acme/lego/v4/providers/dns/lightsail"
+	"github.com/go-acme/lego/v4/providers/dns/linode"
+	"github.com/go-acme/lego/v4/providers/dns/liquidweb"
+	"github.com/go-acme/lego/v4/providers/dns/loopia"
+	"github.com/go-acme/lego/v4/providers/dns/luadns"
+	"github.com/go-acme/lego/v4/providers/dns/mailinabox"
+	"github.com/go-acme/lego/v4/providers/dns/metaname"
+	"github.com/go-acme/lego/v4/providers/dns/mydnsjp"
+	"github.com/go-acme/lego/v4/providers/dns/namecheap"
+	"github.com/go-acme/lego/v4/providers/dns/namedotcom"
+	"github.com/go-acme/lego/v4/providers/dns/namesilo"
+	"github.com/go-acme/lego/v4/providers/dns/nearlyfreespeech"
+	"github.com/go-acme/lego/v4/providers/dns/netcup"
+	"github.com/go-acme/lego/v4/providers/dns/netlify"
+	"github.com/go-acme/lego/v4/providers/dns/nicmanager"
+	"github.com/go-acme/lego/v4/providers/dns/nifcloud"
+	"github.com/go-acme/lego/v4/providers/dns/njalla"
+	"github.com/go-acme/lego/v4/providers/dns/nodion"
+	"github.com/go-acme/lego/v4/providers/dns/ns1"
+	"github.com/go-acme/lego/v4/providers/dns/otc"
+	"github.com/go-acme/lego/v4/providers/dns/ovh"
+	"github.com/go-acme/lego/v4/providers/dns/pdns"
+	"github.com/go-acme/lego/v4/providers/dns/plesk"
+	"github.com/go-acme/lego/v4/providers/dns/porkbun"
+	"github.com/go-acme/lego/v4/providers/dns/rackspace"
+	"github.com/go-acme/lego/v4/providers/dns/rcodezero"
+	"github.com/go-acme/lego/v4/providers/dns/regru"
+	"github.com/go-acme/lego/v4/providers/dns/rfc2136"
+	"github.com/go-acme/lego/v4/providers/dns/rimuhosting"
+	"github.com/go-acme/lego/v4/providers/dns/route53"
+	"github.com/go-acme/lego/v4/providers/dns/safedns"
+	"github.com/go-acme/lego/v4/providers/dns/sakuracloud"
+	"github.com/go-acme/lego/v4/providers/dns/scaleway"
+	"github.com/go-acme/lego/v4/providers/dns/selectel"
+	"github.com/go-acme/lego/v4/providers/dns/servercow"
+	"github.com/go-acme/lego/v4/providers/dns/shellrent"
+	"github.com/go-acme/lego/v4/providers/dns/simply"
+	"github.com/go-acme/lego/v4/providers/dns/sonic"
+	"github.com/go-acme/lego/v4/providers/dns/stackpath"
+	"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
+	"github.com/go-acme/lego/v4/providers/dns/transip"
+	"github.com/go-acme/lego/v4/providers/dns/ultradns"
+	"github.com/go-acme/lego/v4/providers/dns/variomedia"
+	"github.com/go-acme/lego/v4/providers/dns/vegadns"
+	"github.com/go-acme/lego/v4/providers/dns/vercel"
+	"github.com/go-acme/lego/v4/providers/dns/versio"
+	"github.com/go-acme/lego/v4/providers/dns/vinyldns"
+	"github.com/go-acme/lego/v4/providers/dns/vkcloud"
+	"github.com/go-acme/lego/v4/providers/dns/vscale"
+	"github.com/go-acme/lego/v4/providers/dns/vultr"
+	"github.com/go-acme/lego/v4/providers/dns/webnames"
+	"github.com/go-acme/lego/v4/providers/dns/websupport"
+	"github.com/go-acme/lego/v4/providers/dns/wedos"
+	"github.com/go-acme/lego/v4/providers/dns/yandex"
+	"github.com/go-acme/lego/v4/providers/dns/yandex360"
+	"github.com/go-acme/lego/v4/providers/dns/yandexcloud"
+	"github.com/go-acme/lego/v4/providers/dns/zoneee"
+	"github.com/go-acme/lego/v4/providers/dns/zonomi"
+
+)
+
+//name is the DNS provider name, e.g. cloudflare or gandi
+//JSON (js) must be in key-value string that match ConfigableFields Title in providers.json, e.g. {"Username":"far","Password":"boo"}
+func GetDNSProviderByJsonConfig(name string, js string)(challenge.Provider, error){
+	switch name {
+
+	case "alidns":
+		cfg := alidns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return alidns.NewDNSProviderConfig(&cfg)
+	case "allinkl":
+		cfg := allinkl.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return allinkl.NewDNSProviderConfig(&cfg)
+	case "arvancloud":
+		cfg := arvancloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return arvancloud.NewDNSProviderConfig(&cfg)
+	case "auroradns":
+		cfg := auroradns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return auroradns.NewDNSProviderConfig(&cfg)
+	case "autodns":
+		cfg := autodns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return autodns.NewDNSProviderConfig(&cfg)
+	case "azure":
+		cfg := azure.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azure.NewDNSProviderConfig(&cfg)
+	case "azuredns":
+		cfg := azuredns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azuredns.NewDNSProviderConfig(&cfg)
+	case "bindman":
+		cfg := bindman.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bindman.NewDNSProviderConfig(&cfg)
+	case "bluecat":
+		cfg := bluecat.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bluecat.NewDNSProviderConfig(&cfg)
+	case "brandit":
+		cfg := brandit.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return brandit.NewDNSProviderConfig(&cfg)
+	case "bunny":
+		cfg := bunny.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bunny.NewDNSProviderConfig(&cfg)
+	case "checkdomain":
+		cfg := checkdomain.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return checkdomain.NewDNSProviderConfig(&cfg)
+	case "civo":
+		cfg := civo.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return civo.NewDNSProviderConfig(&cfg)
+	case "clouddns":
+		cfg := clouddns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clouddns.NewDNSProviderConfig(&cfg)
+	case "cloudflare":
+		cfg := cloudflare.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudflare.NewDNSProviderConfig(&cfg)
+	case "cloudns":
+		cfg := cloudns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudns.NewDNSProviderConfig(&cfg)
+	case "cloudru":
+		cfg := cloudru.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudru.NewDNSProviderConfig(&cfg)
+	case "cloudxns":
+		cfg := cloudxns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudxns.NewDNSProviderConfig(&cfg)
+	case "conoha":
+		cfg := conoha.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return conoha.NewDNSProviderConfig(&cfg)
+	case "constellix":
+		cfg := constellix.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return constellix.NewDNSProviderConfig(&cfg)
+	case "cpanel":
+		cfg := cpanel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cpanel.NewDNSProviderConfig(&cfg)
+	case "derak":
+		cfg := derak.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return derak.NewDNSProviderConfig(&cfg)
+	case "desec":
+		cfg := desec.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return desec.NewDNSProviderConfig(&cfg)
+	case "digitalocean":
+		cfg := digitalocean.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return digitalocean.NewDNSProviderConfig(&cfg)
+	case "dnshomede":
+		cfg := dnshomede.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnshomede.NewDNSProviderConfig(&cfg)
+	case "dnsimple":
+		cfg := dnsimple.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsimple.NewDNSProviderConfig(&cfg)
+	case "dnsmadeeasy":
+		cfg := dnsmadeeasy.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsmadeeasy.NewDNSProviderConfig(&cfg)
+	case "dnspod":
+		cfg := dnspod.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnspod.NewDNSProviderConfig(&cfg)
+	case "dode":
+		cfg := dode.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dode.NewDNSProviderConfig(&cfg)
+	case "domeneshop":
+		cfg := domeneshop.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return domeneshop.NewDNSProviderConfig(&cfg)
+	case "dreamhost":
+		cfg := dreamhost.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dreamhost.NewDNSProviderConfig(&cfg)
+	case "duckdns":
+		cfg := duckdns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return duckdns.NewDNSProviderConfig(&cfg)
+	case "dyn":
+		cfg := dyn.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dyn.NewDNSProviderConfig(&cfg)
+	case "dynu":
+		cfg := dynu.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dynu.NewDNSProviderConfig(&cfg)
+	case "easydns":
+		cfg := easydns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return easydns.NewDNSProviderConfig(&cfg)
+	case "efficientip":
+		cfg := efficientip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return efficientip.NewDNSProviderConfig(&cfg)
+	case "epik":
+		cfg := epik.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return epik.NewDNSProviderConfig(&cfg)
+	case "exoscale":
+		cfg := exoscale.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return exoscale.NewDNSProviderConfig(&cfg)
+	case "freemyip":
+		cfg := freemyip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return freemyip.NewDNSProviderConfig(&cfg)
+	case "gandi":
+		cfg := gandi.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandi.NewDNSProviderConfig(&cfg)
+	case "gandiv5":
+		cfg := gandiv5.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandiv5.NewDNSProviderConfig(&cfg)
+	case "gcore":
+		cfg := gcore.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gcore.NewDNSProviderConfig(&cfg)
+	case "glesys":
+		cfg := glesys.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return glesys.NewDNSProviderConfig(&cfg)
+	case "godaddy":
+		cfg := godaddy.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return godaddy.NewDNSProviderConfig(&cfg)
+	case "googledomains":
+		cfg := googledomains.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return googledomains.NewDNSProviderConfig(&cfg)
+	case "hetzner":
+		cfg := hetzner.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hetzner.NewDNSProviderConfig(&cfg)
+	case "hostingde":
+		cfg := hostingde.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hostingde.NewDNSProviderConfig(&cfg)
+	case "hosttech":
+		cfg := hosttech.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hosttech.NewDNSProviderConfig(&cfg)
+	case "httpnet":
+		cfg := httpnet.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return httpnet.NewDNSProviderConfig(&cfg)
+	case "hyperone":
+		cfg := hyperone.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hyperone.NewDNSProviderConfig(&cfg)
+	case "ibmcloud":
+		cfg := ibmcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ibmcloud.NewDNSProviderConfig(&cfg)
+	case "iij":
+		cfg := iij.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iij.NewDNSProviderConfig(&cfg)
+	case "iijdpf":
+		cfg := iijdpf.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iijdpf.NewDNSProviderConfig(&cfg)
+	case "infoblox":
+		cfg := infoblox.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infoblox.NewDNSProviderConfig(&cfg)
+	case "infomaniak":
+		cfg := infomaniak.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infomaniak.NewDNSProviderConfig(&cfg)
+	case "internetbs":
+		cfg := internetbs.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return internetbs.NewDNSProviderConfig(&cfg)
+	case "inwx":
+		cfg := inwx.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return inwx.NewDNSProviderConfig(&cfg)
+	case "ionos":
+		cfg := ionos.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ionos.NewDNSProviderConfig(&cfg)
+	case "ipv64":
+		cfg := ipv64.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ipv64.NewDNSProviderConfig(&cfg)
+	case "iwantmyname":
+		cfg := iwantmyname.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iwantmyname.NewDNSProviderConfig(&cfg)
+	case "joker":
+		cfg := joker.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return joker.NewDNSProviderConfig(&cfg)
+	case "liara":
+		cfg := liara.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liara.NewDNSProviderConfig(&cfg)
+	case "lightsail":
+		cfg := lightsail.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return lightsail.NewDNSProviderConfig(&cfg)
+	case "linode":
+		cfg := linode.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return linode.NewDNSProviderConfig(&cfg)
+	case "liquidweb":
+		cfg := liquidweb.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liquidweb.NewDNSProviderConfig(&cfg)
+	case "loopia":
+		cfg := loopia.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return loopia.NewDNSProviderConfig(&cfg)
+	case "luadns":
+		cfg := luadns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return luadns.NewDNSProviderConfig(&cfg)
+	case "mailinabox":
+		cfg := mailinabox.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return mailinabox.NewDNSProviderConfig(&cfg)
+	case "metaname":
+		cfg := metaname.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return metaname.NewDNSProviderConfig(&cfg)
+	case "mydnsjp":
+		cfg := mydnsjp.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return mydnsjp.NewDNSProviderConfig(&cfg)
+	case "namecheap":
+		cfg := namecheap.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namecheap.NewDNSProviderConfig(&cfg)
+	case "namedotcom":
+		cfg := namedotcom.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namedotcom.NewDNSProviderConfig(&cfg)
+	case "namesilo":
+		cfg := namesilo.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namesilo.NewDNSProviderConfig(&cfg)
+	case "nearlyfreespeech":
+		cfg := nearlyfreespeech.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nearlyfreespeech.NewDNSProviderConfig(&cfg)
+	case "netcup":
+		cfg := netcup.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netcup.NewDNSProviderConfig(&cfg)
+	case "netlify":
+		cfg := netlify.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netlify.NewDNSProviderConfig(&cfg)
+	case "nicmanager":
+		cfg := nicmanager.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nicmanager.NewDNSProviderConfig(&cfg)
+	case "nifcloud":
+		cfg := nifcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nifcloud.NewDNSProviderConfig(&cfg)
+	case "njalla":
+		cfg := njalla.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return njalla.NewDNSProviderConfig(&cfg)
+	case "nodion":
+		cfg := nodion.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nodion.NewDNSProviderConfig(&cfg)
+	case "ns1":
+		cfg := ns1.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ns1.NewDNSProviderConfig(&cfg)
+	case "otc":
+		cfg := otc.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return otc.NewDNSProviderConfig(&cfg)
+	case "ovh":
+		cfg := ovh.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ovh.NewDNSProviderConfig(&cfg)
+	case "pdns":
+		cfg := pdns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return pdns.NewDNSProviderConfig(&cfg)
+	case "plesk":
+		cfg := plesk.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return plesk.NewDNSProviderConfig(&cfg)
+	case "porkbun":
+		cfg := porkbun.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return porkbun.NewDNSProviderConfig(&cfg)
+	case "rackspace":
+		cfg := rackspace.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rackspace.NewDNSProviderConfig(&cfg)
+	case "rcodezero":
+		cfg := rcodezero.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rcodezero.NewDNSProviderConfig(&cfg)
+	case "regru":
+		cfg := regru.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return regru.NewDNSProviderConfig(&cfg)
+	case "rfc2136":
+		cfg := rfc2136.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rfc2136.NewDNSProviderConfig(&cfg)
+	case "rimuhosting":
+		cfg := rimuhosting.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rimuhosting.NewDNSProviderConfig(&cfg)
+	case "route53":
+		cfg := route53.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return route53.NewDNSProviderConfig(&cfg)
+	case "safedns":
+		cfg := safedns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return safedns.NewDNSProviderConfig(&cfg)
+	case "sakuracloud":
+		cfg := sakuracloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sakuracloud.NewDNSProviderConfig(&cfg)
+	case "scaleway":
+		cfg := scaleway.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return scaleway.NewDNSProviderConfig(&cfg)
+	case "selectel":
+		cfg := selectel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return selectel.NewDNSProviderConfig(&cfg)
+	case "servercow":
+		cfg := servercow.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return servercow.NewDNSProviderConfig(&cfg)
+	case "shellrent":
+		cfg := shellrent.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return shellrent.NewDNSProviderConfig(&cfg)
+	case "simply":
+		cfg := simply.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return simply.NewDNSProviderConfig(&cfg)
+	case "sonic":
+		cfg := sonic.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sonic.NewDNSProviderConfig(&cfg)
+	case "stackpath":
+		cfg := stackpath.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return stackpath.NewDNSProviderConfig(&cfg)
+	case "tencentcloud":
+		cfg := tencentcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return tencentcloud.NewDNSProviderConfig(&cfg)
+	case "transip":
+		cfg := transip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return transip.NewDNSProviderConfig(&cfg)
+	case "ultradns":
+		cfg := ultradns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ultradns.NewDNSProviderConfig(&cfg)
+	case "variomedia":
+		cfg := variomedia.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return variomedia.NewDNSProviderConfig(&cfg)
+	case "vegadns":
+		cfg := vegadns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vegadns.NewDNSProviderConfig(&cfg)
+	case "vercel":
+		cfg := vercel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vercel.NewDNSProviderConfig(&cfg)
+	case "versio":
+		cfg := versio.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return versio.NewDNSProviderConfig(&cfg)
+	case "vinyldns":
+		cfg := vinyldns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vinyldns.NewDNSProviderConfig(&cfg)
+	case "vkcloud":
+		cfg := vkcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vkcloud.NewDNSProviderConfig(&cfg)
+	case "vscale":
+		cfg := vscale.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vscale.NewDNSProviderConfig(&cfg)
+	case "vultr":
+		cfg := vultr.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vultr.NewDNSProviderConfig(&cfg)
+	case "webnames":
+		cfg := webnames.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return webnames.NewDNSProviderConfig(&cfg)
+	case "websupport":
+		cfg := websupport.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return websupport.NewDNSProviderConfig(&cfg)
+	case "wedos":
+		cfg := wedos.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return wedos.NewDNSProviderConfig(&cfg)
+	case "yandex":
+		cfg := yandex.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex.NewDNSProviderConfig(&cfg)
+	case "yandex360":
+		cfg := yandex360.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex360.NewDNSProviderConfig(&cfg)
+	case "yandexcloud":
+		cfg := yandexcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandexcloud.NewDNSProviderConfig(&cfg)
+	case "zoneee":
+		cfg := zoneee.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return zoneee.NewDNSProviderConfig(&cfg)
+	case "zonomi":
+		cfg := zonomi.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return zonomi.NewDNSProviderConfig(&cfg)
+	default:
+		return nil, fmt.Errorf("unrecognized DNS provider: %s", name)
+	}
+}

+ 27 - 0
mod/acme/acmedns/acmedns_test.go

@@ -0,0 +1,27 @@
+package acmedns_test
+
+import (
+	"fmt"
+	"testing"
+
+	"imuslab.com/zoraxy/mod/acme/acmedns"
+)
+
+// Test if the structure of ACME DNS config can be reflected from lego source code definations
+func TestACMEDNSConfigStructureReflector(t *testing.T) {
+	providers := []string{
+		"gandi",
+		"cloudflare",
+		"azure",
+	}
+
+	for _, provider := range providers {
+		strcture, err := acmedns.GetProviderConfigStructure(provider)
+		if err != nil {
+			panic(err)
+		}
+
+		fmt.Println(strcture)
+	}
+
+}

+ 3893 - 0
mod/acme/acmedns/providers.json

@@ -0,0 +1,3893 @@
+{
+ "alidns": {
+  "Name": "alidns",
+  "ConfigableFields": [
+   {
+    "Title": "RAMRole",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecurityToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "RegionID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "allinkl": {
+  "Name": "allinkl",
+  "ConfigableFields": [
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "arvancloud": {
+  "Name": "arvancloud",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "auroradns": {
+  "Name": "auroradns",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "autodns": {
+  "Name": "autodns",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Context",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "azure": {
+  "Name": "azure",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubscriptionID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceGroup",
+    "Datatype": "string"
+   },
+   {
+    "Title": "MetadataEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceManagerEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ActiveDirectoryEndpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PrivateZone",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "azuredns": {
+  "Name": "azuredns",
+  "ConfigableFields": [
+   {
+    "Title": "SubscriptionID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceGroup",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCTokenFilePath",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCRequestURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCRequestToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthMethod",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ServiceDiscoveryFilter",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PrivateZone",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "Environment",
+    "Datatype": "cloud.Configuration"
+   },
+   {
+    "Title": "AuthMSITimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bindman": {
+  "Name": "bindman",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bluecat": {
+  "Name": "bluecat",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ConfigName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSView",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "brandit": {
+  "Name": "brandit",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUsername",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bunny": {
+  "Name": "bunny",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "checkdomain": {
+  "Name": "checkdomain",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "civo": {
+  "Name": "civo",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "clouddns": {
+  "Name": "clouddns",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudflare": {
+  "Name": "cloudflare",
+  "ConfigableFields": [
+   {
+    "Title": "AuthEmail",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudns": {
+  "Name": "cloudns",
+  "ConfigableFields": [
+   {
+    "Title": "AuthID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubAuthID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthPassword",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudru": {
+  "Name": "cloudru",
+  "ConfigableFields": [
+   {
+    "Title": "ServiceInstanceID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "KeyID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "cloudxns": {
+  "Name": "cloudxns",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "conoha": {
+  "Name": "conoha",
+  "ConfigableFields": [
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "constellix": {
+  "Name": "constellix",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cpanel": {
+  "Name": "cpanel",
+  "ConfigableFields": [
+   {
+    "Title": "Mode",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "derak": {
+  "Name": "derak",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "WebsiteID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "desec": {
+  "Name": "desec",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "digitalocean": {
+  "Name": "digitalocean",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dnshomede": {
+  "Name": "dnshomede",
+  "ConfigableFields": [],
+  "HiddenFields": [
+   {
+    "Title": "Credentials",
+    "Datatype": "map[string]string"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dnsimple": {
+  "Name": "dnsimple",
+  "ConfigableFields": [
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dnsmadeeasy": {
+  "Name": "dnsmadeeasy",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "Sandbox",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dnspod": {
+  "Name": "dnspod",
+  "ConfigableFields": [
+   {
+    "Title": "LoginToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dode": {
+  "Name": "dode",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "domeneshop": {
+  "Name": "domeneshop",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dreamhost": {
+  "Name": "dreamhost",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "duckdns": {
+  "Name": "duckdns",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dyn": {
+  "Name": "dyn",
+  "ConfigableFields": [
+   {
+    "Title": "CustomerName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dynu": {
+  "Name": "dynu",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "easydns": {
+  "Name": "easydns",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Key",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "efficientip": {
+  "Name": "efficientip",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Hostname",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ViewName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "InsecureSkipVerify",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "epik": {
+  "Name": "epik",
+  "ConfigableFields": [
+   {
+    "Title": "Signature",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "exoscale": {
+  "Name": "exoscale",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Endpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int64"
+   }
+  ]
+ },
+ "freemyip": {
+  "Name": "freemyip",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "gandi": {
+  "Name": "gandi",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "gandiv5": {
+  "Name": "gandiv5",
+  "ConfigableFields": [
+   {
+    "Title": "fieldName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "authZone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "gcore": {
+  "Name": "gcore",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "glesys": {
+  "Name": "glesys",
+  "ConfigableFields": [
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "godaddy": {
+  "Name": "godaddy",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "googledomains": {
+  "Name": "googledomains",
+  "ConfigableFields": [
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hetzner": {
+  "Name": "hetzner",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hostingde": {
+  "Name": "hostingde",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hosttech": {
+  "Name": "hosttech",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "httpnet": {
+  "Name": "httpnet",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hyperone": {
+  "Name": "hyperone",
+  "ConfigableFields": [
+   {
+    "Title": "APIEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "LocationID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "PassportLocation",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ibmcloud": {
+  "Name": "ibmcloud",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "iij": {
+  "Name": "iij",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DoServiceCode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "iijdpf": {
+  "Name": "iijdpf",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ServiceCode",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Endpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "infoblox": {
+  "Name": "infoblox",
+  "ConfigableFields": [
+   {
+    "Title": "Host",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Port",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSView",
+    "Datatype": "string"
+   },
+   {
+    "Title": "WapiVersion",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SSLVerify",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "infomaniak": {
+  "Name": "infomaniak",
+  "ConfigableFields": [
+   {
+    "Title": "APIEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "internetbs": {
+  "Name": "internetbs",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "inwx": {
+  "Name": "inwx",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SharedSecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "Sandbox",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "ionos": {
+  "Name": "ionos",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ipv64": {
+  "Name": "ipv64",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "iwantmyname": {
+  "Name": "iwantmyname",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "joker": {
+  "Name": "joker",
+  "ConfigableFields": [
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIMode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "liara": {
+  "Name": "liara",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "lightsail": {
+  "Name": "lightsail",
+  "ConfigableFields": [
+   {
+    "Title": "DNSZone",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "linode": {
+  "Name": "linode",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "liquidweb": {
+  "Name": "liquidweb",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Zone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "loopia": {
+  "Name": "loopia",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIPassword",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "luadns": {
+  "Name": "luadns",
+  "ConfigableFields": [
+   {
+    "Title": "APIUsername",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "mailinabox": {
+  "Name": "mailinabox",
+  "ConfigableFields": [
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "metaname": {
+  "Name": "metaname",
+  "ConfigableFields": [
+   {
+    "Title": "AccountReference",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "mydnsjp": {
+  "Name": "mydnsjp",
+  "ConfigableFields": [
+   {
+    "Title": "MasterID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "namecheap": {
+  "Name": "namecheap",
+  "ConfigableFields": [
+   {
+    "Title": "domain",
+    "Datatype": "string"
+   },
+   {
+    "Title": "key",
+    "Datatype": "string"
+   },
+   {
+    "Title": "keyFqdn",
+    "Datatype": "string"
+   },
+   {
+    "Title": "keyValue",
+    "Datatype": "string"
+   },
+   {
+    "Title": "tld",
+    "Datatype": "string"
+   },
+   {
+    "Title": "sld",
+    "Datatype": "string"
+   },
+   {
+    "Title": "host",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "namedotcom": {
+  "Name": "namedotcom",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Server",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "namesilo": {
+  "Name": "namesilo",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "nearlyfreespeech": {
+  "Name": "nearlyfreespeech",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "netcup": {
+  "Name": "netcup",
+  "ConfigableFields": [
+   {
+    "Title": "Key",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Customer",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "netlify": {
+  "Name": "netlify",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nicmanager": {
+  "Name": "nicmanager",
+  "ConfigableFields": [
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OTPSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Mode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nifcloud": {
+  "Name": "nifcloud",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "njalla": {
+  "Name": "njalla",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nodion": {
+  "Name": "nodion",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ns1": {
+  "Name": "ns1",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "otc": {
+  "Name": "otc",
+  "ConfigableFields": [
+   {
+    "Title": "IdentityEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DomainName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ProjectName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ovh": {
+  "Name": "ovh",
+  "ConfigableFields": [
+   {
+    "Title": "FieldType",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubDomain",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Target",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Zone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "ID",
+    "Datatype": "int64"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "pdns": {
+  "Name": "pdns",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Host",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "ServerName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIVersion",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "plesk": {
+  "Name": "plesk",
+  "ConfigableFields": [
+   {
+    "Title": "baseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "porkbun": {
+  "Name": "porkbun",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretAPIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rackspace": {
+  "Name": "rackspace",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rcodezero": {
+  "Name": "rcodezero",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "regru": {
+  "Name": "regru",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TLSCert",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TLSKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rfc2136": {
+  "Name": "rfc2136",
+  "ConfigableFields": [
+   {
+    "Title": "Nameserver",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGAlgorithm",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGSecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "DNSTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "rimuhosting": {
+  "Name": "rimuhosting",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "route53": {
+  "Name": "route53",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKeyID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretAccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SessionToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "HostedZoneID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "MaxRetries",
+    "Datatype": "int"
+   },
+   {
+    "Title": "AssumeRoleArn",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ExternalID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "WaitForRecordSetsChanged",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "Client",
+    "Datatype": "*route53.Client"
+   }
+  ]
+ },
+ "safedns": {
+  "Name": "safedns",
+  "ConfigableFields": [
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "sakuracloud": {
+  "Name": "sakuracloud",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "scaleway": {
+  "Name": "scaleway",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "selectel": {
+  "Name": "selectel",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "servercow": {
+  "Name": "servercow",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "shellrent": {
+  "Name": "shellrent",
+  "ConfigableFields": [
+   {
+    "Title": "domainID",
+    "Datatype": "int"
+   },
+   {
+    "Title": "recordID",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "simply": {
+  "Name": "simply",
+  "ConfigableFields": [
+   {
+    "Title": "AccountName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "sonic": {
+  "Name": "sonic",
+  "ConfigableFields": [
+   {
+    "Title": "UserID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "stackpath": {
+  "Name": "stackpath",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "StackID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "tencentcloud": {
+  "Name": "tencentcloud",
+  "ConfigableFields": [
+   {
+    "Title": "SecretID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SessionToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "transip": {
+  "Name": "transip",
+  "ConfigableFields": [
+   {
+    "Title": "AccountName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "PrivateKeyPath",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int64"
+   }
+  ]
+ },
+ "ultradns": {
+  "Name": "ultradns",
+  "ConfigableFields": [],
+  "HiddenFields": [
+   {
+    "Title": "config",
+    "Datatype": "*Config"
+   },
+   {
+    "Title": "client",
+    "Datatype": "*client.Client"
+   }
+  ]
+ },
+ "variomedia": {
+  "Name": "variomedia",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vegadns": {
+  "Name": "vegadns",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "vercel": {
+  "Name": "vercel",
+  "ConfigableFields": [
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TeamID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "versio": {
+  "Name": "versio",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vinyldns": {
+  "Name": "vinyldns",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Host",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "vkcloud": {
+  "Name": "vkcloud",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "IdentityEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DomainName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "vscale": {
+  "Name": "vscale",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vultr": {
+  "Name": "vultr",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "webnames": {
+  "Name": "webnames",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "websupport": {
+  "Name": "websupport",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "wedos": {
+  "Name": "wedos",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandex": {
+  "Name": "yandex",
+  "ConfigableFields": [
+   {
+    "Title": "PddToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandex360": {
+  "Name": "yandex360",
+  "ConfigableFields": [
+   {
+    "Title": "OAuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "OrgID",
+    "Datatype": "int64"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandexcloud": {
+  "Name": "yandexcloud",
+  "ConfigableFields": [
+   {
+    "Title": "IamToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "FolderID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "zoneee": {
+  "Name": "zoneee",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "zonomi": {
+  "Name": "zonomi",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ }
+}

+ 80 - 0
mod/acme/acmedns/providerutils.go

@@ -0,0 +1,80 @@
+package acmedns
+
+import (
+	_ "embed"
+	"encoding/json"
+	"errors"
+	"net/http"
+
+	"imuslab.com/zoraxy/mod/utils"
+)
+
+//go:embed providers.json
+var providers []byte //A list of providers generated by acmedns code-generator
+
+type ConfigTemplate struct {
+	Name             string `json:"Name"`
+	ConfigableFields []struct {
+		Title    string `json:"Title"`
+		Datatype string `json:"Datatype"`
+	} `json:"ConfigableFields"`
+	HiddenFields []struct {
+		Title    string `json:"Title"`
+		Datatype string `json:"Datatype"`
+	} `json:"HiddenFields"`
+}
+
+// Return a map of string => datatype
+func GetProviderConfigStructure(providerName string) (map[string]string, error) {
+	//Load the target config template from embedded providers.json
+	configTemplateMap := map[string]ConfigTemplate{}
+	err := json.Unmarshal(providers, &configTemplateMap)
+	if err != nil {
+		return map[string]string{}, err
+	}
+
+	targetConfigTemplate, ok := configTemplateMap[providerName]
+	if !ok {
+		return map[string]string{}, errors.New("provider not supported")
+	}
+
+	results := map[string]string{}
+	for _, field := range targetConfigTemplate.ConfigableFields {
+		results[field.Title] = field.Datatype
+	}
+
+	return results, nil
+}
+
+// HandleServeProvidersJson return the list of supported providers as json
+func HandleServeProvidersJson(w http.ResponseWriter, r *http.Request) {
+	providerName, _ := utils.GetPara(r, "name")
+	if providerName == "" {
+		//Send the current list of providers
+		configTemplateMap := map[string]ConfigTemplate{}
+		err := json.Unmarshal(providers, &configTemplateMap)
+		if err != nil {
+			utils.SendErrorResponse(w, "failed to load DNS provider")
+			return
+		}
+
+		//Parse the provider names into an array
+		providers := []string{}
+		for providerName, _ := range configTemplateMap {
+			providers = append(providers, providerName)
+		}
+
+		js, _ := json.Marshal(providers)
+		utils.SendJSONResponse(w, string(js))
+		return
+	}
+	//Get the config for that provider
+	confTemplate, err := GetProviderConfigStructure(providerName)
+	if err != nil {
+		utils.SendErrorResponse(w, err.Error())
+		return
+	}
+
+	js, _ := json.Marshal(confTemplate)
+	utils.SendJSONResponse(w, string(js))
+}

+ 982 - 0
tools/provider_config_updater/acmedns/acmedns.go

@@ -0,0 +1,982 @@
+package acmedns
+/*
+	THIS MODULE IS GENERATED AUTOMATICALLY
+	DO NOT EDIT THIS FILE
+*/
+import (
+	"encoding/json"
+	"fmt"
+
+	"github.com/go-acme/lego/v4/challenge"
+	"github.com/go-acme/lego/v4/providers/dns/alidns"
+	"github.com/go-acme/lego/v4/providers/dns/allinkl"
+	"github.com/go-acme/lego/v4/providers/dns/arvancloud"
+	"github.com/go-acme/lego/v4/providers/dns/auroradns"
+	"github.com/go-acme/lego/v4/providers/dns/autodns"
+	"github.com/go-acme/lego/v4/providers/dns/azure"
+	"github.com/go-acme/lego/v4/providers/dns/azuredns"
+	"github.com/go-acme/lego/v4/providers/dns/bindman"
+	"github.com/go-acme/lego/v4/providers/dns/bluecat"
+	"github.com/go-acme/lego/v4/providers/dns/brandit"
+	"github.com/go-acme/lego/v4/providers/dns/bunny"
+	"github.com/go-acme/lego/v4/providers/dns/checkdomain"
+	"github.com/go-acme/lego/v4/providers/dns/civo"
+	"github.com/go-acme/lego/v4/providers/dns/clouddns"
+	"github.com/go-acme/lego/v4/providers/dns/cloudflare"
+	"github.com/go-acme/lego/v4/providers/dns/cloudns"
+	"github.com/go-acme/lego/v4/providers/dns/cloudru"
+	"github.com/go-acme/lego/v4/providers/dns/cloudxns"
+	"github.com/go-acme/lego/v4/providers/dns/conoha"
+	"github.com/go-acme/lego/v4/providers/dns/constellix"
+	"github.com/go-acme/lego/v4/providers/dns/cpanel"
+	"github.com/go-acme/lego/v4/providers/dns/derak"
+	"github.com/go-acme/lego/v4/providers/dns/desec"
+	"github.com/go-acme/lego/v4/providers/dns/digitalocean"
+	"github.com/go-acme/lego/v4/providers/dns/dnshomede"
+	"github.com/go-acme/lego/v4/providers/dns/dnsimple"
+	"github.com/go-acme/lego/v4/providers/dns/dnsmadeeasy"
+	"github.com/go-acme/lego/v4/providers/dns/dnspod"
+	"github.com/go-acme/lego/v4/providers/dns/dode"
+	"github.com/go-acme/lego/v4/providers/dns/domeneshop"
+	"github.com/go-acme/lego/v4/providers/dns/dreamhost"
+	"github.com/go-acme/lego/v4/providers/dns/duckdns"
+	"github.com/go-acme/lego/v4/providers/dns/dyn"
+	"github.com/go-acme/lego/v4/providers/dns/dynu"
+	"github.com/go-acme/lego/v4/providers/dns/easydns"
+	"github.com/go-acme/lego/v4/providers/dns/efficientip"
+	"github.com/go-acme/lego/v4/providers/dns/epik"
+	"github.com/go-acme/lego/v4/providers/dns/exoscale"
+	"github.com/go-acme/lego/v4/providers/dns/freemyip"
+	"github.com/go-acme/lego/v4/providers/dns/gandi"
+	"github.com/go-acme/lego/v4/providers/dns/gandiv5"
+	"github.com/go-acme/lego/v4/providers/dns/gcore"
+	"github.com/go-acme/lego/v4/providers/dns/glesys"
+	"github.com/go-acme/lego/v4/providers/dns/godaddy"
+	"github.com/go-acme/lego/v4/providers/dns/googledomains"
+	"github.com/go-acme/lego/v4/providers/dns/hetzner"
+	"github.com/go-acme/lego/v4/providers/dns/hostingde"
+	"github.com/go-acme/lego/v4/providers/dns/hosttech"
+	"github.com/go-acme/lego/v4/providers/dns/httpnet"
+	"github.com/go-acme/lego/v4/providers/dns/hyperone"
+	"github.com/go-acme/lego/v4/providers/dns/ibmcloud"
+	"github.com/go-acme/lego/v4/providers/dns/iij"
+	"github.com/go-acme/lego/v4/providers/dns/iijdpf"
+	"github.com/go-acme/lego/v4/providers/dns/infoblox"
+	"github.com/go-acme/lego/v4/providers/dns/infomaniak"
+	"github.com/go-acme/lego/v4/providers/dns/internetbs"
+	"github.com/go-acme/lego/v4/providers/dns/inwx"
+	"github.com/go-acme/lego/v4/providers/dns/ionos"
+	"github.com/go-acme/lego/v4/providers/dns/ipv64"
+	"github.com/go-acme/lego/v4/providers/dns/iwantmyname"
+	"github.com/go-acme/lego/v4/providers/dns/joker"
+	"github.com/go-acme/lego/v4/providers/dns/liara"
+	"github.com/go-acme/lego/v4/providers/dns/lightsail"
+	"github.com/go-acme/lego/v4/providers/dns/linode"
+	"github.com/go-acme/lego/v4/providers/dns/liquidweb"
+	"github.com/go-acme/lego/v4/providers/dns/loopia"
+	"github.com/go-acme/lego/v4/providers/dns/luadns"
+	"github.com/go-acme/lego/v4/providers/dns/mailinabox"
+	"github.com/go-acme/lego/v4/providers/dns/metaname"
+	"github.com/go-acme/lego/v4/providers/dns/mydnsjp"
+	"github.com/go-acme/lego/v4/providers/dns/namecheap"
+	"github.com/go-acme/lego/v4/providers/dns/namedotcom"
+	"github.com/go-acme/lego/v4/providers/dns/namesilo"
+	"github.com/go-acme/lego/v4/providers/dns/nearlyfreespeech"
+	"github.com/go-acme/lego/v4/providers/dns/netcup"
+	"github.com/go-acme/lego/v4/providers/dns/netlify"
+	"github.com/go-acme/lego/v4/providers/dns/nicmanager"
+	"github.com/go-acme/lego/v4/providers/dns/nifcloud"
+	"github.com/go-acme/lego/v4/providers/dns/njalla"
+	"github.com/go-acme/lego/v4/providers/dns/nodion"
+	"github.com/go-acme/lego/v4/providers/dns/ns1"
+	"github.com/go-acme/lego/v4/providers/dns/otc"
+	"github.com/go-acme/lego/v4/providers/dns/ovh"
+	"github.com/go-acme/lego/v4/providers/dns/pdns"
+	"github.com/go-acme/lego/v4/providers/dns/plesk"
+	"github.com/go-acme/lego/v4/providers/dns/porkbun"
+	"github.com/go-acme/lego/v4/providers/dns/rackspace"
+	"github.com/go-acme/lego/v4/providers/dns/rcodezero"
+	"github.com/go-acme/lego/v4/providers/dns/regru"
+	"github.com/go-acme/lego/v4/providers/dns/rfc2136"
+	"github.com/go-acme/lego/v4/providers/dns/rimuhosting"
+	"github.com/go-acme/lego/v4/providers/dns/route53"
+	"github.com/go-acme/lego/v4/providers/dns/safedns"
+	"github.com/go-acme/lego/v4/providers/dns/sakuracloud"
+	"github.com/go-acme/lego/v4/providers/dns/scaleway"
+	"github.com/go-acme/lego/v4/providers/dns/selectel"
+	"github.com/go-acme/lego/v4/providers/dns/servercow"
+	"github.com/go-acme/lego/v4/providers/dns/shellrent"
+	"github.com/go-acme/lego/v4/providers/dns/simply"
+	"github.com/go-acme/lego/v4/providers/dns/sonic"
+	"github.com/go-acme/lego/v4/providers/dns/stackpath"
+	"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
+	"github.com/go-acme/lego/v4/providers/dns/transip"
+	"github.com/go-acme/lego/v4/providers/dns/ultradns"
+	"github.com/go-acme/lego/v4/providers/dns/variomedia"
+	"github.com/go-acme/lego/v4/providers/dns/vegadns"
+	"github.com/go-acme/lego/v4/providers/dns/vercel"
+	"github.com/go-acme/lego/v4/providers/dns/versio"
+	"github.com/go-acme/lego/v4/providers/dns/vinyldns"
+	"github.com/go-acme/lego/v4/providers/dns/vkcloud"
+	"github.com/go-acme/lego/v4/providers/dns/vscale"
+	"github.com/go-acme/lego/v4/providers/dns/vultr"
+	"github.com/go-acme/lego/v4/providers/dns/webnames"
+	"github.com/go-acme/lego/v4/providers/dns/websupport"
+	"github.com/go-acme/lego/v4/providers/dns/wedos"
+	"github.com/go-acme/lego/v4/providers/dns/yandex"
+	"github.com/go-acme/lego/v4/providers/dns/yandex360"
+	"github.com/go-acme/lego/v4/providers/dns/yandexcloud"
+	"github.com/go-acme/lego/v4/providers/dns/zoneee"
+	"github.com/go-acme/lego/v4/providers/dns/zonomi"
+
+)
+
+//name is the DNS provider name, e.g. cloudflare or gandi
+//JSON (js) must be in key-value string that match ConfigableFields Title in providers.json, e.g. {"Username":"far","Password":"boo"}
+func GetDNSProviderByJsonConfig(name string, js string)(challenge.Provider, error){
+	switch name {
+
+	case "alidns":
+		cfg := alidns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return alidns.NewDNSProviderConfig(&cfg)
+	case "allinkl":
+		cfg := allinkl.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return allinkl.NewDNSProviderConfig(&cfg)
+	case "arvancloud":
+		cfg := arvancloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return arvancloud.NewDNSProviderConfig(&cfg)
+	case "auroradns":
+		cfg := auroradns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return auroradns.NewDNSProviderConfig(&cfg)
+	case "autodns":
+		cfg := autodns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return autodns.NewDNSProviderConfig(&cfg)
+	case "azure":
+		cfg := azure.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azure.NewDNSProviderConfig(&cfg)
+	case "azuredns":
+		cfg := azuredns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azuredns.NewDNSProviderConfig(&cfg)
+	case "bindman":
+		cfg := bindman.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bindman.NewDNSProviderConfig(&cfg)
+	case "bluecat":
+		cfg := bluecat.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bluecat.NewDNSProviderConfig(&cfg)
+	case "brandit":
+		cfg := brandit.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return brandit.NewDNSProviderConfig(&cfg)
+	case "bunny":
+		cfg := bunny.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bunny.NewDNSProviderConfig(&cfg)
+	case "checkdomain":
+		cfg := checkdomain.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return checkdomain.NewDNSProviderConfig(&cfg)
+	case "civo":
+		cfg := civo.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return civo.NewDNSProviderConfig(&cfg)
+	case "clouddns":
+		cfg := clouddns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clouddns.NewDNSProviderConfig(&cfg)
+	case "cloudflare":
+		cfg := cloudflare.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudflare.NewDNSProviderConfig(&cfg)
+	case "cloudns":
+		cfg := cloudns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudns.NewDNSProviderConfig(&cfg)
+	case "cloudru":
+		cfg := cloudru.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudru.NewDNSProviderConfig(&cfg)
+	case "cloudxns":
+		cfg := cloudxns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudxns.NewDNSProviderConfig(&cfg)
+	case "conoha":
+		cfg := conoha.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return conoha.NewDNSProviderConfig(&cfg)
+	case "constellix":
+		cfg := constellix.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return constellix.NewDNSProviderConfig(&cfg)
+	case "cpanel":
+		cfg := cpanel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cpanel.NewDNSProviderConfig(&cfg)
+	case "derak":
+		cfg := derak.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return derak.NewDNSProviderConfig(&cfg)
+	case "desec":
+		cfg := desec.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return desec.NewDNSProviderConfig(&cfg)
+	case "digitalocean":
+		cfg := digitalocean.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return digitalocean.NewDNSProviderConfig(&cfg)
+	case "dnshomede":
+		cfg := dnshomede.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnshomede.NewDNSProviderConfig(&cfg)
+	case "dnsimple":
+		cfg := dnsimple.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsimple.NewDNSProviderConfig(&cfg)
+	case "dnsmadeeasy":
+		cfg := dnsmadeeasy.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsmadeeasy.NewDNSProviderConfig(&cfg)
+	case "dnspod":
+		cfg := dnspod.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnspod.NewDNSProviderConfig(&cfg)
+	case "dode":
+		cfg := dode.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dode.NewDNSProviderConfig(&cfg)
+	case "domeneshop":
+		cfg := domeneshop.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return domeneshop.NewDNSProviderConfig(&cfg)
+	case "dreamhost":
+		cfg := dreamhost.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dreamhost.NewDNSProviderConfig(&cfg)
+	case "duckdns":
+		cfg := duckdns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return duckdns.NewDNSProviderConfig(&cfg)
+	case "dyn":
+		cfg := dyn.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dyn.NewDNSProviderConfig(&cfg)
+	case "dynu":
+		cfg := dynu.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dynu.NewDNSProviderConfig(&cfg)
+	case "easydns":
+		cfg := easydns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return easydns.NewDNSProviderConfig(&cfg)
+	case "efficientip":
+		cfg := efficientip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return efficientip.NewDNSProviderConfig(&cfg)
+	case "epik":
+		cfg := epik.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return epik.NewDNSProviderConfig(&cfg)
+	case "exoscale":
+		cfg := exoscale.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return exoscale.NewDNSProviderConfig(&cfg)
+	case "freemyip":
+		cfg := freemyip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return freemyip.NewDNSProviderConfig(&cfg)
+	case "gandi":
+		cfg := gandi.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandi.NewDNSProviderConfig(&cfg)
+	case "gandiv5":
+		cfg := gandiv5.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandiv5.NewDNSProviderConfig(&cfg)
+	case "gcore":
+		cfg := gcore.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gcore.NewDNSProviderConfig(&cfg)
+	case "glesys":
+		cfg := glesys.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return glesys.NewDNSProviderConfig(&cfg)
+	case "godaddy":
+		cfg := godaddy.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return godaddy.NewDNSProviderConfig(&cfg)
+	case "googledomains":
+		cfg := googledomains.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return googledomains.NewDNSProviderConfig(&cfg)
+	case "hetzner":
+		cfg := hetzner.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hetzner.NewDNSProviderConfig(&cfg)
+	case "hostingde":
+		cfg := hostingde.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hostingde.NewDNSProviderConfig(&cfg)
+	case "hosttech":
+		cfg := hosttech.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hosttech.NewDNSProviderConfig(&cfg)
+	case "httpnet":
+		cfg := httpnet.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return httpnet.NewDNSProviderConfig(&cfg)
+	case "hyperone":
+		cfg := hyperone.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hyperone.NewDNSProviderConfig(&cfg)
+	case "ibmcloud":
+		cfg := ibmcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ibmcloud.NewDNSProviderConfig(&cfg)
+	case "iij":
+		cfg := iij.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iij.NewDNSProviderConfig(&cfg)
+	case "iijdpf":
+		cfg := iijdpf.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iijdpf.NewDNSProviderConfig(&cfg)
+	case "infoblox":
+		cfg := infoblox.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infoblox.NewDNSProviderConfig(&cfg)
+	case "infomaniak":
+		cfg := infomaniak.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infomaniak.NewDNSProviderConfig(&cfg)
+	case "internetbs":
+		cfg := internetbs.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return internetbs.NewDNSProviderConfig(&cfg)
+	case "inwx":
+		cfg := inwx.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return inwx.NewDNSProviderConfig(&cfg)
+	case "ionos":
+		cfg := ionos.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ionos.NewDNSProviderConfig(&cfg)
+	case "ipv64":
+		cfg := ipv64.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ipv64.NewDNSProviderConfig(&cfg)
+	case "iwantmyname":
+		cfg := iwantmyname.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iwantmyname.NewDNSProviderConfig(&cfg)
+	case "joker":
+		cfg := joker.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return joker.NewDNSProviderConfig(&cfg)
+	case "liara":
+		cfg := liara.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liara.NewDNSProviderConfig(&cfg)
+	case "lightsail":
+		cfg := lightsail.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return lightsail.NewDNSProviderConfig(&cfg)
+	case "linode":
+		cfg := linode.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return linode.NewDNSProviderConfig(&cfg)
+	case "liquidweb":
+		cfg := liquidweb.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liquidweb.NewDNSProviderConfig(&cfg)
+	case "loopia":
+		cfg := loopia.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return loopia.NewDNSProviderConfig(&cfg)
+	case "luadns":
+		cfg := luadns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return luadns.NewDNSProviderConfig(&cfg)
+	case "mailinabox":
+		cfg := mailinabox.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return mailinabox.NewDNSProviderConfig(&cfg)
+	case "metaname":
+		cfg := metaname.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return metaname.NewDNSProviderConfig(&cfg)
+	case "mydnsjp":
+		cfg := mydnsjp.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return mydnsjp.NewDNSProviderConfig(&cfg)
+	case "namecheap":
+		cfg := namecheap.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namecheap.NewDNSProviderConfig(&cfg)
+	case "namedotcom":
+		cfg := namedotcom.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namedotcom.NewDNSProviderConfig(&cfg)
+	case "namesilo":
+		cfg := namesilo.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namesilo.NewDNSProviderConfig(&cfg)
+	case "nearlyfreespeech":
+		cfg := nearlyfreespeech.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nearlyfreespeech.NewDNSProviderConfig(&cfg)
+	case "netcup":
+		cfg := netcup.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netcup.NewDNSProviderConfig(&cfg)
+	case "netlify":
+		cfg := netlify.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netlify.NewDNSProviderConfig(&cfg)
+	case "nicmanager":
+		cfg := nicmanager.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nicmanager.NewDNSProviderConfig(&cfg)
+	case "nifcloud":
+		cfg := nifcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nifcloud.NewDNSProviderConfig(&cfg)
+	case "njalla":
+		cfg := njalla.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return njalla.NewDNSProviderConfig(&cfg)
+	case "nodion":
+		cfg := nodion.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nodion.NewDNSProviderConfig(&cfg)
+	case "ns1":
+		cfg := ns1.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ns1.NewDNSProviderConfig(&cfg)
+	case "otc":
+		cfg := otc.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return otc.NewDNSProviderConfig(&cfg)
+	case "ovh":
+		cfg := ovh.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ovh.NewDNSProviderConfig(&cfg)
+	case "pdns":
+		cfg := pdns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return pdns.NewDNSProviderConfig(&cfg)
+	case "plesk":
+		cfg := plesk.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return plesk.NewDNSProviderConfig(&cfg)
+	case "porkbun":
+		cfg := porkbun.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return porkbun.NewDNSProviderConfig(&cfg)
+	case "rackspace":
+		cfg := rackspace.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rackspace.NewDNSProviderConfig(&cfg)
+	case "rcodezero":
+		cfg := rcodezero.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rcodezero.NewDNSProviderConfig(&cfg)
+	case "regru":
+		cfg := regru.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return regru.NewDNSProviderConfig(&cfg)
+	case "rfc2136":
+		cfg := rfc2136.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rfc2136.NewDNSProviderConfig(&cfg)
+	case "rimuhosting":
+		cfg := rimuhosting.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rimuhosting.NewDNSProviderConfig(&cfg)
+	case "route53":
+		cfg := route53.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return route53.NewDNSProviderConfig(&cfg)
+	case "safedns":
+		cfg := safedns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return safedns.NewDNSProviderConfig(&cfg)
+	case "sakuracloud":
+		cfg := sakuracloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sakuracloud.NewDNSProviderConfig(&cfg)
+	case "scaleway":
+		cfg := scaleway.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return scaleway.NewDNSProviderConfig(&cfg)
+	case "selectel":
+		cfg := selectel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return selectel.NewDNSProviderConfig(&cfg)
+	case "servercow":
+		cfg := servercow.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return servercow.NewDNSProviderConfig(&cfg)
+	case "shellrent":
+		cfg := shellrent.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return shellrent.NewDNSProviderConfig(&cfg)
+	case "simply":
+		cfg := simply.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return simply.NewDNSProviderConfig(&cfg)
+	case "sonic":
+		cfg := sonic.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sonic.NewDNSProviderConfig(&cfg)
+	case "stackpath":
+		cfg := stackpath.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return stackpath.NewDNSProviderConfig(&cfg)
+	case "tencentcloud":
+		cfg := tencentcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return tencentcloud.NewDNSProviderConfig(&cfg)
+	case "transip":
+		cfg := transip.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return transip.NewDNSProviderConfig(&cfg)
+	case "ultradns":
+		cfg := ultradns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ultradns.NewDNSProviderConfig(&cfg)
+	case "variomedia":
+		cfg := variomedia.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return variomedia.NewDNSProviderConfig(&cfg)
+	case "vegadns":
+		cfg := vegadns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vegadns.NewDNSProviderConfig(&cfg)
+	case "vercel":
+		cfg := vercel.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vercel.NewDNSProviderConfig(&cfg)
+	case "versio":
+		cfg := versio.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return versio.NewDNSProviderConfig(&cfg)
+	case "vinyldns":
+		cfg := vinyldns.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vinyldns.NewDNSProviderConfig(&cfg)
+	case "vkcloud":
+		cfg := vkcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vkcloud.NewDNSProviderConfig(&cfg)
+	case "vscale":
+		cfg := vscale.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vscale.NewDNSProviderConfig(&cfg)
+	case "vultr":
+		cfg := vultr.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vultr.NewDNSProviderConfig(&cfg)
+	case "webnames":
+		cfg := webnames.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return webnames.NewDNSProviderConfig(&cfg)
+	case "websupport":
+		cfg := websupport.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return websupport.NewDNSProviderConfig(&cfg)
+	case "wedos":
+		cfg := wedos.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return wedos.NewDNSProviderConfig(&cfg)
+	case "yandex":
+		cfg := yandex.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex.NewDNSProviderConfig(&cfg)
+	case "yandex360":
+		cfg := yandex360.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex360.NewDNSProviderConfig(&cfg)
+	case "yandexcloud":
+		cfg := yandexcloud.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandexcloud.NewDNSProviderConfig(&cfg)
+	case "zoneee":
+		cfg := zoneee.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return zoneee.NewDNSProviderConfig(&cfg)
+	case "zonomi":
+		cfg := zonomi.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return zonomi.NewDNSProviderConfig(&cfg)
+	default:
+		return nil, fmt.Errorf("unrecognized DNS provider: %s", name)
+	}
+}

+ 3893 - 0
tools/provider_config_updater/acmedns/providers.json

@@ -0,0 +1,3893 @@
+{
+ "alidns": {
+  "Name": "alidns",
+  "ConfigableFields": [
+   {
+    "Title": "RAMRole",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecurityToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "RegionID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "allinkl": {
+  "Name": "allinkl",
+  "ConfigableFields": [
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "arvancloud": {
+  "Name": "arvancloud",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "auroradns": {
+  "Name": "auroradns",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "autodns": {
+  "Name": "autodns",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Context",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "azure": {
+  "Name": "azure",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubscriptionID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceGroup",
+    "Datatype": "string"
+   },
+   {
+    "Title": "MetadataEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceManagerEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ActiveDirectoryEndpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PrivateZone",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "azuredns": {
+  "Name": "azuredns",
+  "ConfigableFields": [
+   {
+    "Title": "SubscriptionID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ResourceGroup",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCTokenFilePath",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCRequestURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OIDCRequestToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthMethod",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ServiceDiscoveryFilter",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PrivateZone",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "Environment",
+    "Datatype": "cloud.Configuration"
+   },
+   {
+    "Title": "AuthMSITimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bindman": {
+  "Name": "bindman",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bluecat": {
+  "Name": "bluecat",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ConfigName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSView",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "brandit": {
+  "Name": "brandit",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUsername",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "bunny": {
+  "Name": "bunny",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "checkdomain": {
+  "Name": "checkdomain",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "civo": {
+  "Name": "civo",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "clouddns": {
+  "Name": "clouddns",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudflare": {
+  "Name": "cloudflare",
+  "ConfigableFields": [
+   {
+    "Title": "AuthEmail",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudns": {
+  "Name": "cloudns",
+  "ConfigableFields": [
+   {
+    "Title": "AuthID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubAuthID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthPassword",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cloudru": {
+  "Name": "cloudru",
+  "ConfigableFields": [
+   {
+    "Title": "ServiceInstanceID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "KeyID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "cloudxns": {
+  "Name": "cloudxns",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "conoha": {
+  "Name": "conoha",
+  "ConfigableFields": [
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TenantID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "constellix": {
+  "Name": "constellix",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "cpanel": {
+  "Name": "cpanel",
+  "ConfigableFields": [
+   {
+    "Title": "Mode",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "derak": {
+  "Name": "derak",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "WebsiteID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "desec": {
+  "Name": "desec",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "digitalocean": {
+  "Name": "digitalocean",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dnshomede": {
+  "Name": "dnshomede",
+  "ConfigableFields": [],
+  "HiddenFields": [
+   {
+    "Title": "Credentials",
+    "Datatype": "map[string]string"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dnsimple": {
+  "Name": "dnsimple",
+  "ConfigableFields": [
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dnsmadeeasy": {
+  "Name": "dnsmadeeasy",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "Sandbox",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dnspod": {
+  "Name": "dnspod",
+  "ConfigableFields": [
+   {
+    "Title": "LoginToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dode": {
+  "Name": "dode",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "domeneshop": {
+  "Name": "domeneshop",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dreamhost": {
+  "Name": "dreamhost",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "duckdns": {
+  "Name": "duckdns",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "dyn": {
+  "Name": "dyn",
+  "ConfigableFields": [
+   {
+    "Title": "CustomerName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "dynu": {
+  "Name": "dynu",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "easydns": {
+  "Name": "easydns",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Key",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "efficientip": {
+  "Name": "efficientip",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Hostname",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ViewName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "InsecureSkipVerify",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "epik": {
+  "Name": "epik",
+  "ConfigableFields": [
+   {
+    "Title": "Signature",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "exoscale": {
+  "Name": "exoscale",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Endpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int64"
+   }
+  ]
+ },
+ "freemyip": {
+  "Name": "freemyip",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "gandi": {
+  "Name": "gandi",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "gandiv5": {
+  "Name": "gandiv5",
+  "ConfigableFields": [
+   {
+    "Title": "fieldName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "authZone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "gcore": {
+  "Name": "gcore",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "glesys": {
+  "Name": "glesys",
+  "ConfigableFields": [
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "godaddy": {
+  "Name": "godaddy",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "googledomains": {
+  "Name": "googledomains",
+  "ConfigableFields": [
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hetzner": {
+  "Name": "hetzner",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hostingde": {
+  "Name": "hostingde",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hosttech": {
+  "Name": "hosttech",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "httpnet": {
+  "Name": "httpnet",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ZoneName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "hyperone": {
+  "Name": "hyperone",
+  "ConfigableFields": [
+   {
+    "Title": "APIEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "LocationID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "PassportLocation",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ibmcloud": {
+  "Name": "ibmcloud",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "iij": {
+  "Name": "iij",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DoServiceCode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "iijdpf": {
+  "Name": "iijdpf",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ServiceCode",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Endpoint",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "infoblox": {
+  "Name": "infoblox",
+  "ConfigableFields": [
+   {
+    "Title": "Host",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Port",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSView",
+    "Datatype": "string"
+   },
+   {
+    "Title": "WapiVersion",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SSLVerify",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "infomaniak": {
+  "Name": "infomaniak",
+  "ConfigableFields": [
+   {
+    "Title": "APIEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "internetbs": {
+  "Name": "internetbs",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "inwx": {
+  "Name": "inwx",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SharedSecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "Sandbox",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "ionos": {
+  "Name": "ionos",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ipv64": {
+  "Name": "ipv64",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "iwantmyname": {
+  "Name": "iwantmyname",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "joker": {
+  "Name": "joker",
+  "ConfigableFields": [
+   {
+    "Title": "Debug",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIMode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "liara": {
+  "Name": "liara",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "lightsail": {
+  "Name": "lightsail",
+  "ConfigableFields": [
+   {
+    "Title": "DNSZone",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "linode": {
+  "Name": "linode",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "liquidweb": {
+  "Name": "liquidweb",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Zone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "loopia": {
+  "Name": "loopia",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIPassword",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "luadns": {
+  "Name": "luadns",
+  "ConfigableFields": [
+   {
+    "Title": "APIUsername",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "mailinabox": {
+  "Name": "mailinabox",
+  "ConfigableFields": [
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "metaname": {
+  "Name": "metaname",
+  "ConfigableFields": [
+   {
+    "Title": "AccountReference",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "mydnsjp": {
+  "Name": "mydnsjp",
+  "ConfigableFields": [
+   {
+    "Title": "MasterID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "namecheap": {
+  "Name": "namecheap",
+  "ConfigableFields": [
+   {
+    "Title": "domain",
+    "Datatype": "string"
+   },
+   {
+    "Title": "key",
+    "Datatype": "string"
+   },
+   {
+    "Title": "keyFqdn",
+    "Datatype": "string"
+   },
+   {
+    "Title": "keyValue",
+    "Datatype": "string"
+   },
+   {
+    "Title": "tld",
+    "Datatype": "string"
+   },
+   {
+    "Title": "sld",
+    "Datatype": "string"
+   },
+   {
+    "Title": "host",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "namedotcom": {
+  "Name": "namedotcom",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Server",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "namesilo": {
+  "Name": "namesilo",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "nearlyfreespeech": {
+  "Name": "nearlyfreespeech",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "netcup": {
+  "Name": "netcup",
+  "ConfigableFields": [
+   {
+    "Title": "Key",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Customer",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "netlify": {
+  "Name": "netlify",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nicmanager": {
+  "Name": "nicmanager",
+  "ConfigableFields": [
+   {
+    "Title": "Login",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Email",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "OTPSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Mode",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nifcloud": {
+  "Name": "nifcloud",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "njalla": {
+  "Name": "njalla",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "nodion": {
+  "Name": "nodion",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ns1": {
+  "Name": "ns1",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "otc": {
+  "Name": "otc",
+  "ConfigableFields": [
+   {
+    "Title": "IdentityEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DomainName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ProjectName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "UserName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "ovh": {
+  "Name": "ovh",
+  "ConfigableFields": [
+   {
+    "Title": "FieldType",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SubDomain",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Target",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Zone",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "ID",
+    "Datatype": "int64"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "pdns": {
+  "Name": "pdns",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Host",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "ServerName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIVersion",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "plesk": {
+  "Name": "plesk",
+  "ConfigableFields": [
+   {
+    "Title": "baseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "porkbun": {
+  "Name": "porkbun",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretAPIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rackspace": {
+  "Name": "rackspace",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIUser",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rcodezero": {
+  "Name": "rcodezero",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "regru": {
+  "Name": "regru",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TLSCert",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TLSKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "rfc2136": {
+  "Name": "rfc2136",
+  "ConfigableFields": [
+   {
+    "Title": "Nameserver",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGAlgorithm",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TSIGSecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "DNSTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "rimuhosting": {
+  "Name": "rimuhosting",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "route53": {
+  "Name": "route53",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKeyID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretAccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SessionToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "HostedZoneID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "MaxRetries",
+    "Datatype": "int"
+   },
+   {
+    "Title": "AssumeRoleArn",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ExternalID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "WaitForRecordSetsChanged",
+    "Datatype": "bool"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "Client",
+    "Datatype": "*route53.Client"
+   }
+  ]
+ },
+ "safedns": {
+  "Name": "safedns",
+  "ConfigableFields": [
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "sakuracloud": {
+  "Name": "sakuracloud",
+  "ConfigableFields": [
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "scaleway": {
+  "Name": "scaleway",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   },
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "selectel": {
+  "Name": "selectel",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "servercow": {
+  "Name": "servercow",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "shellrent": {
+  "Name": "shellrent",
+  "ConfigableFields": [
+   {
+    "Title": "domainID",
+    "Datatype": "int"
+   },
+   {
+    "Title": "recordID",
+    "Datatype": "int"
+   }
+  ],
+  "HiddenFields": []
+ },
+ "simply": {
+  "Name": "simply",
+  "ConfigableFields": [
+   {
+    "Title": "AccountName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "sonic": {
+  "Name": "sonic",
+  "ConfigableFields": [
+   {
+    "Title": "UserID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "stackpath": {
+  "Name": "stackpath",
+  "ConfigableFields": [
+   {
+    "Title": "ClientID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "ClientSecret",
+    "Datatype": "string"
+   },
+   {
+    "Title": "StackID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "tencentcloud": {
+  "Name": "tencentcloud",
+  "ConfigableFields": [
+   {
+    "Title": "SecretID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Region",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SessionToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "transip": {
+  "Name": "transip",
+  "ConfigableFields": [
+   {
+    "Title": "AccountName",
+    "Datatype": "string"
+   },
+   {
+    "Title": "PrivateKeyPath",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int64"
+   }
+  ]
+ },
+ "ultradns": {
+  "Name": "ultradns",
+  "ConfigableFields": [],
+  "HiddenFields": [
+   {
+    "Title": "config",
+    "Datatype": "*Config"
+   },
+   {
+    "Title": "client",
+    "Datatype": "*client.Client"
+   }
+  ]
+ },
+ "variomedia": {
+  "Name": "variomedia",
+  "ConfigableFields": [
+   {
+    "Title": "APIToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vegadns": {
+  "Name": "vegadns",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APISecret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "vercel": {
+  "Name": "vercel",
+  "ConfigableFields": [
+   {
+    "Title": "AuthToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "TeamID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "versio": {
+  "Name": "versio",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vinyldns": {
+  "Name": "vinyldns",
+  "ConfigableFields": [
+   {
+    "Title": "AccessKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "SecretKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Host",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "vkcloud": {
+  "Name": "vkcloud",
+  "ConfigableFields": [
+   {
+    "Title": "ProjectID",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DNSEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "IdentityEndpoint",
+    "Datatype": "string"
+   },
+   {
+    "Title": "DomainName",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "vscale": {
+  "Name": "vscale",
+  "ConfigableFields": [
+   {
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Token",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "vultr": {
+  "Name": "vultr",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   },
+   {
+    "Title": "HTTPTimeout",
+    "Datatype": "time.Duration"
+   }
+  ]
+ },
+ "webnames": {
+  "Name": "webnames",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "websupport": {
+  "Name": "websupport",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Secret",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "SequenceInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "wedos": {
+  "Name": "wedos",
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandex": {
+  "Name": "yandex",
+  "ConfigableFields": [
+   {
+    "Title": "PddToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandex360": {
+  "Name": "yandex360",
+  "ConfigableFields": [
+   {
+    "Title": "OAuthToken",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "OrgID",
+    "Datatype": "int64"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "yandexcloud": {
+  "Name": "yandexcloud",
+  "ConfigableFields": [
+   {
+    "Title": "IamToken",
+    "Datatype": "string"
+   },
+   {
+    "Title": "FolderID",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   }
+  ]
+ },
+ "zoneee": {
+  "Name": "zoneee",
+  "ConfigableFields": [
+   {
+    "Title": "Endpoint",
+    "Datatype": "*url.URL"
+   },
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ },
+ "zonomi": {
+  "Name": "zonomi",
+  "ConfigableFields": [
+   {
+    "Title": "APIKey",
+    "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "TTL",
+    "Datatype": "int"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
+ }
+}

+ 240 - 0
tools/provider_config_updater/extract.go

@@ -0,0 +1,240 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"regexp"
+	"strings"
+)
+
+var legoProvidersSourceFolder string = "./lego/providers/dns/"
+var outputDir string = "./acmedns"
+var defTemplate string = `package acmedns
+/*
+	THIS MODULE IS GENERATED AUTOMATICALLY
+	DO NOT EDIT THIS FILE
+*/
+import (
+	"encoding/json"
+	"fmt"
+
+	"github.com/go-acme/lego/v4/challenge"
+{{imports}}
+)
+
+//name is the DNS provider name, e.g. cloudflare or gandi
+//JSON (js) must be in key-value string that match ConfigableFields Title in providers.json, e.g. {"Username":"far","Password":"boo"}
+func GetDNSProviderByJsonConfig(name string, js string)(challenge.Provider, error){
+	switch name {
+{{magic}}
+	default:
+		return nil, fmt.Errorf("unrecognized DNS provider: %s", name)
+	}
+}
+`
+
+type Field struct {
+	Title    string
+	Datatype string
+}
+type ProviderInfo struct {
+	Name             string   //Name of this provider
+	ConfigableFields []*Field //Field that shd be expose to user for filling in
+	HiddenFields     []*Field //Fields that is usable but shd be hidden from user
+}
+
+func fileExists(filePath string) bool {
+	_, err := os.Stat(filePath)
+	if err == nil {
+		return true
+	}
+	if os.IsNotExist(err) {
+		return false
+	}
+	// For other errors, you may handle them differently
+	return false
+}
+
+// This function define the DNS not supported by zoraxy
+func getExcludedDNSProviders() []string {
+	return []string{
+		"edgedns",      //Too complex data structure
+		"exec",         //Not a DNS provider
+		"httpreq",      //Not a DNS provider
+		"hurricane",    //Multi-credentials arch
+		"oraclecloud",  //Evil company
+		"acmedns",      //Not a DNS provider
+		"selectelv2",   //Not sure why not working with our code generator
+		"designate",    //OpenStack, if you are using this you shd not be using zoraxy
+		"mythicbeasts", //Module require url.URL, which cannot be automatically parsed
+	}
+}
+
+func isInSlice(str string, slice []string) bool {
+	for _, s := range slice {
+		if s == str {
+			return true
+		}
+	}
+	return false
+}
+
+func isExcludedDNSProvider(providerName string) bool {
+	return isInSlice(providerName, getExcludedDNSProviders())
+}
+
+// extractConfigStruct extracts the name of the config struct and its content as plain text from a given source code.
+func extractConfigStruct(sourceCode string) (string, string) {
+	// Regular expression to match the struct declaration.
+	structRegex := regexp.MustCompile(`type\s+([A-Za-z0-9_]+)\s+struct\s*{([^{}]*)}`)
+
+	// Find the first match of the struct declaration.
+	match := structRegex.FindStringSubmatch(sourceCode)
+	if len(match) < 3 {
+		return "", "" // No match found
+	}
+
+	// Extract the struct name and its content.
+	structName := match[1]
+	structContent := match[2]
+
+	return structName, structContent
+}
+
+func main() {
+	// A map of provider name to information on what can be filled
+	extractedProviderList := map[string]*ProviderInfo{}
+
+	//Search all providers
+	providers, err := filepath.Glob(filepath.Join(legoProvidersSourceFolder, "/*"))
+	if err != nil {
+		panic(err)
+	}
+
+	//Create output folder if not exists
+	err = os.MkdirAll(outputDir, 0775)
+	if err != nil {
+		panic(err)
+	}
+
+	generatedConvertcode := ""
+	importList := ""
+	for _, provider := range providers {
+		providerName := filepath.Base(provider)
+		if isExcludedDNSProvider(providerName) {
+			//Ignore this provider
+			continue
+		}
+		//Check if {provider_name}.go exists
+		providerDef := filepath.Join(provider, providerName+".go")
+		if !fileExists(providerDef) {
+			continue
+		}
+
+		fmt.Println("Extracting config structure for: " + providerDef)
+		providerSrc, err := os.ReadFile(providerDef)
+		if err != nil {
+			fmt.Println(err.Error())
+			return
+		}
+		_, strctContent := extractConfigStruct(string(providerSrc))
+
+		//Filter and write the content to json
+		/*
+			Example of stctContent (Note the tab prefix)
+
+				Token              string
+				PropagationTimeout time.Duration
+				PollingInterval    time.Duration
+				SequenceInterval   time.Duration
+				HTTPClient         *http.Client
+		*/
+		strctContentLines := strings.Split(strctContent, "\n")
+		configKeys := []*Field{}
+		hiddenKeys := []*Field{}
+		for _, lineDef := range strctContentLines {
+			fields := strings.Fields(lineDef)
+			if len(fields) < 2 || strings.HasPrefix(fields[0], "//") {
+				//Ignore this line
+				continue
+			}
+
+			//Filter out the fields that is not user-filled
+			switch fields[1] {
+			case "*url.URL":
+				fallthrough
+			case "string":
+				configKeys = append(configKeys, &Field{
+					Title:    fields[0],
+					Datatype: fields[1],
+				})
+			case "int":
+				if fields[0] != "TTL" {
+					configKeys = append(configKeys, &Field{
+						Title:    fields[0],
+						Datatype: fields[1],
+					})
+				} else {
+					hiddenKeys = append(hiddenKeys, &Field{
+						Title:    fields[0],
+						Datatype: fields[1],
+					})
+				}
+			case "bool":
+				if fields[0] == "InsecureSkipVerify" || fields[0] == "SSLVerify" || fields[0] == "Debug" {
+					configKeys = append(configKeys, &Field{
+						Title:    fields[0],
+						Datatype: fields[1],
+					})
+				} else {
+					hiddenKeys = append(hiddenKeys, &Field{
+						Title:    fields[0],
+						Datatype: fields[1],
+					})
+				}
+			default:
+				//Not used fields
+				hiddenKeys = append(hiddenKeys, &Field{
+					Title:    fields[0],
+					Datatype: fields[1],
+				})
+			}
+		}
+		fmt.Println(strctContent)
+
+		extractedProviderList[providerName] = &ProviderInfo{
+			Name:             providerName,
+			ConfigableFields: configKeys,
+			HiddenFields:     hiddenKeys,
+		}
+
+		//Generate the code for it
+
+		//Generate the code for converting incoming json into target config
+		codeSegment := `
+	case "` + providerName + `":
+		cfg := ` + providerName + `.Config{}
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ` + providerName + `.NewDNSProviderConfig(&cfg)`
+
+		generatedConvertcode += codeSegment
+		importList += `	"github.com/go-acme/lego/v4/providers/dns/` + providerName + "\"\n"
+	}
+
+	js, err := json.MarshalIndent(extractedProviderList, "", " ")
+	if err != nil {
+		panic(err)
+	}
+	os.WriteFile(filepath.Join(outputDir, "providers.json"), js, 0775)
+
+	fullCodeSnippet := strings.ReplaceAll(defTemplate, "{{magic}}", generatedConvertcode)
+	fullCodeSnippet = strings.ReplaceAll(fullCodeSnippet, "{{imports}}", importList)
+
+	os.WriteFile(filepath.Join(outputDir, "acmedns.go"), []byte(fullCodeSnippet), 0775)
+	fmt.Println("Output written to file")
+}

+ 26 - 0
tools/provider_config_updater/update.sh

@@ -0,0 +1,26 @@
+#/bin/bash
+
+repo_url="https://github.com/go-acme/lego"
+
+# Check if the folder "./lego" exists
+if [ -d "./lego" ]; then
+    # If the folder exists, change into it and perform a git pull
+    echo "Folder './lego' exists. Pulling updates..."
+    cd "./lego" || exit
+    git pull
+	cd ../
+else
+    # If the folder doesn't exist, clone the repository
+    echo "Folder './lego' does not exist. Cloning the repository..."
+    git clone "$repo_url" "./lego" || exit
+fi
+
+# Run the extract.go to get all the config from lego source code
+echo "Generating code"
+go run ./extract.go
+
+echo "Cleaning up lego"
+# Comment the line below if you dont want to pull everytime update
+# This is to help go compiler to not load all the lego source file when compile
+rm -rf ./lego/
+echo "Config generated"

+ 134 - 555
web/snippet/acme.html

@@ -122,153 +122,30 @@
     </div>
     <div class="field dnsChallengeOnly" style="display:none;">
       <label>DNS Provider</label>
-      <div class="ui selection dropdown" id="dnsProvider">
-        <input type="hidden" name="dnsProvider">
+      <div class="ui search selection dropdown" id="dnsProvider">
+        <input type="hidden" name="dnsProvider" value="">
         <i class="dropdown icon"></i>
-        <div class="default text">Please Choose...</div>
-        <div class="menu">
-          <!-- List of supported DNS providers with acme-lego 4.16 -->
-          <!-- The file proivders-scraper-util.js can be used to generate the list of providers -->
-          <div class="item" data-value="edgedns">Akamai EdgeDNS</div>
-          <div class="item" data-value="alidns">Alibaba Cloud DNS</div>
-          <div class="item" data-value="allinkl">all-inkl</div>
-          <div class="item" data-value="lightsail">Amazon Lightsail</div>
-          <div class="item" data-value="route53">Amazon Route 53</div>
-          <div class="item" data-value="arvancloud">ArvanCloud</div>
-          <div class="item" data-value="auroradns">Aurora DNS</div>
-          <div class="item" data-value="autodns">Autodns</div>
-          <div class="item" data-value="azure">Azure (deprecated)</div>
-          <div class="item" data-value="azuredns">Azure DNS</div>
-          <div class="item" data-value="bindman">Bindman</div>
-          <div class="item" data-value="bluecat">Bluecat</div>
-          <div class="item" data-value="brandit">Brandit</div>
-          <div class="item" data-value="bunny">Bunny</div>
-          <div class="item" data-value="checkdomain">Checkdomain</div>
-          <div class="item" data-value="civo">Civo</div>
-          <div class="item" data-value="cloudru">Cloud.ru</div>
-          <div class="item" data-value="clouddns">CloudDNS</div>
-          <div class="item" data-value="cloudflare">Cloudflare</div>
-          <div class="item" data-value="cloudns">ClouDNS</div>
-          <div class="item" data-value="cloudxns">CloudXNS</div>
-          <div class="item" data-value="conoha">ConoHa</div>
-          <div class="item" data-value="constellix">Constellix</div>
-          <div class="item" data-value="cpanel">CPanel/WHM</div>
-          <div class="item" data-value="derak">Derak Cloud</div>
-          <div class="item" data-value="desec">deSEC.io</div>
-          <div class="item" data-value="designate">Designate DNSaaS for Openstack</div>
-          <div class="item" data-value="digitalocean">Digital Ocean</div>
-          <div class="item" data-value="dnsmadeeasy">DNS Made Easy</div>
-          <div class="item" data-value="dnshomede">dnsHome.de</div>
-          <div class="item" data-value="dnsimple">DNSimple</div>
-          <div class="item" data-value="dnspod">DNSPod (deprecated)</div>
-          <div class="item" data-value="dode">Domain Offensive (do.de)</div>
-          <div class="item" data-value="domeneshop">Domeneshop</div>
-          <div class="item" data-value="dreamhost">DreamHost</div>
-          <div class="item" data-value="duckdns">Duck DNS</div>
-          <div class="item" data-value="dyn">Dyn</div>
-          <div class="item" data-value="dynu">Dynu</div>
-          <div class="item" data-value="easydns">EasyDNS</div>
-          <div class="item" data-value="efficientip">Efficient IP</div>
-          <div class="item" data-value="epik">Epik</div>
-          <div class="item" data-value="exoscale">Exoscale</div>
-          <div class="item" data-value="exec">External program</div>
-          <div class="item" data-value="freemyip">freemyip.com</div>
-          <div class="item" data-value="gcore">G-Core</div>
-          <div class="item" data-value="gandi">Gandi</div>
-          <div class="item" data-value="gandiv5">Gandi Live DNS (v5)</div>
-          <div class="item" data-value="glesys">Glesys</div>
-          <div class="item" data-value="godaddy">Go Daddy</div>
-          <div class="item" data-value="gcloud">Google Cloud</div>
-          <div class="item" data-value="googledomains">Google Domains</div>
-          <div class="item" data-value="hetzner">Hetzner</div>
-          <div class="item" data-value="hostingde">Hosting.de</div>
-          <div class="item" data-value="hosttech">Hosttech</div>
-          <div class="item" data-value="httpreq">HTTP request</div>
-          <div class="item" data-value="httpnet">http.net</div>
-          <div class="item" data-value="hurricane">Hurricane Electric DNS</div>
-          <div class="item" data-value="hyperone">HyperOne</div>
-          <div class="item" data-value="ibmcloud">IBM Cloud (SoftLayer)</div>
-          <div class="item" data-value="iijdpf">IIJ DNS Platform Service</div>
-          <div class="item" data-value="infoblox">Infoblox</div>
-          <div class="item" data-value="infomaniak">Infomaniak</div>
-          <div class="item" data-value="iij">Internet Initiative Japan</div>
-          <div class="item" data-value="internetbs">Internet.bs</div>
-          <div class="item" data-value="inwx">INWX</div>
-          <div class="item" data-value="ionos">Ionos</div>
-          <div class="item" data-value="ipv64">IPv64</div>
-          <div class="item" data-value="iwantmyname">iwantmyname</div>
-          <div class="item" data-value="joker">Joker</div>
-          <div class="item" data-value="acme-dns">Joohoi's ACME-DNS</div>
-          <div class="item" data-value="liara">Liara</div>
-          <div class="item" data-value="linode">Linode (v4)</div>
-          <div class="item" data-value="liquidweb">Liquid Web</div>
-          <div class="item" data-value="loopia">Loopia</div>
-          <div class="item" data-value="luadns">LuaDNS</div>
-          <div class="item" data-value="mailinabox">Mail-in-a-Box</div>
-          <div class="item" data-value="metaname">Metaname</div>
-          <div class="item" data-value="mydnsjp">MyDNS.jp</div>
-          <div class="item" data-value="mythicbeasts">MythicBeasts</div>
-          <div class="item" data-value="namedotcom">Name.com</div>
-          <div class="item" data-value="namecheap">Namecheap</div>
-          <div class="item" data-value="namesilo">Namesilo</div>
-          <div class="item" data-value="nearlyfreespeech">NearlyFreeSpeech.NET</div>
-          <div class="item" data-value="netcup">Netcup</div>
-          <div class="item" data-value="netlify">Netlify</div>
-          <div class="item" data-value="nicmanager">Nicmanager</div>
-          <div class="item" data-value="nifcloud">NIFCloud</div>
-          <div class="item" data-value="njalla">Njalla</div>
-          <div class="item" data-value="nodion">Nodion</div>
-          <div class="item" data-value="ns1">NS1</div>
-          <div class="item" data-value="otc">Open Telekom Cloud</div>
-          <div class="item" data-value="oraclecloud">Oracle Cloud</div>
-          <div class="item" data-value="ovh">OVH</div>
-          <div class="item" data-value="plesk">plesk.com</div>
-          <div class="item" data-value="porkbun">Porkbun</div>
-          <div class="item" data-value="pdns">PowerDNS</div>
-          <div class="item" data-value="rackspace">Rackspace</div>
-          <div class="item" data-value="rcodezero">RcodeZero</div>
-          <div class="item" data-value="regru">reg.ru</div>
-          <div class="item" data-value="rfc2136">RFC2136</div>
-          <div class="item" data-value="rimuhosting">RimuHosting</div>
-          <div class="item" data-value="sakuracloud">Sakura Cloud</div>
-          <div class="item" data-value="scaleway">Scaleway</div>
-          <div class="item" data-value="selectel">Selectel</div>
-          <div class="item" data-value="servercow">Servercow</div>
-          <div class="item" data-value="shellrent">Shellrent</div>
-          <div class="item" data-value="simply">Simply.com</div>
-          <div class="item" data-value="sonic">Sonic</div>
-          <div class="item" data-value="stackpath">Stackpath</div>
-          <div class="item" data-value="tencentcloud">Tencent Cloud DNS</div>
-          <div class="item" data-value="transip">TransIP</div>
-          <div class="item" data-value="safedns">UKFast SafeDNS</div>
-          <div class="item" data-value="ultradns">Ultradns</div>
-          <div class="item" data-value="variomedia">Variomedia</div>
-          <div class="item" data-value="vegadns">VegaDNS</div>
-          <div class="item" data-value="vercel">Vercel</div>
-          <div class="item" data-value="versio">Versio.[nl|eu|uk]</div>
-          <div class="item" data-value="vinyldns">VinylDNS</div>
-          <div class="item" data-value="vkcloud">VK Cloud</div>
-          <div class="item" data-value="vscale">Vscale</div>
-          <div class="item" data-value="vultr">Vultr</div>
-          <div class="item" data-value="webnames">Webnames</div>
-          <div class="item" data-value="websupport">Websupport</div>
-          <div class="item" data-value="wedos">WEDOS</div>
-          <div class="item" data-value="yandex360">Yandex 360</div>
-          <div class="item" data-value="yandexcloud">Yandex Cloud</div>
-          <div class="item" data-value="yandex">Yandex PDD</div>
-          <div class="item" data-value="zoneee">Zone.ee</div>
-          <div class="item" data-value="zonomi">Zonomi</div>
+        <div class="default text">Pick a DNS Provider</div>
+        <div class="menu" id="dnsProviderList">
+          <!-- Auto populate moved to acmedns module and initDNSProviderList() -->
         </div>
       </div>
     </div>
     <div class="field dnsChallengeOnly" style="display:none;">
-      <label>Credentials File Content</label>
-      <textarea id="dnsCredentials" placeholder=""></textarea>
-      <small>For more information on the supported DNS Providers and their attirbutes look <a href="https://go-acme.github.io/lego/dns/" target="_blank">here</a>! </small>
-      <div class="ui negative message">
-        <i class="icon exclamation triangle"></i>
-        These credentials will be stored as plaintext in the database and in environment variables!
+      <div class="ui divider"></div>
+      <p>Required Configurations</p>
+      <div id="dnsProviderAPIFields">
+
       </div>
+      <!-- 
+        <label>Credentials File Content</label>
+        <textarea id="dnsCredentials" placeholder=""></textarea>
+        <small>For more information on the supported DNS Providers and their attirbutes look <a href="https://go-acme.github.io/lego/dns/" target="_blank">here</a>! </small>
+        <div class="ui negative message">
+          <i class="icon exclamation triangle"></i>
+          These credentials will be stored as plaintext in the database and in environment variables!
+        </div>
+      -->
     </div>
     <div class="field" id="caInput" style="display:none;">
       <label>ACME Server URL</label>
@@ -483,6 +360,7 @@
       obtainCertificate();
     });
 
+    //On CA change in dropdown
     $("input[name=ca]").on('change', function() {
       if(this.value == "Custom ACME Server") {
         $("#caInput").show();
@@ -490,421 +368,71 @@
         $("#hmacInput").show();
         $("#skipTLS").show();
         $("#dnsChallenge").hide();
+        $(".dnsChallengeOnly").hide();
       } else if (this.value == "ZeroSSL") {
         $("#kidInput").show();
         $("#hmacInput").show();
         $("#dnsChallenge").hide();
+        $(".dnsChallengeOnly").hide();
+        $("#skipTLS").hide();
       } else if (this.value == "Buypass") {
         $("#kidInput").show();
         $("#hmacInput").show();
-        $("#dnsChallenge").hide()
+        $("#dnsChallenge").hide();
+        $(".dnsChallengeOnly").hide();
+        $("#skipTLS").hide();
       }else {
         $("#caInput").hide();
         $("#skipTLS").hide();
         $("#kidInput").hide();
         $("#hmacInput").hide();
         $("#dnsChallenge").show();
+        if ($("#useDnsChallenge")[0].checked){
+          $(".dnsChallengeOnly").show();
+        }
+        
       }
     })
 
+    //On DNS provider dropdown change
     $("input[name=dnsProvider]").on('change', function() {
-      // The file proivders-scraper-util.js can be used to generate the list of providers
-      switch(this.value){
-        case "edgedns":
-          $("#dnsCredentials").val("AKAMAI_ACCESS_TOKEN=\nAKAMAI_CLIENT_SECRET=\nAKAMAI_CLIENT_TOKEN=\nAKAMAI_EDGERC=\nAKAMAI_EDGERC_SECTION=\nAKAMAI_HOST=");
-          break;
-        case "alidns":
-          $("#dnsCredentials").val("ALICLOUD_ACCESS_KEY=\nALICLOUD_RAM_ROLE=\nALICLOUD_SECRET_KEY=\nALICLOUD_SECURITY_TOKEN=");
-          break;
-        case "allinkl":
-          $("#dnsCredentials").val("ALL_INKL_LOGIN=\nALL_INKL_PASSWORD=");
-          break;
-        case "lightsail":
-          $("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nDNS_ZONE=");
-          break;
-        case "route53":
-          $("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_ASSUME_ROLE_ARN=\nAWS_ASSUME_ROLE_ARN_FILE=\nAWS_EXTERNAL_ID=\nAWS_EXTERNAL_ID_FILE=\nAWS_HOSTED_ZONE_ID=\nAWS_PROFILE=\nAWS_PROFILE_FILE=\nAWS_REGION=\nAWS_REGION_FILE=\nAWS_SDK_LOAD_CONFIG=\nAWS_SDK_LOAD_CONFIG_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=");
-          break;
-        case "arvancloud":
-          $("#dnsCredentials").val("ARVANCLOUD_API_KEY=");
-          break;
-        case "auroradns":
-          $("#dnsCredentials").val("AURORA_API_KEY=\nAURORA_SECRET=");
-          break;
-        case "autodns":
-          $("#dnsCredentials").val("AUTODNS_API_PASSWORD=\nAUTODNS_API_USER=");
-          break;
-        case "azure":
-          $("#dnsCredentials").val("AZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_ENVIRONMENT=\nAZURE_RESOURCE_GROUP=\nAZURE_SUBSCRIPTION_ID=\nAZURE_TENANT_ID=\ninstance metadata service=");
-          break;
-        case "azuredns":
-          $("#dnsCredentials").val("AZURE_CLIENT_CERTIFICATE_PATH=\nAZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_TENANT_ID=");
-          break;
-        case "bindman":
-          $("#dnsCredentials").val("BINDMAN_MANAGER_ADDRESS=");
-          break;
-        case "bluecat":
-          $("#dnsCredentials").val("BLUECAT_CONFIG_NAME=\nBLUECAT_DNS_VIEW=\nBLUECAT_PASSWORD=\nBLUECAT_SERVER_URL=\nBLUECAT_USER_NAME=");
-          break;
-        case "brandit":
-          $("#dnsCredentials").val("BRANDIT_API_KEY=\nBRANDIT_API_USERNAME=");
-          break;
-        case "bunny":
-          $("#dnsCredentials").val("BUNNY_API_KEY=");
-          break;
-        case "checkdomain":
-          $("#dnsCredentials").val("CHECKDOMAIN_TOKEN=");
-          break;
-        case "civo":
-          $("#dnsCredentials").val("CIVO_TOKEN=");
-          break;
-        case "cloudru":
-          $("#dnsCredentials").val("CLOUDRU_KEY_ID=\nCLOUDRU_SECRET=\nCLOUDRU_SERVICE_INSTANCE_ID=");
-          break;
-        case "clouddns":
-          $("#dnsCredentials").val("CLOUDDNS_CLIENT_ID=\nCLOUDDNS_EMAIL=\nCLOUDDNS_PASSWORD=");
-          break;
-        case "cloudflare":
-          $("#dnsCredentials").val("CF_API_EMAIL=\nCF_API_KEY=\nCF_DNS_API_TOKEN=\nCF_ZONE_API_TOKEN=\nCLOUDFLARE_API_KEY=\nCLOUDFLARE_DNS_API_TOKEN=\nCLOUDFLARE_EMAIL=\nCLOUDFLARE_ZONE_API_TOKEN=");
-          break;
-        case "cloudns":
-          $("#dnsCredentials").val("CLOUDNS_AUTH_ID=\nCLOUDNS_AUTH_PASSWORD=");
-          break;
-        case "cloudxns":
-          $("#dnsCredentials").val("CLOUDXNS_API_KEY=\nCLOUDXNS_SECRET_KEY=");
-          break;
-        case "conoha":
-          $("#dnsCredentials").val("CONOHA_API_PASSWORD=\nCONOHA_API_USERNAME=\nCONOHA_TENANT_ID=");
-          break;
-        case "constellix":
-          $("#dnsCredentials").val("CONSTELLIX_API_KEY=\nCONSTELLIX_SECRET_KEY=");
-          break;
-        case "cpanel":
-          $("#dnsCredentials").val("CPANEL_BASE_URL=\nCPANEL_TOKEN=\nCPANEL_USERNAME=");
-          break;
-        case "derak":
-          $("#dnsCredentials").val("DERAK_API_KEY=");
-          break;
-        case "desec":
-          $("#dnsCredentials").val("DESEC_TOKEN=");
-          break;
-        case "designate":
-          $("#dnsCredentials").val("OS_APPLICATION_CREDENTIAL_ID=\nOS_APPLICATION_CREDENTIAL_NAME=\nOS_APPLICATION_CREDENTIAL_SECRET=\nOS_AUTH_URL=\nOS_PASSWORD=\nOS_PROJECT_NAME=\nOS_REGION_NAME=\nOS_USERNAME=\nOS_USER_ID=");
-          break;
-        case "digitalocean":
-          $("#dnsCredentials").val("DO_AUTH_TOKEN=");
-          break;
-        case "dnsmadeeasy":
-          $("#dnsCredentials").val("DNSMADEEASY_API_KEY=\nDNSMADEEASY_API_SECRET=");
-          break;
-        case "dnshomede":
-          $("#dnsCredentials").val("DNSHOMEDE_CREDENTIALS=");
-          break;
-        case "dnsimple":
-          $("#dnsCredentials").val("DNSIMPLE_OAUTH_TOKEN=");
-          break;
-        case "dnspod":
-          $("#dnsCredentials").val("DNSPOD_API_KEY=");
-          break;
-        case "dode":
-          $("#dnsCredentials").val("DODE_TOKEN=");
-          break;
-        case "domeneshop":
-          $("#dnsCredentials").val("DOMENESHOP_API_SECRET=\nDOMENESHOP_API_TOKEN=");
-          break;
-        case "dreamhost":
-          $("#dnsCredentials").val("DREAMHOST_API_KEY=");
-          break;
-        case "duckdns":
-          $("#dnsCredentials").val("DUCKDNS_TOKEN=");
-          break;
-        case "dyn":
-          $("#dnsCredentials").val("DYN_CUSTOMER_NAME=\nDYN_PASSWORD=\nDYN_USER_NAME=");
-          break;
-        case "dynu":
-          $("#dnsCredentials").val("DYNU_API_KEY=");
-          break;
-        case "easydns":
-          $("#dnsCredentials").val("EASYDNS_KEY=\nEASYDNS_TOKEN=");
-          break;
-        case "efficientip":
-          $("#dnsCredentials").val("EFFICIENTIP_DNS_NAME=\nEFFICIENTIP_HOSTNAME=\nEFFICIENTIP_PASSWORD=\nEFFICIENTIP_USERNAME=");
-          break;
-        case "epik":
-          $("#dnsCredentials").val("EPIK_SIGNATURE=");
-          break;
-        case "exoscale":
-          $("#dnsCredentials").val("EXOSCALE_API_KEY=\nEXOSCALE_API_SECRET=");
-          break;
-        case "exec":
-          $("#dnsCredentials").val("EXEC_MODE=\nRAW=\nEXEC_PATH=");
-          break;
-        case "freemyip":
-          $("#dnsCredentials").val("FREEMYIP_TOKEN=");
-          break;
-        case "gcore":
-          $("#dnsCredentials").val("GCORE_PERMANENT_API_TOKEN=");
-          break;
-        case "gandi":
-          $("#dnsCredentials").val("GANDI_API_KEY=");
-          break;
-        case "gandiv5":
-          $("#dnsCredentials").val("GANDIV5_API_KEY=\nGANDIV5_PERSONAL_ACCESS_TOKEN=");
-          break;
-        case "glesys":
-          $("#dnsCredentials").val("GLESYS_API_KEY=\nGLESYS_API_USER=");
-          break;
-        case "godaddy":
-          $("#dnsCredentials").val("GODADDY_API_KEY=\nGODADDY_API_SECRET=");
-          break;
-        case "gcloud":
-          $("#dnsCredentials").val("Application Default Credentials=\nGCE_PROJECT=\nGCE_SERVICE_ACCOUNT=\nGCE_SERVICE_ACCOUNT_FILE=");
-          break;
-        case "googledomains":
-          $("#dnsCredentials").val("GOOGLE_DOMAINS_ACCESS_TOKEN=");
-          break;
-        case "hetzner":
-          $("#dnsCredentials").val("HETZNER_API_KEY=");
-          break;
-        case "hostingde":
-          $("#dnsCredentials").val("HOSTINGDE_API_KEY=");
-          break;
-        case "hosttech":
-          $("#dnsCredentials").val("HOSTTECH_API_KEY=\nHOSTTECH_PASSWORD=");
-          break;
-        case "httpreq":
-          $("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
-          break;
-        case "httpnet":
-          $("#dnsCredentials").val("HTTPNET_API_KEY=");
-          break;
-        case "hurricane":
-          $("#dnsCredentials").val("HURRICANE_TOKENS=");
-          break;
-        case "hyperone":
-          $("#dnsCredentials").val("HYPERONE_API_URL=\nHYPERONE_LOCATION_ID=\nHYPERONE_PASSPORT_LOCATION=\nHYPERONE_POLLING_INTERVAL=\nHYPERONE_PROPAGATION_TIMEOUT=\nHYPERONE_TTL=");
-          break;
-        case "ibmcloud":
-          $("#dnsCredentials").val("SOFTLAYER_API_KEY=\nSOFTLAYER_USERNAME=");
-          break;
-        case "iijdpf":
-          $("#dnsCredentials").val("IIJ_DPF_API_TOKEN=\nIIJ_DPF_DPM_SERVICE_CODE=");
-          break;
-        case "infoblox":
-          $("#dnsCredentials").val("INFOBLOX_HOST=\nINFOBLOX_PASSWORD=\nINFOBLOX_USERNAME=");
-          break;
-        case "infomaniak":
-          $("#dnsCredentials").val("INFOMANIAK_ACCESS_TOKEN=");
-          break;
-        case "iij":
-          $("#dnsCredentials").val("IIJ_API_ACCESS_KEY=\nIIJ_API_SECRET_KEY=\nIIJ_DO_SERVICE_CODE=");
-          break;
-        case "internetbs":
-          $("#dnsCredentials").val("INTERNET_BS_API_KEY=\nINTERNET_BS_PASSWORD=");
-          break;
-        case "inwx":
-          $("#dnsCredentials").val("INWX_PASSWORD=\nINWX_USERNAME=");
-          break;
-        case "ionos":
-          $("#dnsCredentials").val("IONOS_API_KEY=\n&lt;prefix&gt;.&lt;secret&gt;=");
-          break;
-        case "ipv64":
-          $("#dnsCredentials").val("IPV64_API_KEY=");
-          break;
-        case "iwantmyname":
-          $("#dnsCredentials").val("IWANTMYNAME_PASSWORD=\nIWANTMYNAME_USERNAME=");
-          break;
-        case "joker":
-          $("#dnsCredentials").val("JOKER_API_KEY=\nJOKER_API_MODE=\nJOKER_PASSWORD=\nJOKER_USERNAME=");
-          break;
-        case "acme-dns":
-          $("#dnsCredentials").val("ACME_DNS_API_BASE=\nACME_DNS_STORAGE_PATH=");
-          break;
-        case "liara":
-          $("#dnsCredentials").val("LIARA_API_KEY=");
-          break;
-        case "linode":
-          $("#dnsCredentials").val("LINODE_TOKEN=");
-          break;
-        case "liquidweb":
-          $("#dnsCredentials").val("LWAPI_PASSWORD=\nLWAPI_USERNAME=");
-          break;
-        case "loopia":
-          $("#dnsCredentials").val("LOOPIA_API_PASSWORD=\nLOOPIA_API_USER=");
-          break;
-        case "luadns":
-          $("#dnsCredentials").val("LUADNS_API_TOKEN=\nLUADNS_API_USERNAME=");
-          break;
-        case "mailinabox":
-          $("#dnsCredentials").val("MAILINABOX_BASE_URL=\nMAILINABOX_EMAIL=\nMAILINABOX_PASSWORD=");
-          break;
-        case "metaname":
-          $("#dnsCredentials").val("METANAME_ACCOUNT_REFERENCE=\nMETANAME_API_KEY=");
-          break;
-        case "mydnsjp":
-          $("#dnsCredentials").val("MYDNSJP_MASTER_ID=\nMYDNSJP_PASSWORD=");
-          break;
-        case "mythicbeasts":
-          $("#dnsCredentials").val("MYTHICBEASTS_PASSWORD=\nMYTHICBEASTS_USERNAME=");
-          break;
-        case "namedotcom":
-          $("#dnsCredentials").val("NAMECOM_API_TOKEN=\nNAMECOM_USERNAME=");
-          break;
-        case "namecheap":
-          $("#dnsCredentials").val("NAMECHEAP_API_KEY=\nNAMECHEAP_API_USER=");
-          break;
-        case "namesilo":
-          $("#dnsCredentials").val("NAMESILO_API_KEY=");
-          break;
-        case "nearlyfreespeech":
-          $("#dnsCredentials").val("NEARLYFREESPEECH_API_KEY=\nNEARLYFREESPEECH_LOGIN=");
-          break;
-        case "netcup":
-          $("#dnsCredentials").val("NETCUP_API_KEY=\nNETCUP_API_PASSWORD=\nNETCUP_CUSTOMER_NUMBER=");
-          break;
-        case "netlify":
-          $("#dnsCredentials").val("NETLIFY_TOKEN=");
-          break;
-        case "nicmanager":
-          $("#dnsCredentials").val("NICMANAGER_API_EMAIL=\nNICMANAGER_API_LOGIN=\nNICMANAGER_API_PASSWORD=\nNICMANAGER_API_USERNAME=");
-          break;
-        case "nifcloud":
-          $("#dnsCredentials").val("NIFCLOUD_ACCESS_KEY_ID=\nNIFCLOUD_SECRET_ACCESS_KEY=");
-          break;
-        case "njalla":
-          $("#dnsCredentials").val("NJALLA_TOKEN=");
-          break;
-        case "nodion":
-          $("#dnsCredentials").val("NODION_API_TOKEN=");
-          break;
-        case "ns1":
-          $("#dnsCredentials").val("NS1_API_KEY=");
-          break;
-        case "otc":
-          $("#dnsCredentials").val("OTC_DOMAIN_NAME=\nOTC_IDENTITY_ENDPOINT=\nOTC_PASSWORD=\nOTC_PROJECT_NAME=\nOTC_USER_NAME=");
-          break;
-        case "oraclecloud":
-          $("#dnsCredentials").val("OCI_COMPARTMENT_OCID=\nOCI_PRIVKEY_FILE=\nOCI_PRIVKEY_PASS=\nOCI_PUBKEY_FINGERPRINT=\nOCI_REGION=\nOCI_TENANCY_OCID=\nOCI_USER_OCID=");
-          break;
-        case "ovh":
-          $("#dnsCredentials").val("OVH_APPLICATION_KEY=\nOVH_APPLICATION_SECRET=\nOVH_CONSUMER_KEY=\nOVH_ENDPOINT=");
-          break;
-        case "plesk":
-          $("#dnsCredentials").val("PLESK_PASSWORD=\nPLESK_SERVER_BASE_URL=\nPLESK_USERNAME=");
-          break;
-        case "porkbun":
-          $("#dnsCredentials").val("PORKBUN_API_KEY=\nPORKBUN_SECRET_API_KEY=");
-          break;
-        case "pdns":
-          $("#dnsCredentials").val("PDNS_API_KEY=\nPDNS_API_URL=");
-          break;
-        case "rackspace":
-          $("#dnsCredentials").val("RACKSPACE_API_KEY=\nRACKSPACE_USER=");
-          break;
-        case "rcodezero":
-          $("#dnsCredentials").val("RCODEZERO_API_TOKEN=");
-          break;
-        case "regru":
-          $("#dnsCredentials").val("REGRU_PASSWORD=\nREGRU_USERNAME=");
-          break;
-        case "rfc2136":
-          $("#dnsCredentials").val("RFC2136_NAMESERVER=\nRFC2136_TSIG_ALGORITHM=\nRFC2136_TSIG*=\nRFC2136_TSIG_KEY=\nRFC2136_TSIG*=\nRFC2136_TSIG_SECRET=\n RFC2136_TSIG*=");
-          break;
-        case "rimuhosting":
-          $("#dnsCredentials").val("RIMUHOSTING_API_KEY=");
-          break;
-        case "sakuracloud":
-          $("#dnsCredentials").val("SAKURACLOUD_ACCESS_TOKEN=\nSAKURACLOUD_ACCESS_TOKEN_SECRET=");
-          break;
-        case "scaleway":
-          $("#dnsCredentials").val("SCW_PROJECT_ID=\nSCW_SECRET_KEY=");
-          break;
-        case "selectel":
-          $("#dnsCredentials").val("SELECTEL_API_TOKEN=");
-          break;
-        case "selectelv2":
-          $("#dnsCredentials").val("SELECTELV2_ACCOUNT_ID=\nSELECTELV2_PASSWORD=\nSELECTELV2_PROJECT_ID=\nSELECTELV2_USERNAME=");
-          break;
-        case "servercow":
-          $("#dnsCredentials").val("SERVERCOW_PASSWORD=\nSERVERCOW_USERNAME=");
-          break;
-        case "shellrent":
-          $("#dnsCredentials").val("SHELLRENT_TOKEN=\nSHELLRENT_USERNAME=");
-          break;
-        case "simply":
-          $("#dnsCredentials").val("SIMPLY_ACCOUNT_NAME=\nSIMPLY_API_KEY=");
-          break;
-        case "sonic":
-          $("#dnsCredentials").val("SONIC_API_KEY=\nSONIC_USER_ID=");
-          break;
-        case "stackpath":
-          $("#dnsCredentials").val("STACKPATH_CLIENT_ID=\nSTACKPATH_CLIENT_SECRET=\nSTACKPATH_STACK_ID=");
-          break;
-        case "tencentcloud":
-          $("#dnsCredentials").val("TENCENTCLOUD_SECRET_ID=\nTENCENTCLOUD_SECRET_KEY=");
-          break;
-        case "transip":
-          $("#dnsCredentials").val("TRANSIP_ACCOUNT_NAME=\nTRANSIP_PRIVATE_KEY_PATH=");
-          break;
-        case "safedns":
-          $("#dnsCredentials").val("SAFEDNS_AUTH_TOKEN=");
-          break;
-        case "ultradns":
-          $("#dnsCredentials").val("ULTRADNS_PASSWORD=\nULTRADNS_USERNAME=");
-          break;
-        case "variomedia":
-          $("#dnsCredentials").val("VARIOMEDIA_API_TOKEN=");
-          break;
-        case "vegadns":
-          $("#dnsCredentials").val("SECRET_VEGADNS_KEY=\nSECRET_VEGADNS_SECRET=\nVEGADNS_URL=");
-          break;
-        case "vercel":
-          $("#dnsCredentials").val("VERCEL_API_TOKEN=");
-          break;
-        case "versio":
-          $("#dnsCredentials").val("VERSIO_PASSWORD=\nVERSIO_USERNAME=");
-          break;
-        case "vinyldns":
-          $("#dnsCredentials").val("VINYLDNS_ACCESS_KEY=\nVINYLDNS_HOST=\nVINYLDNS_SECRET_KEY=");
-          break;
-        case "vkcloud":
-          $("#dnsCredentials").val("VK_CLOUD_PASSWORD=\nVK_CLOUD_PROJECT_ID=\nVK_CLOUD_USERNAME=");
-          break;
-        case "vscale":
-          $("#dnsCredentials").val("VSCALE_API_TOKEN=");
-          break;
-        case "vultr":
-          $("#dnsCredentials").val("VULTR_API_KEY=");
-          break;
-        case "webnames":
-          $("#dnsCredentials").val("WEBNAMES_API_KEY=");
-          break;
-        case "httpreq":
-          $("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
-          break;
-        case "websupport":
-          $("#dnsCredentials").val("WEBSUPPORT_API_KEY=\nWEBSUPPORT_SECRET=");
-          break;
-        case "wedos":
-          $("#dnsCredentials").val("WEDOS_USERNAME=\nWEDOS_WAPI_PASSWORD=");
-          break;
-        case "yandex360":
-          $("#dnsCredentials").val("YANDEX360_OAUTH_TOKEN=\nYANDEX360_ORG_ID=");
-          break;
-        case "yandexcloud":
-          $("#dnsCredentials").val("YANDEX_CLOUD_FOLDER_ID=\nYANDEX_CLOUD_IAM_TOKEN=\ndns.admin=");
-          break;
-        case "yandex":
-          $("#dnsCredentials").val("YANDEX_PDD_TOKEN=");
-          break;
-        case "zoneee":
-          $("#dnsCredentials").val("ZONEEE_API_KEY=\nZONEEE_API_USER=");
-          break;
-        case "zonomi":
-          $("#dnsCredentials").val("ZONOMI_API_KEY=");
-          break;
-              }
-    })
+      let newProviderName = $("#dnsProvider").find("input").val();
+      $.get("/api/acme/dns/providers?name=" + newProviderName, function(data){
+        console.log("Loaded required config", data);
+        $("#dnsProviderAPIFields").html("");
+        //Generate a form for this config
+        let booleanFieldsHTML = "";
+        for (const [key, datatype] of Object.entries(data)) {
+          if (datatype == "int"){
+            $("#dnsProviderAPIFields").append(`<div class="ui fluid labeled dnsConfigField input" key="${key}" style="margin-top: 0.2em;">
+              <div class="ui basic blue label" style="font-weight: 300;">
+                ${key}
+              </div>
+              <input type="number" value="300">
+            </div>`);
+          }else if (datatype == "bool"){
+             booleanFieldsHTML += (`<div class="ui checkbox dnsConfigField" key="${key}" style="margin-top: 1em !important; padding-left: 0.4em;">
+              <input type="checkbox">
+              <label>${key}</label>
+            </div>`);
+          }else{
+            //Default to string
+            $("#dnsProviderAPIFields").append(`<div class="ui fluid labeled input dnsConfigField" key="${key}" style="margin-top: 0.2em;">
+              <div class="ui basic label" style="font-weight: 300;">
+                ${key}
+              </div>
+              <input type="text">
+            </div>`);
+          }
+        }
+
+        //Append the boolean fields at the bottom, if exists
+        $("#dnsProviderAPIFields").append(booleanFieldsHTML);
+        if (booleanFieldsHTML != ""){
+          $(".dnsConfigField.checkbox").checkbox();
+        }
+      });
+    });
 
     // Get filename form domains and input
     function getFilename() {
@@ -987,29 +515,52 @@
       });
     }
 
+    //Read DNS credential from form and generate a key value structure that looks like
+    // the old DNSCredential TextArea input
+    
+    function readDnsCredentials(){
+      let dnsCredentials = "";
+      $(".dnsConfigField").each(function(){
+        let thisKey = $(this).attr("key");
+        if ($(this).hasClass("checkbox")){
+          //Boolean option
+          let checked = $(this).find("input")[0].checked;
+          dnsCredentials += `${thisKey}=${checked?"true":"false"}\n`
+        }else{
+          //String or int options
+          let value = $(this).find("input").val().trim();
+          dnsCredentials += `${thisKey}=${value}\n`
+        }
+      });
+      dnsCredentials = dnsCredentials.trim();
+      return dnsCredentials;
+    }
+
     // Update DNS values for autorenewal
     function updateCertificateDNS() {
       var dns = $("#useDnsChallenge")[0].checked;
       var dnsProvider = "";
       var dnsCredentials = "";
 
-      if (dns) {
-        dnsProvider = $("#dnsProvider").dropdown("get value");
-        dnsCredentials = $("#dnsCredentials").val();
+      if (!dns) {
+        return;
+      }
 
-        if(dnsProvider == "") {
-          parent.msgbox("DNS Provider cannot be empty", false, 5000);
-          $("#obtainButton").removeClass("loading").removeClass("disabled");
-          return;
-        }
+      dnsProvider = $("#dnsProvider").dropdown("get value");
 
-        
-        if(dnsCredentials == "") {
-          parent.msgbox("DNS Credentials cannot be empty", false, 5000);
-          $("#obtainButton").removeClass("loading").removeClass("disabled");
-          return;
-        }
-      } else {
+      //dnsCredentials = $("#dnsCredentials").val();
+      dnsCredentials = readDnsCredentials();
+
+      if(dnsProvider == "") {
+        parent.msgbox("DNS Provider cannot be empty", false, 5000);
+        $("#obtainButton").removeClass("loading").removeClass("disabled");
+        return;
+      }
+
+      
+      if(dnsCredentials == "") {
+        parent.msgbox("DNS Credentials cannot be empty", false, 5000);
+        $("#obtainButton").removeClass("loading").removeClass("disabled");
         return;
       }
 
@@ -1234,7 +785,35 @@
       }
     }
 
-    //Clear  up the input field when page load
+    //Load the json map and create the dropdown for DNS provider names
+    let dnsProviderNameMap = {};
+    function initDNSProviderList(){
+      $.get("dnsnames.json", function(namemap){
+        dnsProviderNameMap = namemap;
+        //Load a list of supported DNS provider from backend
+        $("#dnsProviderList").html("");
+        $.get("/api/acme/dns/providers", function(providerList){
+          providerList.sort();
+          providerList.forEach(providerid => {
+            let providerName = providerid;
+            if (dnsProviderNameMap[providerid] != undefined){
+              providerName = dnsProviderNameMap[providerid];
+            }
+            $("#dnsProviderList").append(`<div class="item" data-value="${providerid}">${providerName}</div>`);
+          });
+          $("#dnsProvider").dropdown();
+          setTimeout(function(){
+            //The dropdown is large, it takes some time to load
+            $("#dnsProvider").dropdown("set selected", "cloudflare");
+          }, 300)
+          
+        });
+      });
+    }
+    initDNSProviderList();
+    
+
+    //Clear up the input field when page load
     $("#filenameInput").val("");
   </script>
 </body>

+ 132 - 0
web/snippet/dnsnames.json

@@ -0,0 +1,132 @@
+{
+    "edgedns": "Akamai EdgeDNS",
+    "alidns": "Alibaba Cloud DNS",
+    "allinkl": "all-inkl",
+    "lightsail": "Amazon Lightsail",
+    "route53": "Amazon Route 53",
+    "arvancloud": "ArvanCloud",
+    "auroradns": "Aurora DNS",
+    "autodns": "Autodns",
+    "azure": "Azure (deprecated)",
+    "azuredns": "Azure DNS",
+    "bindman": "Bindman",
+    "bluecat": "Bluecat",
+    "brandit": "Brandit",
+    "bunny": "Bunny",
+    "checkdomain": "Checkdomain",
+    "civo": "Civo",
+    "cloudru": "Cloud.ru",
+    "clouddns": "CloudDNS",
+    "cloudflare": "Cloudflare",
+    "cloudns": "ClouDNS",
+    "cloudxns": "CloudXNS",
+    "conoha": "ConoHa",
+    "constellix": "Constellix",
+    "cpanel": "CPanel/WHM",
+    "derak": "Derak Cloud",
+    "desec": "deSEC.io",
+    "designate": "Designate DNSaaS for Openstack",
+    "digitalocean": "Digital Ocean",
+    "dnsmadeeasy": "DNS Made Easy",
+    "dnshomede": "dnsHome.de",
+    "dnsimple": "DNSimple",
+    "dnspod": "DNSPod (deprecated)",
+    "dode": "Domain Offensive (do.de)",
+    "domeneshop": "Domeneshop",
+    "dreamhost": "DreamHost",
+    "duckdns": "Duck DNS",
+    "dyn": "Dyn",
+    "dynu": "Dynu",
+    "easydns": "EasyDNS",
+    "efficientip": "Efficient IP",
+    "epik": "Epik",
+    "exoscale": "Exoscale",
+    "exec": "External program",
+    "freemyip": "freemyip.com",
+    "gcore": "G-Core",
+    "gandi": "Gandi",
+    "gandiv5": "Gandi Live DNS (v5)",
+    "glesys": "Glesys",
+    "godaddy": "Go Daddy",
+    "gcloud": "Google Cloud",
+    "googledomains": "Google Domains",
+    "hetzner": "Hetzner",
+    "hostingde": "Hosting.de",
+    "hosttech": "Hosttech",
+    "httpreq": "HTTP request",
+    "httpnet": "http.net",
+    "hurricane": "Hurricane Electric DNS",
+    "hyperone": "HyperOne",
+    "ibmcloud": "IBM Cloud (SoftLayer)",
+    "iijdpf": "IIJ DNS Platform Service",
+    "infoblox": "Infoblox",
+    "infomaniak": "Infomaniak",
+    "iij": "Internet Initiative Japan",
+    "internetbs": "Internet.bs",
+    "inwx": "INWX",
+    "ionos": "Ionos",
+    "ipv64": "IPv64",
+    "iwantmyname": "iwantmyname",
+    "joker": "Joker",
+    "acme-dns": "Joohoi's ACME-DNS",
+    "liara": "Liara",
+    "linode": "Linode (v4)",
+    "liquidweb": "Liquid Web",
+    "loopia": "Loopia",
+    "luadns": "LuaDNS",
+    "mailinabox": "Mail-in-a-Box",
+    "metaname": "Metaname",
+    "mydnsjp": "MyDNS.jp",
+    "mythicbeasts": "MythicBeasts",
+    "namedotcom": "Name.com",
+    "namecheap": "Namecheap",
+    "namesilo": "Namesilo",
+    "nearlyfreespeech": "NearlyFreeSpeech.NET",
+    "netcup": "Netcup",
+    "netlify": "Netlify",
+    "nicmanager": "Nicmanager",
+    "nifcloud": "NIFCloud",
+    "njalla": "Njalla",
+    "nodion": "Nodion",
+    "ns1": "NS1",
+    "otc": "Open Telekom Cloud",
+    "oraclecloud": "Oracle Cloud",
+    "ovh": "OVH",
+    "plesk": "plesk.com",
+    "porkbun": "Porkbun",
+    "pdns": "PowerDNS",
+    "rackspace": "Rackspace",
+    "rcodezero": "RcodeZero",
+    "regru": "reg.ru",
+    "rfc2136": "RFC2136",
+    "rimuhosting": "RimuHosting",
+    "sakuracloud": "Sakura Cloud",
+    "scaleway": "Scaleway",
+    "selectel": "Selectel",
+    "servercow": "Servercow",
+    "shellrent": "Shellrent",
+    "simply": "Simply.com",
+    "sonic": "Sonic",
+    "stackpath": "Stackpath",
+    "tencentcloud": "Tencent Cloud DNS",
+    "transip": "TransIP",
+    "safedns": "UKFast SafeDNS",
+    "ultradns": "Ultradns",
+    "variomedia": "Variomedia",
+    "vegadns": "VegaDNS",
+    "vercel": "Vercel",
+    "versio": "Versio.[nl|eu|uk]",
+    "vinyldns": "VinylDNS",
+    "vkcloud": "VK Cloud",
+    "vscale": "Vscale",
+    "vultr": "Vultr",
+    "webnames": "Webnames",
+    "websupport": "Websupport",
+    "wedos": "WEDOS",
+    "yandex360": "Yandex 360",
+    "yandexcloud": "Yandex Cloud",
+    "yandex": "Yandex PDD",
+    "zoneee": "Zone.ee",
+    "zonomi": "Zonomi"
+  }
+