The DNS CNAME record can be configured to delegate the configuration of DNS records to some other DNS zone. In other words, it tells DNS clients (like web browsers) to query the DNS records of a different domain, and treat them as if they were for the domain with the CNAME record.
The most common use case for this is when you want to configure a custom domain name for a third party service. In this case you control your domain name, but the third party service controls the servers that host it. It would be inconvenient if you'd have to change your DNS settings whenever this service changes its IP addresses. This is why they commonly request you to create a CNAME record instead. That way you remain in control of your domain name, but they can change the DNS configuration of their service at any time. When such a record exists for a domain name or subdomain, the content of the record is said to be the canonical name of that domain.
Restrictions on CNAME records
There are a couple of restrictions on the configuration of CNAME records:
The content of a CNAME record must be a valid domain name. It cannot be an ip address. See section 3.6 of RFC 1034.
If a CNAME record is present, no other records may be present, except for DNSSEC records (RRSIG, DNSKEY, DS, NSEC and NSEC3PARAM). See section 10.1 of RFC 2181.
Root domains should not have a CNAME record. Because of the previous restriction, the root domain could no longer have NS or SOA records.
MX and NS records must not point to a domain name that has a CNAME record. See section 10.3 of RFC 2181.
\", 6)\nconst _hoisted_53 = /*#__PURE__*/_createElementVNode(\"h2\", { id: \"otherLookup\" }, \"How to lookup other record types\", -1)\n\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { getRecordType, recordTypes } from '@/common/recordTypes';\nimport Icon from '@/components/micro/IconComponent.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport { LargeRectangle, MediumRectangle } from '@/common/adSizes';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { domainNameToUrlPath } from '@/common/domainName';\nimport { RecordTypeLookup } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'RecordTypeLookup',\n props: {\n routerRecordType: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst platforms: Array<'windows' | 'mac' | 'linux'> = [\n 'windows',\n 'mac',\n 'linux',\n];\n\nconst router = useRouter();\n\nconst recordType = computed(() => getRecordType(props.routerRecordType));\n\nfunction redirectTo(domain: string): void {\n if (recordType.value.lower === 'spf') {\n router.push(`/domains/${domainNameToUrlPath(domain)}/email/${recordType.value.lower}/`);\n } else {\n router.push(`/domains/${domainNameToUrlPath(domain)}/dns-records/${recordType.value.lower}/`);\n }\n}\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: `${_unref(recordType).upper} Lookup`,\n description: `Find ${_unref(recordType).plural} (${_unref(recordType).upper} DNS records) for any domain or website. Check if the ${_unref(recordType).upper} records have been configured correctly.`,\n url: `https://www.nslookup.io/${_unref(recordType).lower}-lookup/`\n }, null, 8, [\"title\", \"description\", \"url\"])\n ])),\n _createVNode(HeaderComponent, {\n \"domain-search-to-url\": (encodedDomain) => `/domains/${encodedDomain}/dns-records/${_unref(recordType).lower}/`,\n \"search-button-text\": `Find ${_unref(recordType).upper} records`\n }, null, 8, [\"domain-search-to-url\", \"search-button-text\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"form\", _hoisted_4, [\n _createElementVNode(\"h1\", _hoisted_5, _toDisplayString(_unref(recordType).upper) + \" lookup\", 1),\n _createVNode(DomainSearch, {\n class: \"h-12 mb-6 max-w-full w-[500px]\",\n autofocus: \"\",\n emphasize: \"\",\n buttonText: ['soa', 'spf', 'cname'].includes(_unref(recordType).lower) ? `Find ${_unref(recordType).upper} record` : `Find ${_unref(recordType).upper} records`,\n \"placeholder-text\": _unref(recordType).upper === 'PTR' ? 'IP address or domain name' : 'Domain name',\n onSubmitted: redirectTo\n }, null, 8, [\"buttonText\", \"placeholder-text\"]),\n _createElementVNode(\"p\", _hoisted_6, [\n _createTextVNode(\"Find all \" + _toDisplayString(_unref(recordType).plural) + \" for a domain name with this online DNS \" + _toDisplayString(_unref(recordType).upper) + \" checker. For example, try \", 1),\n _createVNode(DnsRecordsLink, {\n page: _unref(recordType).upper,\n domain: _unref(recordType).exampleDomains[0],\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"page\", \"domain\"]),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n page: _unref(recordType).upper,\n domain: _unref(recordType).exampleDomains[1],\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"page\", \"domain\"]),\n _createTextVNode(\" to view their \" + _toDisplayString(_unref(recordType).upper) + \" records. \", 1)\n ]),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(RecordTypeLookup)\n }, null, 8, [\"config\"])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"div\", _hoisted_8, [\n _createElementVNode(\"h2\", _hoisted_9, \"How to lookup \" + _toDisplayString(_unref(recordType).upper) + \" records\", 1),\n _createElementVNode(\"span\", _hoisted_10, [\n _hoisted_11,\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(platforms, (platform) => {\n return _createVNode(_component_router_link, {\n key: platform,\n to: `#${platform.toLowerCase()}`,\n class: \"no-underline mr-2 last:mr-0\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", _hoisted_12, [\n _createVNode(Icon, {\n icon: platform,\n class: \"mr-2\"\n }, null, 8, [\"icon\"]),\n _createElementVNode(\"span\", _hoisted_13, _toDisplayString(platform), 1)\n ])\n ]),\n _: 2\n }, 1032, [\"to\"])\n }), 64))\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_14, [\n _createElementVNode(\"div\", null, [\n (_unref(recordType).upper === 'A')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_15, [\n _createTextVNode(\"A records can be configured by the owner of a domain name. They are used to link IPv4 addresses to a domain name. IPv6 addresses are stored as AAAA records. Both IPv4 and IPv6 addresses are most commonly used by web browsers like Google Chrome, in order to find the web server that should be contacted to display a website. Strictly speaking, A and AAAA records are not limited to this, but other uses are rare in comparison. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about A records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'AAAA')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_16, [\n _createTextVNode(\"AAAA records can be configured by the owner of a domain name. They are used to link IPv4 addresses to a domain name. IPv6 addresses are stored as A records. Both IPv4 and IPv6 addresses are most commonly used by web browsers like Google Chrome, in order to find the web server that should be contacted to display a website. Strictly speaking, A and AAAA records are not limited to this, but other uses are rare in comparison. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about AAAA records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'CNAME')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_17, [\n _createTextVNode(\"CNAME records can be configured by the owner of a domain name. They can be used to configure the same DNS records for two domain names without storing the information twice. When a domain name has a CNAME record pointing to another domain, that other domain name is said to be the canonical name for the domain with the CNAME record. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about CNAME records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'MX')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_18, [\n _createTextVNode(\"MX records can be configured by the owner of a domain name. They are used to store information in the DNS, which can be looked up by anyone. Each record type has a different purpose. The purpose of MX records is to publish the location of mail servers of a domain name. Whenever a mail client sends an email, it first looks up the MX records of the recipient. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about MX records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'NS')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_19, [\n _createTextVNode(\"NS records can be configured by the owner of a domain name. They are used to store the location of the authoritative DNS servers for that domain name. That means that these name servers will be seen as the source of truth for the DNS records for that domain name. Whenever a recursive DNS server doesn't have DNS records in its cache, it will trace the authoritative DNS server with NS lookups, and query that server for the DNS records. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about NS records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'SOA')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_20, [\n _createTextVNode(\"SOA records can be configured by the owner of a domain name. They are used to store information in the DNS, which can be looked up by anyone. Each record type has a different purpose. The purpose of SOA records is to announce that a new DNS zone starts somewhere in the tree of DNS names. An example is the delegation from a top level domain (e.g. .com) to the owner of a domain name (e.g. example.com). This start of authority contains some information about the child zone, which we explain in detail in our \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"article about SOA records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_unref(recordType).upper === 'TXT')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_21, [\n _createTextVNode(\"TXT records can be configured by the owner of a domain name. They are used to store information in the DNS, which can be looked up by anyone. Each record type has a different purpose. TXT records are often used to verify domain ownership with third parties. A Sender Policy Framework (SPF) record can usually also be found with a TXT lookup. \"),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about TXT records.\")\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_openBlock(), _createElementBlock(\"p\", _hoisted_22, [\n _createTextVNode(_toDisplayString(_unref(recordType).upper) + \" records can be configured by the owner of a domain name. They are used to store information in the DNS, which can be looked up by anyone. Each record type has a different purpose. \", 1),\n (_unref(recordType).learningPage !== undefined)\n ? (_openBlock(), _createBlock(_component_router_link, {\n key: 0,\n to: _unref(recordType).learningPage\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about \" + _toDisplayString(_unref(recordType).upper) + \" records.\", 1)\n ]),\n _: 1\n }, 8, [\"to\"]))\n : _createCommentVNode(\"\", true)\n ])),\n _createElementVNode(\"p\", null, _toDisplayString(_unref(recordType).upper) + \" records are configured in DNS. But how can you look up these \" + _toDisplayString(_unref(recordType).upper) + \" records? That depends on the operating system you are using. Windows, Linux and Mac all have a different way of finding \" + _toDisplayString(_unref(recordType).upper) + \" records. The sections below contain instructions for each operating system.\", 1)\n ]),\n _createElementVNode(\"img\", {\n class: \"w-full md:mb-0 md:mt-6\",\n src: `img/pages/record-type-lookup/${_unref(recordType).cli}-lookup-mac.png`,\n alt: `Example output of a ${_unref(recordType).upper} lookup query`\n }, null, 8, _hoisted_23)\n ]),\n _createElementVNode(\"h2\", _hoisted_24, \"How to lookup \" + _toDisplayString(_unref(recordType).upper) + \" records on Windows\", 1),\n (_unref(recordType).windowsSupport)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createElementVNode(\"p\", null, \"To check the \" + _toDisplayString(_unref(recordType).upper) + \" records for a certain domain name on Windows, follow these steps:\", 1),\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_25,\n _createTextVNode(\" by navigating to \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" Start → \"),\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" 'Type here to search' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'cmd' → \"),\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" Open\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_26\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _createElementVNode(\"code\", null, \"nslookup -q=\" + _toDisplayString(_unref(recordType).cli) + \" example.com\", 1)\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the \" + _toDisplayString(_unref(recordType).upper) + \" records for \", 1),\n _hoisted_27,\n _createTextVNode(\".\"),\n _createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: `img/pages/record-type-lookup/${_unref(recordType).cli}-lookup-windows.png`,\n alt: `${_unref(recordType).upper} lookup in Windows`\n }, null, 8, _hoisted_28)\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"The \" + _toDisplayString(_unref(recordType).upper) + \" records are listed below the \", 1),\n _hoisted_29,\n _createTextVNode(\" heading.\")\n ])\n ])\n ], 64))\n : (_openBlock(), _createElementBlock(\"p\", _hoisted_30, [\n _createTextVNode(\"The \" + _toDisplayString(_unref(recordType).upper) + \" record type cannot be looked up in Windows. Neither \", 1),\n _hoisted_31,\n _createTextVNode(\", nor Powershell's \"),\n _hoisted_32,\n _createTextVNode(\" has support for it. You can either install WSL and follow the Linux instructions below, or use an online \" + _toDisplayString(_unref(recordType).upper) + \" lookup tool like the one on the top of this page.\", 1)\n ])),\n _createElementVNode(\"h2\", _hoisted_33, \"How to lookup \" + _toDisplayString(_unref(recordType).upper) + \" records on Mac OS\", 1),\n _createElementVNode(\"p\", null, \"To check the \" + _toDisplayString(_unref(recordType).upper) + \" records for a certain domain name on a Mac, follow these steps:\", 1),\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_34,\n _createTextVNode(\" by entering \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [command] + [space] → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'terminal.app' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_35\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _createElementVNode(\"code\", null, \"dig example.com \" + _toDisplayString(_unref(recordType).cli), 1)\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the \" + _toDisplayString(_unref(recordType).upper) + \" records for \", 1),\n _hoisted_36,\n _createTextVNode(\".\"),\n _createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: `img/pages/record-type-lookup/${_unref(recordType).cli}-lookup-mac.png`,\n alt: `${_unref(recordType).upper} lookup on a Mac`\n }, null, 8, _hoisted_37)\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"The \" + _toDisplayString(_unref(recordType).upper) + \" records are listed below the \", 1),\n _hoisted_38,\n _createTextVNode(\" heading.\")\n ])\n ]),\n _createElementVNode(\"h2\", _hoisted_39, \"How to lookup \" + _toDisplayString(_unref(recordType).upper) + \" records on Linux\", 1),\n _createElementVNode(\"p\", null, \"To check the \" + _toDisplayString(_unref(recordType).upper) + \" records for a certain domain name on Linux, follow these steps:\", 1),\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_40,\n _createTextVNode(\" by entering \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [Super] → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'terminal' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_41\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _createElementVNode(\"code\", null, \"dig example.com \" + _toDisplayString(_unref(recordType).cli), 1)\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the \" + _toDisplayString(_unref(recordType).upper) + \" records for \", 1),\n _hoisted_42,\n _createTextVNode(\".\"),\n _createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: `img/pages/record-type-lookup/${_unref(recordType).cli}-lookup-linux.png`,\n alt: `${_unref(recordType).upper} lookup in Linux`\n }, null, 8, _hoisted_43)\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"The \" + _toDisplayString(_unref(recordType).upper) + \" records are listed below the \", 1),\n _hoisted_44,\n _createTextVNode(\" heading.\")\n ])\n ]),\n _createElementVNode(\"h2\", null, \"How to find \" + _toDisplayString(_unref(recordType).upper) + \" records\", 1),\n _createElementVNode(\"p\", null, \"To check the \" + _toDisplayString(_unref(recordType).upper) + \" records of a domain, follow these steps:\", 1),\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open the \"),\n _createVNode(_component_router_link, {\n to: `/${_unref(recordType).lower}-lookup/`\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(_unref(recordType).upper) + \" lookup tool\", 1)\n ]),\n _: 1\n }, 8, [\"to\"]),\n _createTextVNode(\".\"),\n _createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: `img/pages/record-type-lookup/${_unref(recordType).lower}-lookup-tool.png`,\n alt: `Open the ${_unref(recordType).upper} lookup tool`\n }, null, 8, _hoisted_45)\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Enter the domain name and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: `img/pages/record-type-lookup/${_unref(recordType).lower}-records-example.png`,\n alt: `Example DNS ${_unref(recordType).upper} records`\n }, null, 8, _hoisted_46)\n ]),\n _createElementVNode(\"li\", null, \"The tool will query the \" + _toDisplayString(_unref(recordType).upper) + \" records and shown them at the top of the page.\", 1)\n ]),\n (_unref(recordType).upper === 'CNAME')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _hoisted_47,\n _createElementVNode(\"p\", null, [\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/cname/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"Learn more about CNAME records.\")\n ]),\n _: 1\n })\n ])\n ], 64))\n : _createCommentVNode(\"\", true),\n _hoisted_53,\n _createElementVNode(\"p\", null, [\n _createTextVNode(\"There are other types of DNS records then just \" + _toDisplayString(_unref(recordType).upper) + \". The most commonly used DNS record types are A, AAAA, CNAME, NS, TXT, MX and SOA. If you'd like to look up all records of these record types, you can do so with \", 1),\n _createVNode(_component_router_link, { to: \"/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"nslookup\")\n ]),\n _: 1\n }),\n _createTextVNode(\". Click any of the record types below to find DNS records for that specific record type. \")\n ]),\n _createElementVNode(\"ul\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(recordTypes).filter((other) => other.upper !== _unref(recordType).upper), (otherRecordType, index) => {\n return (_openBlock(), _createElementBlock(\"li\", { key: index }, [\n _createVNode(_component_router_link, {\n to: `/${otherRecordType.lower}-lookup/`\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(otherRecordType.upper) + \" lookup\", 1)\n ]),\n _: 2\n }, 1032, [\"to\"]),\n _createTextVNode(\" — \" + _toDisplayString(otherRecordType.description), 1)\n ]))\n }), 128))\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./RecordTypeLookup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RecordTypeLookup.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"block mt-3 uppercase font-medium text-neutral-600\" }, \"Question\", -1)\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"block mt-3 uppercase font-medium text-neutral-600\" }, \"Answer\", -1)\nconst _hoisted_3 = { class: \"max-w-full overflow-auto [tab-size:2]\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"block mt-3 uppercase font-medium text-neutral-600\" }, \"Authority\", -1)\nconst _hoisted_5 = { class: \"max-w-full overflow-auto [tab-size:2]\" }\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"block mt-3 uppercase font-medium text-neutral-600\" }, \"Additional\", -1)\nconst _hoisted_7 = { class: \"max-w-full overflow-auto [tab-size:2]\" }\n\nimport { PropType } from 'vue';\nimport { QueryResult, RecordWithInfo } from '@/model/Api';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'RawRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nfunction tabs(all: Array, current: RecordWithInfo, length: (r: RecordWithInfo) => number) {\n const maxWidth = Math.max(...all.map(length));\n const maxTabs = Math.floor(maxWidth / 2) + 1;\n const currentWidth = length(current);\n const currentTabs = maxTabs - Math.floor(currentWidth / 2);\n return '\\t'.repeat(currentTabs);\n}\n\nfunction toName(record: RecordWithInfo) {\n return record.record.name.length;\n}\n\nfunction toTtl(record: RecordWithInfo) {\n return record.record.ttl.toString().length;\n}\n\nfunction toType(record: RecordWithInfo) {\n return record.record.recordType.length;\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _hoisted_1,\n _createElementVNode(\"pre\", null, \"dig @\" + _toDisplayString(__props.records.query.server.domain || __props.records.query.server.ip) + \" \" + _toDisplayString(__props.records.query.domain) + \" \" + _toDisplayString(__props.records.query.recordType), 1),\n _hoisted_2,\n _createElementVNode(\"pre\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(__props.records.response.answer, (record, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createTextVNode(_toDisplayString(record.record.name) + _toDisplayString(tabs(__props.records.response.answer, record, toName)) + _toDisplayString(record.record.ttl) + _toDisplayString(tabs(__props.records.response.answer, record, toTtl)) + _toDisplayString(record.record.recordType) + _toDisplayString(tabs(__props.records.response.answer, record, toType)) + _toDisplayString(record.record.raw) + \"\\n\", 1)\n ], 64))\n }), 128))\n ]),\n _hoisted_4,\n _createElementVNode(\"pre\", _hoisted_5, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(__props.records.response.authority, (record, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createTextVNode(_toDisplayString(record.record.name) + _toDisplayString(tabs(__props.records.response.authority, record, toName)) + _toDisplayString(record.record.ttl) + _toDisplayString(tabs(__props.records.response.authority, record, toTtl)) + _toDisplayString(record.record.recordType) + _toDisplayString(tabs(__props.records.response.authority, record, toType)) + _toDisplayString(record.record.raw) + \"\\n\", 1)\n ], 64))\n }), 128))\n ]),\n _hoisted_6,\n _createElementVNode(\"pre\", _hoisted_7, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(__props.records.response.additional, (record, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createTextVNode(_toDisplayString(record.record.name) + _toDisplayString(tabs(__props.records.response.additional, record, toName)) + _toDisplayString(record.record.ttl) + _toDisplayString(tabs(__props.records.response.additional, record, toTtl)) + _toDisplayString(record.record.recordType) + _toDisplayString(tabs(__props.records.response.additional, record, toType)) + _toDisplayString(record.record.raw) + \"\\n\", 1)\n ], 64))\n }), 128))\n ])\n ], 64))\n}\n}\n\n})","import script from \"./RawRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RawRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, vShow as _vShow, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives } from \"vue\"\n\nconst _hoisted_1 = [\"value\"]\nconst _hoisted_2 = {\n ref: \"copyIcon\",\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 16 16\",\n class: \"bi bi-clipboard inline\",\n fill: \"currentColor\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Copy\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z\"\n}, null, -1)\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.5 1h-3a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z\"\n}, null, -1)\nconst _hoisted_5 = [\n _hoisted_3,\n _hoisted_4\n]\nconst _hoisted_6 = {\n ref: \"copiedIcon\",\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 16 16\",\n class: \"bi bi-clipboard-check inline\",\n fill: \"currentColor\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"data-placement\": \"top\",\n title: \"Copied!\"\n}\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z\"\n}, null, -1)\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M9.5 1h-3a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3zm4.354 7.146a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L7.5 9.793l2.646-2.647a.5.5 0 0 1 .708 0z\"\n}, null, -1)\nconst _hoisted_9 = [\n _hoisted_7,\n _hoisted_8\n]\n\nimport { ref } from 'vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'CopyComponent',\n props: {\n content: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nconst input = ref(null);\nconst recentlyClicked = ref(false);\n\nfunction clicked() {\n if (input.value) {\n input.value.setAttribute('type', 'text');\n input.value.select();\n document.execCommand('copy');\n input.value.blur(); // Prevent keyboard from popping up on Android\n input.value.setAttribute('type', 'hidden');\n\n recentlyClicked.value = true;\n setTimeout(() => { recentlyClicked.value = false; }, 2000);\n }\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"span\", {\n onClick: clicked,\n class: \"cursor-pointer ml-[0.8em]\"\n }, [\n _createElementVNode(\"input\", {\n type: \"hidden\",\n value: __props.content,\n ref_key: \"input\",\n ref: input\n }, null, 8, _hoisted_1),\n _withDirectives((_openBlock(), _createElementBlock(\"svg\", _hoisted_2, _hoisted_5, 512)), [\n [_vShow, !recentlyClicked.value]\n ]),\n _withDirectives((_openBlock(), _createElementBlock(\"svg\", _hoisted_6, _hoisted_9, 512)), [\n [_vShow, recentlyClicked.value]\n ])\n ]))\n}\n}\n\n})","import script from \"./CopyComponent.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CopyComponent.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString } from \"vue\"\n\nimport { computed } from 'vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DurationComponent',\n props: {\n seconds: {\n type: Number,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst durationString = computed(() => {\n const h = Math.floor(props.seconds / 3600);\n const m = Math.floor(props.seconds / 60) % 60;\n const s = props.seconds % 60;\n const hs = h > 0 ? [`${h}h`] : [];\n const ms = m > 0 ? [`${m}m`] : [];\n const ss = s > 0 ? [`${s}s`] : [];\n return [...hs, ...ms, ...ss].join(' ');\n});\n\nreturn (_ctx: any,_cache: any) => {\n return _toDisplayString(_unref(durationString))\n}\n}\n\n})","import script from \"./DurationComponent.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DurationComponent.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createVNode as _createVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"ml-2 inline-flex items-center rounded-full bg-gray-100 px-2.5 py-0.5 text-xs font-medium text-gray-800\"\n}\nconst _hoisted_2 = { key: 0 }\n\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'CnameChainBadge',\n props: {\n chain: {\n type: Array as () => Array,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n return (__props.chain.length > 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n _createTextVNode(\" For CNAME \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(__props.chain, (cname, index) => {\n return (_openBlock(), _createElementBlock(\"span\", { key: index }, [\n (index !== 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, \" ← \"))\n : _createCommentVNode(\"\", true),\n _createVNode(DnsRecordsLink, {\n domain: cname,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"])\n ]))\n }), 128))\n ]))\n : _createCommentVNode(\"\", true)\n}\n}\n\n})","import script from \"./CnameChainBadge.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CnameChainBadge.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-2/3\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/3\" })\n], -1)\nconst _hoisted_3 = { class: \"border-b-2 border-gray-200 text-left\" }\nconst _hoisted_4 = {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n}\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n}, \"Revalidate in\", -1)\nconst _hoisted_6 = { class: \"py-1\" }\nconst _hoisted_7 = { key: 0 }\nconst _hoisted_8 = { key: 1 }\nconst _hoisted_9 = { class: \"py-1\" }\nconst _hoisted_10 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { QueryResult } from '@/model/Api';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DnsRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n columnTitle: {\n type: String,\n required: true,\n },\n recordType: {\n type: String,\n required: true,\n },\n isDomain: {\n type: Boolean,\n default: false,\n },\n canHaveMultipleRecords: {\n type: Boolean,\n default: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => props.records.response.answer.filter((item) => item.record.recordType === props.recordType));\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"thead\", null, [\n _createElementVNode(\"tr\", _hoisted_3, [\n _createElementVNode(\"th\", _hoisted_4, _toDisplayString(__props.columnTitle), 1),\n _hoisted_5\n ])\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_6, [\n (__props.isDomain)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_7, [\n _createVNode(DnsRecordsLink, {\n domain: record.record.raw,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"])\n ]))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_8, _toDisplayString(record.record.raw), 1)),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.raw,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_9, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_10, \"No \" + _toDisplayString(__props.recordType) + \" \" + _toDisplayString(__props.canHaveMultipleRecords ? 'records' : 'record') + \" found.\", 1))\n}\n}\n\n})","import script from \"./DnsRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DnsRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"\" }\nconst _hoisted_2 = {\n key: 1,\n class: \"text-left w-full\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-3/4\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/4\" })\n], -1)\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"SOA data\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_5 = { class: \"w-full ml-2 border-separate border-spacing-y-1.5\" }\nconst _hoisted_6 = { class: \"group\" }\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Start of authority\", -1)\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Email\", -1)\nconst _hoisted_9 = { key: 1 }\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Serial\", -1)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Refresh\", -1)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Retry\", -1)\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Expire\", -1)\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"font-medium\"\n}, \"Negative cache TTL\", -1)\nconst _hoisted_15 = { class: \"align-top\" }\nconst _hoisted_16 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { QueryResult, RecordInfo, SOA } from '@/model/Api';\n\ntype SoaRecordWithInfo = {\n record: SOA;\n} & RecordInfo\n\n// Input: 'aa\\.bb\\.cc.domain.co.uk\n// Match group 1: 'aa\\.bb\\.cc'\n// Match group 3: 'domain.co.uk'\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SoaRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst adminHostRegex = /^((.*\\\\\\.)?[^.]*)\\.(.*)/;\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => props.records.response.answer.filter((item): item is SoaRecordWithInfo => item.record.recordType === 'SOA'));\n\nconst adminUserAndHost = computed(() => {\n if (processedRecords.value.length > 0) {\n const match = processedRecords.value[0].record.admin.match(adminHostRegex);\n if (match) {\n return {\n user: match[1].replaceAll('\\\\.', '.'),\n host: match[3].slice(0, -1), // Remove the trailing dot\n };\n }\n }\n return {\n user: '',\n host: '',\n };\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_2, [\n _hoisted_3,\n _hoisted_4,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", { key: index }, [\n _createElementVNode(\"td\", null, [\n _createElementVNode(\"table\", _hoisted_5, [\n _createElementVNode(\"tbody\", null, [\n _createElementVNode(\"tr\", _hoisted_6, [\n _hoisted_7,\n _createElementVNode(\"td\", null, [\n _createVNode(DnsRecordsLink, {\n domain: record.record.host,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"]),\n _createVNode(Copy, {\n content: record.record.host,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_8,\n _createElementVNode(\"td\", null, [\n _createTextVNode(_toDisplayString(_unref(adminUserAndHost).user) + \"@\", 1),\n (__props.domain !== _unref(adminUserAndHost).host)\n ? (_openBlock(), _createBlock(DnsRecordsLink, {\n key: 0,\n domain: _unref(adminUserAndHost).host,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"]))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_9, _toDisplayString(_unref(adminUserAndHost).host), 1))\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_10,\n _createElementVNode(\"td\", null, _toDisplayString(record.record.serial), 1)\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_11,\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.refresh\n }, null, 8, [\"seconds\"])\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_12,\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.retry\n }, null, 8, [\"seconds\"])\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_13,\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.expire\n }, null, 8, [\"seconds\"])\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_14,\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.minimum\n }, null, 8, [\"seconds\"])\n ])\n ])\n ])\n ])\n ]),\n _createElementVNode(\"td\", _hoisted_15, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_16, \"No SOA records found.\"))\n ]))\n}\n}\n\n})","import script from \"./SoaRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SoaRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, withModifiers as _withModifiers, createVNode as _createVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"min-width\":\"35px\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"70%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"30%\"} })\n], -1)\nconst _hoisted_3 = { class: \"border-b-2 border-gray-200 text-left\" }\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"th\", { scope: \"col\" }, null, -1)\nconst _hoisted_5 = {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n}\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n}, \"Revalidate in\", -1)\nconst _hoisted_7 = { class: \"group\" }\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"svg\", {\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 16 16\",\n class: \"inline\",\n fill: \"currentColor\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}, [\n /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"\n })\n], -1)\nconst _hoisted_9 = [\n _hoisted_8\n]\nconst _hoisted_10 = { key: 1 }\nconst _hoisted_11 = { class: \"py-1\" }\nconst _hoisted_12 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_13 = {\n key: 0,\n class: \"hidden\"\n}\nconst _hoisted_14 = { colspan: \"3\" }\nconst _hoisted_15 = { class: \"bg-neutral-50 pb-4 rounded-sm overflow-hidden\" }\nconst _hoisted_16 = { class: \"block m-6 ml-8 mb-4 text-lg font-medium\" }\nconst _hoisted_17 = { class: \"w-full mx-6 border-separate border-spacing-2\" }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium\"\n}, \"Location\", -1)\nconst _hoisted_19 = [\"href\"]\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium\"\n}, \"AS\", -1)\nconst _hoisted_21 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium whitespace-nowrap\"\n}, \"AS name\", -1)\nconst _hoisted_22 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport { A, AAAA, QueryResult } from '@/model/Api';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'IpDnsRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n columnTitle: {\n type: String,\n required: true,\n },\n recordType: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => props.records.response.answer.filter((item) => ['A', 'AAAA'].includes(item.record.recordType)));\n\nfunction getIp(record: A | AAAA): string {\n if ('ipv4' in record) return record.ipv4;\n return record.ipv6.slice(1, -1);\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"thead\", null, [\n _createElementVNode(\"tr\", _hoisted_3, [\n _hoisted_4,\n _createElementVNode(\"th\", _hoisted_5, _toDisplayString(__props.columnTitle), 1),\n _hoisted_6\n ])\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createElementVNode(\"tr\", _hoisted_7, [\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"td\", {\n key: 0,\n class: \"text-center\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(e => { e.target.closest('tr').nextSibling.classList.toggle('hidden'); e.target.closest('tr').querySelector('svg').classList.toggle('rotate-90') }, [\"stop\"]))\n }, _hoisted_9))\n : (_openBlock(), _createElementBlock(\"td\", _hoisted_10)),\n _createElementVNode(\"td\", _hoisted_11, [\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"inline w-4 h-4 mb-0.5 mr-1.5\",\n src: `https://icons.duckduckgo.com/ip3/${record.ipInfo.asdomain}.ico`,\n alt: `Hosted by ${record.ipInfo.asname}`,\n title: `Hosted by ${record.ipInfo.asname}`\n }, null, 8, _hoisted_12))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"span\", null, _toDisplayString(getIp(record.record)), 1),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: getIp(record.record),\n class: \"inline-block -mt-2 invisible group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]),\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_13, [\n _createElementVNode(\"td\", _hoisted_14, [\n _createElementVNode(\"div\", _hoisted_15, [\n _createElementVNode(\"div\", {\n class: \"w-full h-32 bg-center\",\n style: _normalizeStyle({ backgroundImage: `url(https://stadiamaps.com/static/outdoors?api_key=23fe682b-ac7c-4f2b-83db-39dcf2a8b9ac¢er=${record.ipInfo.lat + 2},${record.ipInfo.lon}&zoom=2&markers=${record.ipInfo.lat},${record.ipInfo.lon}&size=1038x128)` })\n }, null, 4),\n _createElementVNode(\"span\", _hoisted_16, _toDisplayString(record.ipInfo.org), 1),\n _createElementVNode(\"table\", _hoisted_17, [\n _createElementVNode(\"tbody\", null, [\n _createElementVNode(\"tr\", null, [\n _hoisted_18,\n _createElementVNode(\"td\", null, [\n _createElementVNode(\"a\", {\n href: `https://www.google.com/maps/search/${record.ipInfo.city}, ${record.ipInfo.regionName}, ${record.ipInfo.country}`,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, _toDisplayString(record.ipInfo.city) + \", \" + _toDisplayString(record.ipInfo.regionName) + \", \" + _toDisplayString(record.ipInfo.country), 9, _hoisted_19)\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_20,\n _createElementVNode(\"td\", null, _toDisplayString(record.ipInfo.as), 1)\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_21,\n _createElementVNode(\"td\", null, _toDisplayString(record.ipInfo.asname), 1)\n ])\n ])\n ])\n ])\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ], 64))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_22, \"No \" + _toDisplayString(__props.recordType) + \" records found.\", 1))\n ]))\n}\n}\n\n})","import script from \"./IpDnsRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./IpDnsRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"text-red-600 font-semibold\"\n}\nconst _hoisted_2 = {\n key: 1,\n class: \"text-orange-600 font-semibold\"\n}\nconst _hoisted_3 = {\n key: 2,\n class: \"text-orange-600 font-semibold\"\n}\nconst _hoisted_4 = {\n key: 3,\n class: \"text-green-600 font-semibold\"\n}\n\nimport { PropType } from 'vue';\nimport { Qualifier } from '@/model/Spf';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SpfQuantifier',\n props: {\n qualifier: {\n type: String as PropType,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n return (__props.qualifier === 'Fail')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, \"fail\"))\n : (__props.qualifier === 'Softfail')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, \"softfail\"))\n : (__props.qualifier === 'Neutral')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, \"neutral\"))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_4, \"pass\"))\n}\n}\n\n})","import script from \"./SpfQuantifier.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SpfQuantifier.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createVNode as _createVNode, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createBlock as _createBlock, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = { class: \"border border-gray-200 rounded-md divide-y divide-gray-200\" }\nconst _hoisted_2 = { class: \"flex-1 flex\" }\nconst _hoisted_3 = { class: \"flex-1 ml-2\" }\nconst _hoisted_4 = { key: 0 }\nconst _hoisted_5 = {\n key: 0,\n class: \"font-semibold\"\n}\nconst _hoisted_6 = { class: \"font-semibold\" }\nconst _hoisted_7 = { class: \"font-semibold\" }\nconst _hoisted_8 = { class: \"font-semibold\" }\nconst _hoisted_9 = { class: \"font-semibold\" }\nconst _hoisted_10 = { class: \"font-semibold\" }\nconst _hoisted_11 = { class: \"font-semibold\" }\nconst _hoisted_12 = { class: \"font-semibold\" }\nconst _hoisted_13 = { class: \"font-semibold\" }\nconst _hoisted_14 = { class: \"font-semibold\" }\nconst _hoisted_15 = { class: \"font-semibold\" }\nconst _hoisted_16 = { class: \"font-semibold\" }\nconst _hoisted_17 = { class: \"font-semibold\" }\nconst _hoisted_18 = { class: \"font-semibold\" }\nconst _hoisted_19 = { class: \"font-semibold\" }\nconst _hoisted_20 = { class: \"font-semibold\" }\nconst _hoisted_21 = { class: \"font-semibold\" }\nconst _hoisted_22 = { key: 0 }\nconst _hoisted_23 = { key: 0 }\nconst _hoisted_24 = { key: 0 }\nconst _hoisted_25 = { class: \"ml-2 flex-shrink-0 text-gray-500 text-left sm:ml-4\" }\n\nimport { PropType } from 'vue';\nimport SpfQuantifier from '@/components/records/SpfQuantifier.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { Qualifier, Term } from '@/model/Spf';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SpfRecord',\n props: {\n terms: {\n type: Object as PropType>,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nfunction encodeQualifier(qualifier: Qualifier) {\n switch (qualifier) {\n case 'Pass': return '+';\n case 'Fail': return '-';\n case 'Softfail': return '~';\n case 'Neutral': return '?';\n case 'None': return '';\n default: return '';\n }\n}\n\nfunction sortTerms(l: Term, r: Term) {\n function toValue(t: Term) {\n if ('Directive' in t) return 1;\n if ('Redirect' in t) return 2;\n if ('Exp' in t) return 3;\n if ('UnknownModifier' in t) return 4;\n return 0;\n }\n return toValue(l) - toValue(r);\n}\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(\"ol\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList([...__props.terms].sort(sortTerms), (term, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"pl-3 pr-4 py-3 flex flex-col justify-between sm:flex-row sm:items-center\"\n }, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"span\", _hoisted_3, [\n (term.Directive)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n (index !== 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, \"Or else, \"))\n : _createCommentVNode(\"\", true),\n (term.Directive.mechanism.All)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createElementVNode(\"span\", {\n class: _normalizeClass({ capitalize: index === 0 })\n }, \"mark\", 2),\n _createTextVNode(\" the email as \"),\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier\n }, null, 8, [\"qualifier\"]),\n _createTextVNode(\". \")\n ], 64))\n : (term.Directive.mechanism.Include)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"text-cyan-600 font-semibold\", { capitalize: index === 0 }])\n }, \"include\", 2),\n _createTextVNode(\" the SPF record at \"),\n (term.Directive.mechanism.Include.domain.includes('%'))\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString(term.Directive.mechanism.Include.domain), 1))\n : (_openBlock(), _createBlock(DnsRecordsLink, {\n key: 1,\n domain: term.Directive.mechanism.Include.domain,\n page: \"SPF\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(term.Directive.mechanism.Include.domain), 1)\n ]),\n _: 2\n }, 1032, [\"domain\"])),\n _createTextVNode(\" and \"),\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier\n }, null, 8, [\"qualifier\"]),\n _createTextVNode(\" if it matches the sender's IP. \")\n ], 64))\n : (term.Directive.mechanism.A)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is in the \"),\n _createVNode(DnsRecordsLink, {\n domain: term.Directive.mechanism.A.domain ? term.Directive.mechanism.A.domain : __props.domain,\n page: \"a\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"A\")\n ]),\n _: 2\n }, 1032, [\"domain\"]),\n (term.Directive.mechanism.A.ip4cidr)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(\" (with CIDR \"),\n _createElementVNode(\"span\", _hoisted_6, \"/\" + _toDisplayString(term.Directive.mechanism.A.ip4cidr), 1),\n _createTextVNode(\")\")\n ], 64))\n : _createCommentVNode(\"\", true),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n domain: term.Directive.mechanism.A.domain ? term.Directive.mechanism.A.domain : __props.domain,\n page: \"aaaa\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"AAAA\")\n ]),\n _: 2\n }, 1032, [\"domain\"]),\n (term.Directive.mechanism.A.ip6cidr)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(\" (with CIDR \"),\n _createElementVNode(\"span\", _hoisted_7, \"/\" + _toDisplayString(term.Directive.mechanism.A.ip6cidr), 1),\n _createTextVNode(\")\")\n ], 64))\n : _createCommentVNode(\"\", true),\n _createTextVNode(\" records of \"),\n _createElementVNode(\"span\", _hoisted_8, _toDisplayString(term.Directive.mechanism.A.domain ? term.Directive.mechanism.A.domain : __props.domain), 1),\n _createTextVNode(\". \")\n ], 64))\n : (term.Directive.mechanism.MX)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is in the MX records \"),\n (term.Directive.mechanism.MX.ip4cidr && term.Directive.mechanism.MX.ip6cidr)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(\"(with CIDR \"),\n _createElementVNode(\"span\", _hoisted_9, \"/\" + _toDisplayString(term.Directive.mechanism.MX.ip4cidr), 1),\n _createTextVNode(\" for IPv4 and \"),\n _createElementVNode(\"span\", _hoisted_10, \"/\" + _toDisplayString(term.Directive.mechanism.MX.ip6cidr), 1),\n _createTextVNode(\" for IPv6) \")\n ], 64))\n : (term.Directive.mechanism.MX.ip4cidr)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(\"(with CIDR \"),\n _createElementVNode(\"span\", _hoisted_11, \"/\" + _toDisplayString(term.Directive.mechanism.MX.ip4cidr), 1),\n _createTextVNode(\" for IPv4) \")\n ], 64))\n : (term.Directive.mechanism.MX.ip6cidr)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createTextVNode(\"(with CIDR \"),\n _createElementVNode(\"span\", _hoisted_12, \"/\" + _toDisplayString(term.Directive.mechanism.MX.ip6cidr), 1),\n _createTextVNode(\" for IPv6) \")\n ], 64))\n : _createCommentVNode(\"\", true),\n _createTextVNode(\"of \"),\n _createElementVNode(\"span\", _hoisted_13, _toDisplayString(term.Directive.mechanism.MX.domain ? term.Directive.mechanism.MX.domain : __props.domain), 1),\n _createTextVNode(\". \")\n ], 64))\n : (term.Directive.mechanism.PTR)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if a \"),\n _createVNode(_component_router_link, {\n to: \"/ptr-lookup/\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"reverse lookup\")\n ]),\n _: 1\n }),\n _createTextVNode(\" of the email sender's IP resolves to \"),\n _createElementVNode(\"span\", _hoisted_14, _toDisplayString(term.Directive.mechanism.PTR.domain ? term.Directive.mechanism.PTR.domain : __props.domain), 1),\n _createTextVNode(\". \")\n ], 64))\n : (term.Directive.mechanism.IP4)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n (term.Directive.mechanism.IP4.ipStart === term.Directive.mechanism.IP4.ipEnd)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is \"),\n _createElementVNode(\"span\", _hoisted_15, _toDisplayString(term.Directive.mechanism.IP4.ip), 1),\n _createTextVNode(\". \")\n ], 64))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is between \"),\n _createElementVNode(\"span\", _hoisted_16, _toDisplayString(term.Directive.mechanism.IP4.ipStart), 1),\n _createTextVNode(\" and \"),\n _createElementVNode(\"span\", _hoisted_17, _toDisplayString(term.Directive.mechanism.IP4.ipEnd), 1),\n _createTextVNode(\". \")\n ], 64))\n ], 64))\n : (term.Directive.mechanism.IP6)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n (term.Directive.mechanism.IP6.ipStart === term.Directive.mechanism.IP6.ipEnd)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is \"),\n _createElementVNode(\"span\", _hoisted_18, _toDisplayString(term.Directive.mechanism.IP6.ip), 1),\n _createTextVNode(\". \")\n ], 64))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if the email sender's IP is between \"),\n _createElementVNode(\"span\", _hoisted_19, _toDisplayString(term.Directive.mechanism.IP6.ipStart), 1),\n _createTextVNode(\" and \"),\n _createElementVNode(\"span\", _hoisted_20, _toDisplayString(term.Directive.mechanism.IP6.ipEnd), 1),\n _createTextVNode(\". \")\n ], 64))\n ], 64))\n : (term.Directive.mechanism.Exists)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 8 }, [\n _createVNode(SpfQuantifier, {\n qualifier: term.Directive.qualifier,\n class: _normalizeClass({ capitalize: index === 0 })\n }, null, 8, [\"qualifier\", \"class\"]),\n _createTextVNode(\" if an A record exists for \"),\n _createElementVNode(\"span\", _hoisted_21, _toDisplayString(term.Directive.mechanism.Exists.domain), 1),\n _createTextVNode(\". \")\n ], 64))\n : _createCommentVNode(\"\", true)\n ], 64))\n : (term.Exp)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n (index !== 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_22, \"And \"))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"span\", {\n class: _normalizeClass({ capitalize: index === 0 })\n }, \"query\", 2),\n _createTextVNode(),\n _createVNode(DnsRecordsLink, {\n domain: term.Modifier.Exp.domain,\n page: \"SPF\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(term.Modifier.Exp.domain), 1)\n ]),\n _: 2\n }, 1032, [\"domain\"]),\n _createTextVNode(\" for an explanation when the SPF check fails. \")\n ], 64))\n : (term.Redirect)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n (index !== 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_23, \"Or else, \"))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"span\", {\n class: _normalizeClass([\"text-cyan-600 font-semibold\", { capitalize: index === 0 }])\n }, \"redirect\", 2),\n _createTextVNode(\" SPF checking to \"),\n (term.Redirect.domain.includes('%'))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(_toDisplayString(term.Redirect.domain), 1)\n ], 64))\n : (_openBlock(), _createBlock(DnsRecordsLink, {\n key: 2,\n domain: term.Redirect.domain,\n page: \"SPF\",\n class: \"text-blue-600 hover:text-blue-800 font-semibold\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(term.Redirect.domain), 1)\n ]),\n _: 2\n }, 1032, [\"domain\"])),\n _createTextVNode(\". \")\n ], 64))\n : (term.UnknownModifier)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n (index !== 0)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_24, \"And \"))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"span\", {\n class: _normalizeClass({ capitalize: index === 0 })\n }, \"ignore\", 2),\n _createTextVNode(\" this unknown modifier. \")\n ], 64))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_25, [\n (term.Directive)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n (term.Directive.mechanism.All)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"all \", 1)\n ], 64))\n : (term.Directive.mechanism.Include)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"include:\" + _toDisplayString(term.Directive.mechanism.Include.domain), 1)\n ], 64))\n : (term.Directive.mechanism.A)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"a\" + _toDisplayString(term.Directive.mechanism.A.domain ? ':' + term.Directive.mechanism.A.domain : '') + _toDisplayString(term.Directive.mechanism.A.ip4cidr ? `/${term.Directive.mechanism.A.ip4cidr}` : '') + _toDisplayString(term.Directive.mechanism.A.ip6cidr ? `//${term.Directive.mechanism.A.ip6cidr}` : ''), 1)\n ], 64))\n : (term.Directive.mechanism.MX)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"mx\" + _toDisplayString(term.Directive.mechanism.MX.domain ? ':' + term.Directive.mechanism.MX.domain : '') + _toDisplayString(term.Directive.mechanism.MX.ip4cidr ? `/${term.Directive.mechanism.MX.ip4cidr}` : '') + _toDisplayString(term.Directive.mechanism.MX.ip6cidr ? `//${term.Directive.mechanism.MX.ip6cidr}` : ''), 1)\n ], 64))\n : (term.Directive.mechanism.PTR)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"ptr\" + _toDisplayString(term.Directive.mechanism.PTR.domain ? ':' + term.Directive.mechanism.PTR.domain : ''), 1)\n ], 64))\n : (term.Directive.mechanism.IP4)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"ip4:\" + _toDisplayString(term.Directive.mechanism.IP4.ipStart) + _toDisplayString(term.Directive.mechanism.IP4.cidr ? `/${term.Directive.mechanism.IP4.cidr}` : ''), 1)\n ], 64))\n : (term.Directive.mechanism.IP6)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"ip6:\" + _toDisplayString(term.Directive.mechanism.IP6.ipStart) + _toDisplayString(term.Directive.mechanism.IP6.cidr ? `/${term.Directive.mechanism.IP6.cidr}` : ''), 1)\n ], 64))\n : (term.Directive.mechanism.Exists)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _createTextVNode(_toDisplayString(encodeQualifier(term.Directive.qualifier)) + \"exists:\" + _toDisplayString(term.Directive.mechanism.Exists.domain), 1)\n ], 64))\n : _createCommentVNode(\"\", true)\n ], 64))\n : _createCommentVNode(\"\", true),\n (term.Exp)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(\" exp=\" + _toDisplayString(term.Exp.domain), 1)\n ], 64))\n : (term.Redirect)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createTextVNode(\" redirect=\" + _toDisplayString(term.Redirect.domain), 1)\n ], 64))\n : (term.UnknownModifier)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createTextVNode(_toDisplayString(term.UnknownModifier.name) + \"=\" + _toDisplayString(term.UnknownModifier.macroString), 1)\n ], 64))\n : _createCommentVNode(\"\", true)\n ])\n ]))\n }), 128))\n ]))\n}\n}\n\n})","import script from \"./SpfRecord.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SpfRecord.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"block mb-3\" }\nconst _hoisted_2 = { class: \"font-semibold\" }\n\nimport { computed, PropType } from 'vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport SpfRecordComponent from '@/components/records/SpfRecord.vue';\nimport { QueryResult, RecordInfo, TXT } from '@/model/Api';\n\ntype SpfRecord = {\n record: TXT;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SpfRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst recordType = getRecordType('SPF');\nconst processedRecords = computed(() => props.records.response.answer.filter((item): item is SpfRecord => item.record.recordType === 'TXT' && item.parsedSpf !== undefined));\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (spf, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createElementVNode(\"span\", _hoisted_1, [\n _createTextVNode(\"This record is valid for \"),\n _createVNode(Duration, {\n seconds: spf.record.ttl\n }, null, 8, [\"seconds\"]),\n _createTextVNode(\".\")\n ]),\n _createVNode(SpfRecordComponent, {\n domain: __props.domain,\n terms: spf.parsedSpf\n }, null, 8, [\"domain\", \"terms\"])\n ], 64))\n }), 128)),\n (!_unref(processedRecords).length)\n ? (_openBlock(), _createBlock(Alert, {\n key: 0,\n type: \"warning\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", null, [\n _createElementVNode(\"span\", _hoisted_2, _toDisplayString(__props.domain), 1),\n _createTextVNode(\" does not have any \" + _toDisplayString(_unref(recordType).upper) + \" records.\", 1)\n ])\n ]),\n _: 1\n }))\n : _createCommentVNode(\"\", true)\n ], 64))\n}\n}\n\n})","import script from \"./SpfRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SpfRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createVNode as _createVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"component-dns-records component-txt-records\" }\nconst _hoisted_2 = { key: 1 }\nconst _hoisted_3 = {\n key: 0,\n class: \"mt-3 mb-2 font-medium text-lg\"\n}\nconst _hoisted_4 = {\n key: 1,\n class: \"grid grid-cols-1 gap-3 items-stretch sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5\"\n}\nconst _hoisted_5 = [\"src\", \"alt\"]\nconst _hoisted_6 = { class: \"grow flex flex-col p-5 bg-white\" }\nconst _hoisted_7 = { class: \"inline-block pb-3 text-lg font-medium\" }\nconst _hoisted_8 = {\n key: 0,\n class: \"card-text verification-code mb-2\"\n}\nconst _hoisted_9 = { class: \"card-text verification-code\" }\nconst _hoisted_10 = { class: \"grow mt-2 flex flex-col justify-end\" }\nconst _hoisted_11 = { class: \"text-sm text-gray-500\" }\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"h3\", { class: \"mt-5 mb-2 font-medium text-lg\" }, \"SPF record\", -1)\nconst _hoisted_13 = {\n key: 3,\n class: \"mt-3 mb-2 font-medium text-lg\"\n}\nconst _hoisted_14 = {\n key: 4,\n class: \"w-full\"\n}\nconst _hoisted_15 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-2/3\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/3\" })\n], -1)\nconst _hoisted_16 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"TXT data\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_17 = { class: \"py-1 break-all\" }\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"text-gray-400\" }, \"\\\"\", -1)\nconst _hoisted_19 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"text-gray-400\" }, \"\\\" \", -1)\nconst _hoisted_20 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport SpfRecords from '@/components/records/SpfRecords.vue';\nimport { Term } from '@/model/Spf';\nimport { QueryResult, RecordInfo, TXT } from '@/model/Api';\n\ntype TxtRecordWithInfo = {\n record: TXT;\n} & RecordInfo\n\ntype VerificationRecord = {\n type: 'verification';\n org: string;\n verificationIdentifier: string;\n verificationCode: string;\n}\n\ntype SpfRecord = {\n terms: Array;\n}\n\ntype OtherRecord = {\n type: 'other';\n strings: string[];\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TxtRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\nconst verificationConfig = [\n { org: 'Google', prefix: 'google-site-verification', separator: '=' },\n { org: 'Microsoft', prefix: 'MS', separator: '=' },\n { org: 'Facebook', prefix: 'facebook-domain-verification', separator: '=' },\n { org: 'GlobalSign', prefix: '_globalsign-domain-verification', separator: '=' },\n { org: 'Adobe identity provider', prefix: 'adobe-idp-site-verification', separator: '=' },\n { org: 'Atlassian', prefix: 'atlassian-domain-verification', separator: '=' },\n { org: 'Amazon SES', prefix: 'amazonses', separator: ':' },\n { org: 'DocuSign', prefix: 'docusign', separator: '=' },\n { org: 'Yandex', prefix: 'yandex-verification', separator: ':' },\n { org: 'GlobalSign', prefix: 'globalsign-domain-verification', separator: '=' },\n { org: 'Zoom', prefix: 'ZOOM_verify', separator: '_' },\n { org: 'Pardot', prefix: 'pardot', separator: '=' },\n { org: 'Apple', prefix: 'apple-domain-verification', separator: '=' },\n { org: 'Apple', prefix: 'apple-domain', separator: '=' },\n // TODO\n // eslint-disable-next-line no-tabs\n // spf2.0\tamazon.com.\tspf2.0/pra include:spf1.amazon.com include:spf2.amazon.com include:amazonses.com -all\n { org: 'Ahrefs', prefix: 'ahrefs-site-verification', separator: '_' },\n { org: 'Cisco CI', prefix: 'cisco-ci-domain-verification', separator: '=' },\n { org: 'Sendinblue', prefix: 'Sendinblue-code', separator: ':' },\n { org: 'Zoho', prefix: 'zoho-verification', separator: '=' },\n // TODO\n // eslint-disable-next-line no-tabs\n // v=DMARC1;\tspringer.com.\tv=DMARC1; p=none; pct=100; rua=mailto:re+undujzcqrz6@dmarc.postmarkapp.com; sp=none; aspf=r;\n { org: 'Mail.ru', prefix: 'mailru-verification', separator: ': ' },\n // TODO\n // eslint-disable-next-line no-tabs\n // v=DKIM1;\twebmd.com.\tv=DKIM1; k=rsa; p=MIIBIjANB\\\" \\\"gkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAglkiu3gC0LOVJ8uWLfw8Ykk9tEFFL/EdXmMFBDUZSHMtPKRG0LBUBsmV/piNw1xsjg+nR3zpqqu68DeV/2GnFTvcKu02YJS7B6T7ibL/One14BoZW5Hpdp2LEnQxmrMxGjlzZHvwI9+3w9qgpo1jCe34jKW2pr6ext5cX7SxyNO41c5l4QgI4oJu3GGq2l\" \"6CMN+OJAc54GU4ofetwS+L8gcWK86\\\" \\\"+ebMilGq3OgpowJZATl27ii7KiIHxZXixNLB5nDVPKrmuN4jcYEYGPEVELK4X/NxZWGTiZoFRXxwTDZYaBrDyxvOoFbQqwwOHfrMHHwTSTSRH5eLp2CGmMQtutwIDAQAB\n { org: 'Statuspage', prefix: 'status-page-domain-verification', separator: '=' },\n { org: 'Webex', prefix: 'webexdomainverification.', separator: '=' },\n { org: 'Microsoft', prefix: 'ms', separator: '=' },\n { org: 'KnownBe4', prefix: 'knowbe4-site-verification', separator: '=' },\n { org: 'Stripe', prefix: 'stripe-verification', separator: '=' },\n { org: 'Cisco CI', prefix: 'ciscocidomainverification', separator: '=' },\n { org: 'Have I been pwned', prefix: 'have-i-been-pwned-verification', separator: '=' },\n { org: 'QuoVadis', prefix: 'QuoVadis', separator: '=' },\n { org: 'Dropbox', prefix: 'dropbox-domain-verification', separator: '=' },\n { org: 'Brave ledger', prefix: 'brave-ledger-verification', separator: '=' },\n { org: 'LogMeIn', prefix: 'logmein-verification-code', separator: '=' },\n { org: 'Workplace', prefix: 'workplace-domain-verification', separator: '=' },\n { org: 'OneTrust', prefix: 'onetrust-domain-verification', separator: '=' },\n { org: 'Adobe Sign', prefix: 'adobe-sign-verification', separator: '=' },\n // TODO\n // eslint-disable-next-line no-tabs\n // k=rsa;\tnypost.com.\tk=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDiTxvTgpRaUPa3Zsawin7pRP+CPIij6s1io0EsxRAfrCox6uw/QdKyEiozMHKz14AWPx6gLqb09Om7xmN9Snb5tcnWQdD46XFld1rm+DVwP1UezK/VagJDp6aMhabY1T1hBpK4R/YBnQ70R1AivL6Km7TfNgRU6UMSx2TtQnkFawIDAQAB\n { org: 'Firebase', prefix: 'firebase', separator: '=' },\n { org: 'Klaviyo', prefix: 'klaviyo-site-verification', separator: '=' },\n { org: 'Loader.io', prefix: 'loaderio', separator: '=' },\n { org: 'Salesforce Marketing Cloud', prefix: 'SFMC', separator: '-' }, // Not sure if this is correct..\n { org: 'Citrix', prefix: 'citrix-verification-code', separator: '=' },\n { org: 'Emma', prefix: 'e2ma-verification', separator: '=' },\n { org: 'Sophos', prefix: 'sophos-domain-verification', separator: '=' },\n { org: 'Detectify', prefix: 'detectify-verification', separator: '=' },\n { org: 'Dynamics 365 marketing', prefix: 'd365mktkey', separator: '=' },\n { org: 'Mail.ru', prefix: 'mailru-domain', separator: ': ' },\n { org: 'Keybase', prefix: 'keybase-site-verification', separator: '=' },\n { org: 'Postman', prefix: 'postman-domain-verification', separator: '=' },\n { org: 'SwissSign', prefix: 'swisssign-check', separator: '=' },\n { org: 'ProtonMail', prefix: 'protonmail-verification', separator: '=' },\n { org: 'Dynatrace', prefix: 'Dynatrace-site-verification', separator: '=' },\n { org: 'Smartsheet', prefix: 'smartsheet-site-validation', separator: '=' },\n { org: 'TeamViewer', prefix: 'teamviewer-sso-verification', separator: '=' },\n { org: 'Wrike', prefix: 'wrike-verification', separator: '=' },\n { org: 'Miro', prefix: 'miro-verification', separator: '=' },\n { org: 'Dailymotion', prefix: 'dailymotion-domain-verification', separator: '=' },\n { org: 'MongoDB', prefix: 'mongodb-site-verification', separator: '=' },\n { org: 'Segment', prefix: 'segment-site-verification', separator: '=' },\n { org: 'Fastly', prefix: 'fastly-domain-delegation', separator: '-' },\n { org: 'Pax8', prefix: 'pax8validat', separator: 'e' }, // Doesn't use a verification code\n { org: 'eSputnik', prefix: 'esputnik-verification', separator: '=' },\n { org: 'CloudHealth', prefix: 'cloudhealth', separator: '=' },\n // TODO\n // eslint-disable-next-line no-tabs\n // _acme-challenge\tchosun.com.\t_acme-challenge.sandbox.chosun.com.=WQZ-txQ8JpD8amqBbabzVkHdqj_f9xJ57ixWAjMOiOw\n { org: 'GoDaddy', prefix: 'godaddyverification', separator: '=' },\n { org: 'SpyCloud', prefix: 'spycloud-domain-verification', separator: '=' },\n // TODO: Unknown verification record\n // eslint-disable-next-line no-tabs\n // hj-ownership\thomedepot.com.\thj-ownership=0ZCtxdHCuFnR\n { org: 'Bugcrowd', prefix: 'bugcrowd-verification', separator: '=' },\n { org: 'Botify', prefix: 'botify-site-verification', separator: '=' },\n { org: 'Heroku', prefix: 'heroku-domain-verification', separator: '=' },\n { org: 'Drift', prefix: 'drift-domain-verification', separator: '=' },\n { org: 'Mixpanel', prefix: 'mixpanel-domain-verify', separator: '=' },\n { org: 'Intacct ESK', prefix: 'intacct-esk', separator: '=' },\n { org: 'Traction Guest', prefix: 'traction-guest', separator: '=' },\n { org: 'AbuseIPDB', prefix: 'abuseipdb-verification', separator: '=' },\n { org: 'Aliyun', prefix: 'aliyun-site-verification', separator: '=' },\n { org: 'Zapier', prefix: 'zapier-domain-verification-challenge', separator: '=' },\n { org: 'HackerOne', prefix: 'h1-domain-verification', separator: '=' },\n { org: 'GitHub', prefix: '_github-challenge-', separator: '=' },\n { org: 'Virtru', prefix: 'virtru-site-verify', separator: '=' },\n { org: 'Nintex', prefix: 'nintex', separator: '.' },\n { org: 'Mail QQ', prefix: 'qqmail-site-verification', separator: '=' },\n { org: 'Beam', prefix: 'beam-verification', separator: '=' },\n { org: 'Trustpilot', prefix: 'Trustpilot-Verification', separator: '-' },\n { org: 'Canva', prefix: 'canva-site-verification', separator: '=' },\n { org: 'FortiFi', prefix: 'fortifi-domain-verification', separator: '=' },\n { org: 'Loom', prefix: 'loom-site-verification', separator: '=' },\n { org: 'Loom', prefix: 'loom-verification', separator: '=' },\n { org: 'Meltwater', prefix: 'meltwater', separator: '_' },\n { org: 'Mandrill', prefix: 'mandrill_verify', separator: '.' },\n { org: 'Cloudflare', prefix: 'cloudflare-verify', separator: '.' },\n { org: 'Docker', prefix: 'docker-verification', separator: '=' },\n { org: 'Fastly', prefix: 'Fastly-Domain-Verify', separator: '-' },\n { org: 'Pendo', prefix: 'pendo-domain-verification', separator: '=' },\n { org: 'Notion', prefix: 'notion-domain-verification', separator: '=' },\n { org: 'Notion', prefix: 'notion_verify', separator: '_' },\n { org: 'Nulab', prefix: 'nulab-verification-code', separator: '=' },\n { org: 'HEY', prefix: 'hey-verification', separator: ':' },\n { org: 'HubSpot', prefix: 'hubspot-domain-verification', separator: '=' },\n { org: 'Slack', prefix: 'slack-domain-verification', separator: '=' },\n { org: 'Webflow', prefix: 'proxy-ssl.webflow.com', separator: '' },\n { org: 'Shopify', prefix: 'shopify-verification-code', separator: '=' },\n { org: 'IdenTrust', prefix: 'identrust_validate', separator: '=' },\n { org: 'Duo', prefix: 'duo_sso_verification', separator: '=' },\n { org: '1Password', prefix: '1password-site-verification', separator: '=' },\n { org: 'Flexera', prefix: 'flexera-domain-verification', separator: '-' },\n { org: 'Appspace', prefix: 'appspace-domain-verification', separator: '=' },\n { org: 'Atlassian', prefix: 'atlassian-sending-domain-verification', separator: '=' },\n { org: 'Actalis', prefix: 'actalis-dcv', separator: '=' },\n { org: 'Intersight', prefix: 'intersight', separator: '=' },\n { org: 'Twilio', prefix: 'twilio-domain-verification', separator: '=' },\n { org: 'Wiz', prefix: 'wiz-domain-verification', separator: '=' },\n { org: 'Vmware Cloud', prefix: 'vmware-cloud-verification', separator: '-' },\n { org: 'Pinterest', prefix: 'pinterest-site-verification', separator: '=' },\n { org: 'GitHub', prefix: 'github-verification', separator: '=' },\n { org: 'Proofpoint', prefix: 'ppe', separator: '-' },\n { org: 'SimpleLogin', prefix: 'sl-verification', separator: '=' },\n { org: 'Dan', prefix: 'dan-ownership-verification', separator: '=' },\n { org: 'Paloalto networks', prefix: 'paloaltonetworks-site-verification', separator: '=' },\n { org: 'Afternic', prefix: 'afternic-verification', separator: '-' },\n { org: 'Validity', prefix: 'Validity-Domain-Verification', separator: '=' },\n { org: 'Autodesk', prefix: 'autodesk-domain-verification', separator: '=' },\n { org: 'Jamf', prefix: 'jamf-site-verification', separator: '=' },\n { org: 'Apple', prefix: 'apple-domain', separator: '=' },\n { org: 'OpenAI', prefix: 'openai-domain-verification', separator: '=' },\n { org: 'Forward Email (paid)', prefix: 'forward-email-site-verification', separator: '=' },\n { org: 'Forward Email (free)', prefix: 'forward-email', separator: '=' },\n { org: 'Yahoo', prefix: 'yahoo-verification-key', separator: '=' },\n { org: 'Lucid', prefix: 'lucid-verification', separator: '=' },\n { org: 'Dell', prefix: 'dell-technologies-domain-verification=', separator: '_' },\n];\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nfunction parse(strings: string[]): VerificationRecord | OtherRecord {\n if (strings.length === 1) {\n const config = verificationConfig.find((c) => strings[0].startsWith(c.prefix));\n if (config) {\n const recordWithoutPrefix = strings[0].substring(config.prefix.length);\n if (recordWithoutPrefix.startsWith(config.separator)) {\n return {\n type: 'verification',\n org: config.org,\n verificationIdentifier: '',\n verificationCode: recordWithoutPrefix.substring(config.separator.length),\n } as VerificationRecord;\n }\n const separatorIndex = recordWithoutPrefix.indexOf(config.separator);\n return {\n type: 'verification',\n org: config.org,\n verificationIdentifier: recordWithoutPrefix.substring(0, separatorIndex),\n verificationCode: recordWithoutPrefix.substring(separatorIndex + 1),\n };\n }\n }\n\n return {\n type: 'other',\n strings,\n };\n}\n\nconst processedRecords = computed(() => {\n const processed = {\n verification: Array(),\n spf: Array(),\n other: Array}>(),\n };\n props.records.response.answer\n .filter((item): item is TxtRecordWithInfo => item.record.recordType === 'TXT')\n .forEach((r) => {\n if (r.parsedSpf) {\n processed.spf.push({ terms: r.parsedSpf, ttl: r.record.ttl });\n } else if (r.record.raw) {\n const parsed = parse(r.record.strings);\n if (parsed.type === 'verification') {\n processed.verification.push({ ttl: r.record.ttl, ...parsed });\n } else {\n processed.other.push({\n raw: r.record.raw, ttl: r.record.ttl, cnameChain: r.cnameChain, ...parsed,\n });\n }\n }\n });\n\n processed.verification.sort((a, b) => a.org.localeCompare(b.org));\n return processed;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).verification.length + _unref(processedRecords).other.length + _unref(processedRecords).spf.length !== 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n (_unref(processedRecords).verification.length !== 0)\n ? (_openBlock(), _createElementBlock(\"h3\", _hoisted_3, \"Site ownership verification\"))\n : _createCommentVNode(\"\", true),\n (_unref(processedRecords).verification.length !== 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords).verification, (record, index) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"flex flex-col w-full break-words rounded overflow-hidden shadow-sm bg-gray-100 border border-gray-300\"\n }, [\n _createElementVNode(\"img\", {\n src: 'img/components/txt-records/' + record.org + '.png',\n alt: `${record.org} logo`,\n width: \"128\",\n height: \"104\",\n class: \"mx-auto py-8\"\n }, null, 8, _hoisted_5),\n _createElementVNode(\"div\", _hoisted_6, [\n _createElementVNode(\"span\", _hoisted_7, _toDisplayString(record.org), 1),\n (record.verificationIdentifier !== '')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_8, _toDisplayString(record.verificationIdentifier), 1))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"p\", _hoisted_9, _toDisplayString(record.verificationCode), 1),\n _createElementVNode(\"p\", _hoisted_10, [\n _createElementVNode(\"small\", _hoisted_11, [\n _createTextVNode(\"Revalidate in \"),\n _createVNode(Duration, {\n seconds: record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ])\n ])\n ]))\n }), 128))\n ]))\n : _createCommentVNode(\"\", true),\n (_unref(processedRecords).spf.length !== 0)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _hoisted_12,\n _createVNode(SpfRecords, {\n domain: __props.domain,\n records: __props.records\n }, null, 8, [\"domain\", \"records\"])\n ], 64))\n : _createCommentVNode(\"\", true),\n (_unref(processedRecords).other.length !== 0 && _unref(processedRecords).verification.length !== 0)\n ? (_openBlock(), _createElementBlock(\"h3\", _hoisted_13, \"Other TXT records\"))\n : _createCommentVNode(\"\", true),\n (_unref(processedRecords).other.length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_14, [\n _hoisted_15,\n _hoisted_16,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords).other, (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_17, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(record.strings, (string, index) => {\n return (_openBlock(), _createElementBlock(\"span\", { key: index }, [\n _hoisted_18,\n _createTextVNode(_toDisplayString(string), 1),\n _hoisted_19\n ]))\n }), 128)),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.raw,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_20, \"No TXT records found.\"))\n ]))\n}\n}\n\n})","import script from \"./TxtRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TxtRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-3/4\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/4\" })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Name server\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = { class: \"py-1\" }\nconst _hoisted_5 = { class: \"py-1\" }\nconst _hoisted_6 = { key: 2 }\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"span\", null, \"No NS records found.\", -1)\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { NS, QueryResult, RecordInfo } from '@/model/Api';\n\ntype NsRecordWithInfo = {\n record: NS;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'NsRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => {\n const processed: NsRecordWithInfo[] = props.records.response.answer.filter((item): item is NsRecordWithInfo => item.record.recordType === 'NS');\n return processed;\n});\nconst parentDomain = computed(() => props.domain.substring(props.domain.indexOf('.') + 1));\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_4, [\n _createElementVNode(\"span\", null, [\n _createVNode(DnsRecordsLink, {\n domain: record.record.target,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"])\n ]),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.target,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_5, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n _hoisted_7,\n _createVNode(Alert, { type: \"info\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"The name servers for this domain are inherited from one of its ancestor domains. Try its parent domain: \"),\n _createVNode(DnsRecordsLink, {\n domain: _unref(parentDomain),\n class: \"font-semibold hover:underline\"\n }, null, 8, [\"domain\"]),\n _createTextVNode(\". \")\n ]),\n _: 1\n })\n ]))\n}\n}\n\n})","import script from \"./NsRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./NsRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createVNode as _createVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-2/4\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/4\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/4\" })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Mail server\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Priority\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = { class: \"py-1\" }\nconst _hoisted_5 = { key: 0 }\nconst _hoisted_6 = { class: \"py-1\" }\nconst _hoisted_7 = {\n key: 0,\n class: \"inline-flex items-center rounded-full bg-blue-100 px-2.5 py-0.5 text-xs font-medium text-blue-800\"\n}\nconst _hoisted_8 = { class: \"py-1\" }\nconst _hoisted_9 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport { isTheSameDomain } from '@/common/domainName';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { MX, QueryResult, RecordInfo } from '@/model/Api';\n\ntype MxRecordWithInfo = {\n record: MX;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'MxRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => {\n const processed: MxRecordWithInfo[] = props.records.response.answer.filter((item): item is MxRecordWithInfo => item.record.recordType === 'MX');\n processed.sort((a, b) => a.record.priority - b.record.priority);\n\n return processed;\n});\n\nconst minPriority = computed(() => Math.min(...processedRecords.value.map((r) => r.record.priority)));\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_4, [\n (_unref(isTheSameDomain)(__props.records.query.domain, record.record.target))\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString(record.record.target), 1))\n : (_openBlock(), _createBlock(DnsRecordsLink, {\n key: 1,\n domain: record.record.target,\n class: \"text-blue-600 hover:text-blue-800 hover:underline break-all\"\n }, null, 8, [\"domain\"])),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.target ,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_6, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.priority), 1),\n _createTextVNode(),\n (record.record.priority === _unref(minPriority))\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_7, \" Primary\"))\n : _createCommentVNode(\"\", true)\n ]),\n _createElementVNode(\"td\", _hoisted_8, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_9, \"No mail servers found.\"))\n}\n}\n\n})","import script from \"./MxRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./MxRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"17%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"17%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"17%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"25%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"24%\"} })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", null, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Priority\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Weight\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Port\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Target\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = {\n key: 0,\n class: \"badge badge-secondary\"\n}\nconst _hoisted_5 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport { QueryResult, RecordInfo, SRV } from '@/model/Api';\n\ntype SrvRecordWithInfo = {\n record: SRV;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SrvRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\nconst recordType = getRecordType('SRV');\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => {\n const processed: SrvRecordWithInfo[] = props.records.response.answer.filter((item): item is SrvRecordWithInfo => item.record.recordType === recordType.upper);\n processed.sort((a, b) => a.record.priority - b.record.priority);\n\n return processed;\n});\n\nconst minPriority = computed(() => Math.min(...processedRecords.value.map((r) => r.record.priority)));\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.priority), 1),\n _createTextVNode(),\n (record.record.priority === _unref(minPriority))\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, \" Primary\"))\n : _createCommentVNode(\"\", true)\n ]),\n _createElementVNode(\"td\", null, _toDisplayString(record.record.weight), 1),\n _createElementVNode(\"td\", null, _toDisplayString(record.record.port), 1),\n _createElementVNode(\"td\", null, [\n _createVNode(DnsRecordsLink, {\n domain: record.record.target,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"]),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.target,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_5, \"No \" + _toDisplayString(_unref(recordType).plural) + \" found.\", 1))\n}\n}\n\n})","import script from \"./SrvRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SrvRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createVNode as _createVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"20%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"20%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"30%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"30%\"} })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Flags\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Tag\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Value\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport { CAA, QueryResult, RecordInfo } from '@/model/Api';\n\ntype CaaRecordWithInfo = {\n record: CAA;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'CaaRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst recordType = getRecordType('CAA');\n\nconst processedRecords = computed(() => {\n const processed: CaaRecordWithInfo[] = props.records.response.answer.filter((item): item is CaaRecordWithInfo => item.record.recordType === recordType.upper);\n return processed;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", null, _toDisplayString(record.record.flags), 1),\n _createElementVNode(\"td\", null, _toDisplayString(record.record.tag), 1),\n _createElementVNode(\"td\", null, [\n _createTextVNode(_toDisplayString(record.record.value) + \" \", 1),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.value,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", null, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, \"No \" + _toDisplayString(_unref(recordType).plural) + \" found.\", 1))\n}\n}\n\n})","import script from \"./CaaRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CaaRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, createVNode as _createVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-2/3\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-1/3\" })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Pointer target\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = { class: \"py-1\" }\nconst _hoisted_5 = { class: \"py-1\" }\nconst _hoisted_6 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport { PTR, QueryResult, RecordInfo } from '@/model/Api';\n\ntype PtrRecordWithInfo = {\n record: PTR;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'PtrRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\nconst recordType = getRecordType('PTR');\n\n\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => {\n const processed: PtrRecordWithInfo[] = props.records.response.answer.filter((item): item is PtrRecordWithInfo => item.record.recordType === recordType.upper);\n return processed;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_4, [\n _createElementVNode(\"span\", null, [\n _createVNode(DnsRecordsLink, {\n domain: record.record.target,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, null, 8, [\"domain\"])\n ]),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.target,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_5, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, \"No \" + _toDisplayString(_unref(recordType).plural) + \" found.\", 1))\n}\n}\n\n})","import script from \"./PtrRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PtrRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { key: 1 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"15%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"10%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"15%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"45%\"} }),\n /*#__PURE__*/_createElementVNode(\"col\", { style: {\"width\":\"15%\"} })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Certificate usage\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Selector\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Matching type\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Certificate association data\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"Revalidate in\")\n ])\n], -1)\nconst _hoisted_4 = { class: \"py-1\" }\nconst _hoisted_5 = { class: \"py-1\" }\nconst _hoisted_6 = { class: \"py-1\" }\nconst _hoisted_7 = { class: \"py-1\" }\nconst _hoisted_8 = { class: \"py-1\" }\nconst _hoisted_9 = { key: 2 }\n\nimport { computed, PropType } from 'vue';\nimport { useStore } from 'vuex';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport Duration from '@/components/micro/DurationComponent.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport CnameChainBadge from '@/components/micro/CnameChainBadge.vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport { QueryResult, RecordInfo, TLSA } from '@/model/Api';\n\ntype TlsaRecordWithInfo = {\n record: TLSA;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TlsaRecords',\n props: {\n records: {\n type: Object as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst recordType = getRecordType('TLSA');\n\nconst store = useStore();\nconst showRawOutput = computed(() => store.state.showRawOutput);\n\nconst processedRecords = computed(() => {\n const processed: TlsaRecordWithInfo[] = props.records.response.answer.filter((item): item is TlsaRecordWithInfo => item.record.recordType === recordType.upper);\n return processed;\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(showRawOutput))\n ? (_openBlock(), _createBlock(RawRecords, {\n key: 0,\n records: __props.records\n }, null, 8, [\"records\"]))\n : (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: index,\n class: \"group\"\n }, [\n _createElementVNode(\"td\", _hoisted_4, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.certificateUsage), 1)\n ]),\n _createElementVNode(\"td\", _hoisted_5, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.selector), 1)\n ]),\n _createElementVNode(\"td\", _hoisted_6, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.matchingType), 1)\n ]),\n _createElementVNode(\"td\", _hoisted_7, [\n _createElementVNode(\"span\", null, _toDisplayString(record.record.certificateAssociationData), 1),\n _createVNode(CnameChainBadge, {\n chain: record.cnameChain\n }, null, 8, [\"chain\"]),\n _createVNode(Copy, {\n content: record.record.certificateAssociationData,\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_8, [\n _createVNode(Duration, {\n seconds: record.record.ttl\n }, null, 8, [\"seconds\"])\n ])\n ]))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_9, \"No \" + _toDisplayString(_unref(recordType).plural) + \" found.\", 1))\n}\n}\n\n})","import script from \"./TlsaRecords.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TlsaRecords.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n \n\n","import { render } from \"./SkeletonComponent.vue?vue&type=template&id=4d790add\"\nconst script = {}\n\nimport exportComponent from \"/builds/nslookupio/nslookupio/front-end/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export type ApiErrorType = 'Unknown' | 'HasNoReverseDnsRecord' | 'InvalidDomain' | 'DnsQueryFailed' | 'NoDnsServersAvailable'\n\nexport function toErrorType(errorMessage: string): ApiErrorType {\n switch (errorMessage) {\n case 'IP has no reverse DNS record':\n return 'HasNoReverseDnsRecord';\n case 'Invalid domain':\n return 'InvalidDomain';\n case 'DNS query failed':\n return 'DnsQueryFailed';\n case 'No DNS servers available':\n return 'NoDnsServersAvailable';\n default:\n return 'Unknown';\n }\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const dnsServers = {\n cloudflare: {\n pretty: 'Cloudflare',\n type: 'popular',\n },\n google: {\n pretty: 'Google',\n type: 'popular',\n },\n controldunfiltered: {\n pretty: 'Control D Unfintered',\n type: 'control d',\n },\n controldmalware: {\n pretty: 'Control D Malware',\n type: 'control d',\n },\n controldadstracking: {\n pretty: 'Control D Ads & Tracking',\n type: 'control d',\n },\n controldsocial: {\n pretty: 'Control D Social',\n type: 'control d',\n },\n controldfamilyfriendly: {\n pretty: 'Control D Family Friendly',\n type: 'control d',\n },\n controlduncesored: {\n pretty: 'Control D Uncensored',\n type: 'control d',\n },\n authoritative: {\n pretty: 'authoritative',\n type: 'authoritative',\n },\n southafrica: {\n pretty: 'South Africa',\n type: 'local',\n },\n australia: {\n pretty: 'Australia',\n type: 'local',\n },\n india: {\n pretty: 'India',\n type: 'local',\n },\n russia: {\n pretty: 'Russia',\n type: 'local',\n },\n thenetherlands: {\n pretty: 'The Netherlands',\n type: 'local',\n },\n ukraine: {\n pretty: 'Ukraine',\n type: 'local',\n },\n canada: {\n pretty: 'Canada',\n type: 'local',\n },\n usa: {\n pretty: 'United States of America',\n type: 'local',\n },\n brazil: {\n pretty: 'Brazil',\n type: 'local',\n },\n};\n","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createVNode as _createVNode, unref as _unref, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = { key: 1 }\nconst _hoisted_3 = { key: 2 }\n\nimport { PropType } from 'vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport { dnsServers } from '@/common/dnsServers';\nimport { ApiErrorType } from '@/model/ApiErrorAlert';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ApiErrorAlert',\n props: {\n error: {\n type: String as PropType,\n required: true,\n },\n domain: {\n type: String,\n required: true,\n },\n dnsserver: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createBlock(Alert, { type: \"warning\" }, {\n default: _withCtx(() => [\n (__props.error === 'HasNoReverseDnsRecord')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createTextVNode(\" IP addresses can't have any DNS records attached to them. We tried to find the hostname of this IP address with a reverse DNS lookup, and show the DNS records for that instead. However, the IP address \"),\n _createElementVNode(\"b\", null, _toDisplayString(__props.domain), 1),\n _createTextVNode(\" has no reverse DNS record. \")\n ], 64))\n : (__props.error === 'InvalidDomain')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createElementVNode(\"b\", null, _toDisplayString(__props.domain), 1),\n _createTextVNode(\" is not a valid domain name. For example, try \"),\n _createVNode(DnsRecordsLink, {\n domain: \"wikipedia.org\",\n class: \"font-semibold hover:underline\"\n }),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n domain: \"www.twitter.com\",\n class: \"font-semibold hover:underline\"\n }),\n _createTextVNode(\" to view their DNS records. \")\n ], 64))\n : (__props.error === 'DnsQueryFailed')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createTextVNode(\" One or more DNS queries failed while looking up DNS records for \"),\n _createElementVNode(\"b\", null, _toDisplayString(__props.domain), 1),\n _createTextVNode(\". Please try again. \")\n ], 64))\n : (__props.error === 'NoDnsServersAvailable')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n (_unref(dnsServers)[__props.dnsserver].type === 'local')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"None of the DNS server in \" + _toDisplayString(_unref(dnsServers)[__props.dnsserver].pretty) + \" are available. Please try again another DNS server by selecting it above.\", 1))\n : (_unref(dnsServers)[__props.dnsserver].type === 'popular')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, \"None of the \" + _toDisplayString(_unref(dnsServers)[__props.dnsserver].pretty) + \" DNS servers are available. Please try again another DNS server by selecting it above.\", 1))\n : (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"None of the authoritative DNS servers are available. Please try again another DNS server by selecting it above.\"))\n ], 64))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createTextVNode(\" Nslookup was unable to find DNS records for \"),\n _createElementVNode(\"b\", null, _toDisplayString(__props.domain), 1),\n _createTextVNode(\". \")\n ], 64))\n ]),\n _: 1\n }))\n}\n}\n\n})","import script from \"./ApiErrorAlert.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ApiErrorAlert.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { Term } from '@/model/Spf';\n\nexport type IpInfo = {\n query: string;\n countryCode: string;\n country: string;\n regionName: string;\n city: string;\n lat: number;\n lon: number;\n org: string;\n as: string;\n asname: string;\n asdomain: string;\n isAnycast: boolean;\n}\n\nexport type RrBase = {\n raw: string;\n name: string;\n ttl: number;\n recordType: string;\n}\n\nexport type A = RrBase & { ipv4: string; recordType: 'A'; }\nexport type AAAA = RrBase & { ipv6: string; recordType: 'AAAA'; }\nexport type CAA = RrBase & { flags: number, tag: string, value: string; recordType: 'CAA'; }\nexport type CNAME = RrBase & { target: string; recordType: 'CNAME'; }\nexport type MX = RrBase & { priority: number; target: string; recordType: 'MX'; }\nexport type NS = RrBase & { target: string; recordType: 'NS'; }\nexport type PTR = RrBase & { target: string; recordType: 'PTR'; }\nexport type SOA = RrBase & {\n host: string;\n admin: string;\n serial: number;\n refresh: number;\n retry: number;\n expire: number;\n minimum: number;\n recordType: 'SOA';\n}\nexport type SRV = RrBase & {\n priority: number;\n weight: number;\n port: number;\n target: string;\n recordType: 'SRV';\n}\nexport type TLSA = RrBase & {\n certificateUsage: number;\n selector: number;\n matchingType: number;\n certificateAssociationData: string;\n recordType: 'TLSA';\n}\nexport type TXT = RrBase & { strings: string[]; recordType: 'TXT'; }\nexport type NotImplemented = RrBase & { recordType: string; }\n\nexport type RR = A | AAAA | CAA | CNAME | MX | NS | PTR | SOA | SRV | TLSA | TXT | NotImplemented\n\nexport type RecordInfo = {\n cnameChain: Array;\n ipInfo: IpInfo | null;\n parsedSpf: Array | null;\n}\n\nexport type RecordWithInfo = {\n record: RR;\n} & RecordInfo\n\nexport type Geolocation = {\n lat: number;\n lon: number;\n}\n\nexport type DnsServer = {\n ip: string | null;\n domain: string | null;\n location: Geolocation | null;\n}\n\nexport const emptyDnsServer: DnsServer = {\n ip: null,\n domain: null,\n location: null,\n};\n\nexport type Query = {\n server: DnsServer,\n domain: string,\n recordType: string\n}\n\nexport const emptyQuery: Query = {\n server: emptyDnsServer,\n domain: '',\n recordType: '',\n};\n\nexport type DnsResponse = {\n answer: Array;\n authority: Array;\n additional: Array;\n // header: Header;\n}\n\nexport const emptyResponse: DnsResponse = {\n answer: [],\n authority: [],\n additional: [],\n};\n\nexport type QueryResult = {\n query: Query;\n response: DnsResponse;\n}\n\nexport const emptyQueryResult: QueryResult = {\n query: emptyQuery,\n response: emptyResponse,\n};\n\nexport type PopularRecords = {\n a: QueryResult;\n aaaa: QueryResult;\n cname: QueryResult;\n txt: QueryResult;\n ns: QueryResult;\n mx: QueryResult;\n soa: QueryResult;\n}\n\nexport const emptyPopularRecords: PopularRecords = {\n a: emptyQueryResult,\n aaaa: emptyQueryResult,\n cname: emptyQueryResult,\n txt: emptyQueryResult,\n ns: emptyQueryResult,\n mx: emptyQueryResult,\n soa: emptyQueryResult,\n};\n\nexport type GetRecordsResponse = {\n punycodeDomain: string;\n unicodeDomain: string;\n records: PopularRecords;\n}\n\nexport type OtherRecordsResponse = {\n punycodeDomain: string;\n unicodeDomain: string;\n queryResult: QueryResult;\n}\n\nexport type WebserversResponse = {\n punycodeDomain: string;\n unicodeDomain: string;\n a: QueryResult;\n aaaa: QueryResult;\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex-grow bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto max-w-6xl\" }\nconst _hoisted_3 = { class: \"flex flex-col justify-between mt-8 mb-6 ml-6 sm:flex-row sm:items-center\" }\nconst _hoisted_4 = { class: \"text-3xl\" }\nconst _hoisted_5 = { key: 0 }\nconst _hoisted_6 = { key: 1 }\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"button\", {\n type: \"button\",\n class: \"inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2\"\n}, \"All DNS records\", -1)\nconst _hoisted_8 = { class: \"bg-white shadow p-6 pb-10 rounded-t\" }\nconst _hoisted_9 = {\n key: 1,\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_10 = { class: \"mb-3\" }\nconst _hoisted_11 = { key: 0 }\nconst _hoisted_12 = { class: \"font-semibold\" }\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"Question and response\", -1)\nconst _hoisted_14 = { class: \"mt-8 mb-2 font-semibold text-2xl\" }\nconst _hoisted_15 = { class: \"flex flex-col lg:flex-row\" }\nconst _hoisted_16 = { class: \"shrink max-w-xl\" }\nconst _hoisted_17 = {\n class: \"mt-3 w-[500px] max-w-full sm:px-6 lg:mt-0\",\n autocomplete: \"off\"\n}\n\nimport {\n computed, ref, watch,\n} from 'vue';\nimport { useRouter } from 'vue-router';\nimport axios, { Canceler } from 'axios';\nimport { domainNameToDisplayName, domainNameToUrlPath, urlPathToDomainName } from '@/common/domainName';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport { getRecordType } from '@/common/recordTypes';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport DnsRecords from '@/components/records/DnsRecords.vue';\nimport SoaRecords from '@/components/records/SoaRecords.vue';\nimport IpDnsRecords from '@/components/records/IpDnsRecords.vue';\nimport TxtRecords from '@/components/records/TxtRecords.vue';\nimport NsRecords from '@/components/records/NsRecords.vue';\nimport MxRecords from '@/components/records/MxRecords.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport SrvRecords from '@/components/records/SrvRecords.vue';\nimport CaaRecords from '@/components/records/CaaRecords.vue';\nimport PtrRecords from '@/components/records/PtrRecords.vue';\nimport TlsaRecords from '@/components/records/TlsaRecords.vue';\nimport SkeletonComponent from '@/components/micro/SkeletonComponent.vue';\nimport { ApiErrorType, toErrorType } from '@/model/ApiErrorAlert';\nimport ApiErrorAlert from '@/components/ApiErrorAlert.vue';\nimport SpfRecords from '@/components/records/SpfRecords.vue';\nimport {\n OtherRecordsResponse, QueryResult, emptyDnsServer, emptyResponse,\n} from '@/model/Api';\nimport {\n Billboard, LargeLeaderboard, LargeRectangle, Leaderboard, MediumRectangle,\n} from '@/common/adSizes';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { RecordTypeResults } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'RecordTypeLookupResults',\n props: {\n routerDomain: {\n type: String,\n required: true,\n },\n routerRecordType: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst router = useRouter();\nconst recordType = computed(() => getRecordType(props.routerRecordType));\n\nconst domain = ref('');\nconst domainPunycode = ref('');\nconst loading = ref(true);\nconst error = ref(null);\nconst showSidebar = ref(window.innerWidth > 991);\nconst cancelToken = ref(null);\nconst queryResult = ref({\n query: {\n server: emptyDnsServer,\n domain: domain.value,\n recordType: recordType.value.upper,\n },\n response: emptyResponse,\n});\n\nfunction domainToUrl(newDomain: string): string {\n if (recordType.value.upper === 'SPF') {\n return `/domains/${domainNameToUrlPath(newDomain)}/email/${recordType.value.lower}/`;\n }\n return `/domains/${domainNameToUrlPath(newDomain)}/dns-records/${recordType.value.lower}/`;\n}\n\nfunction redirectTo(newDomain: string): void {\n router.push(domainToUrl(newDomain));\n}\n\nfunction load() {\n loading.value = true;\n error.value = null;\n\n if (cancelToken.value) {\n cancelToken.value();\n }\n const axiosSource = axios.CancelToken.source();\n cancelToken.value = axiosSource.cancel;\n\n // Normally, we want to resolve the hostname of an IP address (which is what `/other-records` does).\n // But when looking up a PTR, we should show the result of querying the PTR records.\n const endpoint = recordType.value.upper === 'PTR' ? 'api/v1/ptr-records' : 'api/v1/other-records';\n\n axios\n .post(endpoint, {\n domain: domain.value,\n dnsServer: 'authoritative',\n recordType: recordType.value.cli,\n }, {\n cancelToken: axiosSource.token,\n })\n .then((response) => {\n if (props.routerDomain !== domainNameToUrlPath(response.data.punycodeDomain)) {\n router.replace({\n path: domainToUrl(response.data.punycodeDomain),\n });\n }\n domain.value = domainNameToDisplayName(response.data.unicodeDomain);\n domainPunycode.value = domainNameToDisplayName(response.data.punycodeDomain);\n queryResult.value = response.data.queryResult;\n loading.value = false;\n })\n .catch((e) => {\n if (!axios.isCancel(e)) {\n error.value = toErrorType(e.response.data.error);\n }\n });\n}\n\nwatch(() => props.routerDomain, () => {\n const domainName = urlPathToDomainName(props.routerDomain);\n domain.value = domainName;\n domainPunycode.value = domainName;\n load();\n}, {\n immediate: true,\n});\n\nwindow.addEventListener('resize', () => {\n showSidebar.value = window.innerWidth > 991;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: `DNS ${_unref(recordType).upper} records for ${domain.value}`,\n description: `These are all the ${_unref(recordType).plural} (${_unref(recordType).upper} records) for ${domain.value} according to the authoritative DNS server.`,\n url: `https://www.nslookup.io${domainToUrl(domainPunycode.value)}`\n }, null, 8, [\"title\", \"description\", \"url\"])\n ])),\n _createVNode(HeaderComponent, {\n domain: domain.value,\n \"domain-search-to-url\": domainToUrl,\n \"search-button-text\": ['soa', 'spf', 'cname'].includes(_unref(recordType).lower) ? `Find ${_unref(recordType).upper} record` : `Find ${_unref(recordType).upper} records`\n }, null, 8, [\"domain\", \"search-button-text\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"h1\", _hoisted_4, [\n _createTextVNode(_toDisplayString(_unref(recordType).upper) + \" \" + _toDisplayString(['soa', 'spf', 'cname'].includes(_unref(recordType).lower) ? 'record' : 'records') + \" for \", 1),\n (domain.value === domainPunycode.value)\n ? (_openBlock(), _createElementBlock(\"b\", _hoisted_5, _toDisplayString(domain.value), 1))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_6, [\n _createElementVNode(\"b\", null, _toDisplayString(domainPunycode.value), 1),\n _createTextVNode(\" (\" + _toDisplayString(domain.value) + \")\", 1)\n ]))\n ]),\n _createVNode(DnsRecordsLink, {\n domain: domain.value,\n class: \"shrink-0 hidden mr-6 sm:block xl:mr-0\"\n }, {\n default: _withCtx(() => [\n _hoisted_7\n ]),\n _: 1\n }, 8, [\"domain\"])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n (error.value !== null)\n ? (_openBlock(), _createBlock(ApiErrorAlert, {\n key: 0,\n error: error.value,\n domain: domain.value,\n dnsserver: \"authoritative\"\n }, null, 8, [\"error\", \"domain\"]))\n : (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/2 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64)),\n _createVNode(SkeletonComponent, { class: \"inline-block w-56 h-8 my-6\" }),\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: n }, [\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" })\n ], 64))\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createElementVNode(\"p\", _hoisted_10, \"An authoritative DNS server (\" + _toDisplayString(queryResult.value.query.server.domain) + \") responded with these DNS records when we queried it for the domain \" + _toDisplayString(domain.value) + \".\", 1),\n (queryResult.value.response.answer.length === 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [\n _createVNode(Alert, { type: \"warning\" }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", null, [\n _createElementVNode(\"span\", _hoisted_12, _toDisplayString(domain.value), 1),\n _createTextVNode(\" does not have any \" + _toDisplayString(_unref(recordType).upper) + \" records.\", 1)\n ])\n ]),\n _: 1\n })\n ]))\n : (_unref(recordType).upper === 'A')\n ? (_openBlock(), _createBlock(IpDnsRecords, {\n key: 1,\n class: \"w-full\",\n records: queryResult.value,\n \"column-title\": \"IPv4 address\",\n \"record-type\": \"A\"\n }, null, 8, [\"records\"]))\n : (_unref(recordType).upper === 'AAAA')\n ? (_openBlock(), _createBlock(IpDnsRecords, {\n key: 2,\n class: \"w-full\",\n records: queryResult.value,\n \"column-title\": \"IPv6 address\",\n \"record-type\": \"AAAA\"\n }, null, 8, [\"records\"]))\n : (_unref(recordType).upper === 'CAA')\n ? (_openBlock(), _createBlock(CaaRecords, {\n key: 3,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'CNAME')\n ? (_openBlock(), _createBlock(DnsRecords, {\n key: 4,\n class: \"w-full\",\n records: queryResult.value,\n \"column-title\": \"Canonical name\",\n \"record-type\": \"CNAME\",\n \"is-domain\": true\n }, null, 8, [\"records\"]))\n : (_unref(recordType).upper === 'TXT')\n ? (_openBlock(), _createBlock(TxtRecords, {\n key: 5,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'NS')\n ? (_openBlock(), _createBlock(NsRecords, {\n key: 6,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'PTR')\n ? (_openBlock(), _createBlock(PtrRecords, {\n key: 7,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'MX')\n ? (_openBlock(), _createBlock(MxRecords, {\n key: 8,\n class: \"w-full\",\n records: queryResult.value\n }, null, 8, [\"records\"]))\n : (_unref(recordType).upper === 'SOA')\n ? (_openBlock(), _createBlock(SoaRecords, {\n key: 9,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'SRV')\n ? (_openBlock(), _createBlock(SrvRecords, {\n key: 10,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'TLSA')\n ? (_openBlock(), _createBlock(TlsaRecords, {\n key: 11,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_unref(recordType).upper === 'SPF')\n ? (_openBlock(), _createBlock(SpfRecords, {\n key: 12,\n class: \"w-full\",\n records: queryResult.value,\n domain: domain.value\n }, null, 8, [\"records\", \"domain\"]))\n : (_openBlock(), _createBlock(DnsRecords, {\n key: 13,\n class: \"w-full\",\n records: queryResult.value,\n \"column-title\": \"Data\",\n \"record-type\": _unref(recordType).upper\n }, null, 8, [\"records\", \"record-type\"])),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(RecordTypeResults)\n }, null, 8, [\"config\"]),\n _hoisted_13,\n _createVNode(RawRecords, { records: queryResult.value }, null, 8, [\"records\"])\n ], 64)),\n _createElementVNode(\"h2\", _hoisted_14, \"Find \" + _toDisplayString(_unref(recordType).upper) + \" records for another domain name\", 1),\n _createElementVNode(\"div\", _hoisted_15, [\n _createElementVNode(\"p\", _hoisted_16, [\n _createTextVNode(\"With \"),\n _createVNode(_component_router_link, {\n to: `/${_unref(recordType).lower}-lookup/`,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(_unref(recordType).upper) + \" lookup\", 1)\n ]),\n _: 1\n }, 8, [\"to\"]),\n _createTextVNode(\", you can find the \" + _toDisplayString(_unref(recordType).upper) + \" record for any domain name or subdomain. When you enter the domain in the input field below, it will show whether or not \" + _toDisplayString(_unref(recordType).plural) + \" are configured for that domain.\", 1)\n ]),\n _createElementVNode(\"form\", _hoisted_17, [\n _createVNode(DomainSearch, {\n \"placeholder-text\": _unref(recordType).upper === 'PTR' ? 'IP address or domain name' : 'Domain name',\n emphasize: \"\",\n buttonText: `Find ${_unref(recordType).upper} record`,\n prefill: domain.value,\n onSubmitted: redirectTo\n }, null, 8, [\"placeholder-text\", \"buttonText\", \"prefill\"])\n ])\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./RecordTypeLookupResults.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RecordTypeLookupResults.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n
\n \n Open to corporate sponsorship. Read more →\n \n
\n\n","import { render } from \"./SponsorshipBanner.vue?vue&type=template&id=191dadc3\"\nconst script = {}\n\nimport exportComponent from \"/builds/nslookupio/nslookupio/front-end/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, unref as _unref, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex items-center relative overflow-hidden rounded-full py-1.5 pl-2 pr-4 text-sm leading-6 shadow shadow-[#BD4680]/50 ring-1 ring-gray-900/10 hover:ring-gray-900/20\" }\nconst _hoisted_2 = /*#__PURE__*/_createStaticVNode(\"\", 1)\nconst _hoisted_3 = { class: \"flex flex-col items-center w-full sm:inline text-gray-600\" }\nconst _hoisted_4 = [\"href\"]\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"span\", {\n class: \"absolute inset-0\",\n \"aria-hidden\": \"true\"\n}, null, -1)\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", { \"aria-hidden\": \"true\" }, \"→\", -1)\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'RedirectPizzaBanner',\n setup(__props) {\n\nconst groups = [\n {\n text: 'DNS redirects with HTTPS',\n utm_content: 'dns-redirects-with-https',\n },\n {\n text: 'DNS redirects with HTTPS',\n utm_content: 'dns-redirects-with-https',\n },\n];\n\nconst storedGroup = localStorage.getItem('abGroupRedirectPizza');\n\nlet groupNumber;\nif (storedGroup) {\n groupNumber = parseInt(storedGroup, 10) % 2;\n} else {\n groupNumber = Math.random() > 0.5 ? 0 : 1;\n localStorage.setItem('abGroupRedirectPizza', groupNumber.toString());\n}\n\nconst group = groups[groupNumber];\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"span\", _hoisted_3, [\n _createTextVNode(_toDisplayString(_unref(group).text) + \" \", 1),\n _createElementVNode(\"a\", {\n href: `https://redirect.pizza/?utm_source=nslookup.io&utm_medium=text&utm_content=${_unref(group).utm_content}`,\n rel: \"noopener\",\n class: \"font-semibold text-[#BD4680] ml-3\"\n }, [\n _hoisted_5,\n _createTextVNode(\"Create free redirect \"),\n _hoisted_6\n ], 8, _hoisted_4)\n ])\n ]))\n}\n}\n\n})","import script from \"./RedirectPizzaBanner.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RedirectPizzaBanner.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, createVNode as _createVNode, renderSlot as _renderSlot, unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex flex-col bg-neutral-100 px-3 min-h-screen\" }\nconst _hoisted_2 = {\n class: \"flex-grow flex flex-col items-center justify-center\",\n autocomplete: \"off\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"img\", {\n src: \"img/logo.svg\",\n class: \"max-w-full my-8\",\n alt: \"NsLookup logo\",\n width: \"337\",\n height: \"57\"\n}, null, -1)\nconst _hoisted_4 = { class: \"mt-8 mb-8 sm:mb-20 text-center max-w-full w-[500px] text-neutral-800\" }\n\nimport { PropType } from 'vue';\nimport { useRouter } from 'vue-router';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport SponsorshipBanner from '@/components/layout/SponsorshipBanner.vue';\nimport { SearchPageAdUnit } from '@/common/adSlots';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport ContentPage from '@/components/layout/ContentPage.vue';\nimport { showRedirectPizzaAds } from '@/common/dateTime';\nimport RedirectPizzaBanner from '@/components/layout/RedirectPizzaBanner.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'SearchWithHiddenContentPage',\n props: {\n domainSearchToUrl: {\n type: Function as PropType<(encodedDomain: string) => string>,\n default: (encodedDomain: string) => `/domains/${encodedDomain}/dns-records/`,\n },\n searchButtonText: {\n type: String,\n default: undefined,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst router = useRouter();\n\nfunction redirectTo(domain: string): void {\n router.push(props.domainSearchToUrl(domain));\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", _hoisted_1, [\n _createElementVNode(\"form\", _hoisted_2, [\n _hoisted_3,\n _createVNode(DomainSearch, {\n autofocus: \"\",\n emphasize: \"\",\n onSubmitted: redirectTo,\n \"button-text\": __props.searchButtonText,\n class: \"h-12 max-w-full w-[500px]\"\n }, null, 8, [\"button-text\"]),\n _createElementVNode(\"p\", _hoisted_4, [\n _renderSlot(_ctx.$slots, \"search-explanation\"),\n (_unref(showRedirectPizzaAds)())\n ? (_openBlock(), _createBlock(RedirectPizzaBanner, {\n key: 0,\n class: \"mt-20 mx-auto sm:hidden\"\n }))\n : _createCommentVNode(\"\", true)\n ]),\n _createVNode(AdUnit, {\n class: \"mx-auto\",\n config: _unref(SearchPageAdUnit)\n }, null, 8, [\"config\"])\n ]),\n (_unref(showRedirectPizzaAds)())\n ? (_openBlock(), _createBlock(RedirectPizzaBanner, {\n key: 0,\n class: \"mb-6 mt-8 mx-auto hidden sm:flex\"\n }))\n : (_openBlock(), _createBlock(SponsorshipBanner, {\n key: 1,\n class: \"mb-6 mt-8 mx-auto\"\n }))\n ]),\n _createVNode(ContentPage, {\n \"domain-search-to-url\": __props.domainSearchToUrl,\n \"search-button-text\": __props.searchButtonText\n }, {\n content: _withCtx(() => [\n _renderSlot(_ctx.$slots, \"content\")\n ]),\n _: 3\n }, 8, [\"domain-search-to-url\", \"search-button-text\"])\n ], 64))\n}\n}\n\n})","import script from \"./SearchWithHiddenContentPage.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SearchWithHiddenContentPage.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, withCtx as _withCtx, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"text-3xl mt-14\" }, \"DNS propagation checker\", -1)\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Check the DNS propagation for any website using this online tool. This checker supports A, AAAA, NS, MX and TXT records.\", -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"p\", null, \"It helps you debug DNS resolution issues, and to find the time it will take before your DNS records will propagate. It will also show you a warning when your DNS records are misconfigured.\", -1)\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"How to check DNS records?\", -1)\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Not sure how to check DNS records? There are multiple ways, and we'll go through all of them:\", -1)\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"ol\", null, [\n /*#__PURE__*/_createElementVNode(\"li\", null, \"From the command line on Linux or Mac;\"),\n /*#__PURE__*/_createElementVNode(\"li\", null, \"From the command line on Windows;\"),\n /*#__PURE__*/_createElementVNode(\"li\", null, \"Using an online DNS checker.\")\n], -1)\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"Command line\", -1)\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow py-2 pr-1 bg-black\",\n src: \"/img/pages/dns-checker/mac-dig-output.png\",\n alt: \"Output of the dig command on mac\",\n title: \"Output of the dig command on mac\"\n}, null, -1)\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"p\", null, [\n /*#__PURE__*/_createTextVNode(\"If you're already familiar with using the command line, you can use a DNS checker that's built into your operating system. Both the \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"dig\"),\n /*#__PURE__*/_createTextVNode(\" and \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"nslookup\"),\n /*#__PURE__*/_createTextVNode(\" DNS checkers help you to quickly find the DNS records for a hostname.\")\n], -1)\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"p\", null, [\n /*#__PURE__*/_createElementVNode(\"code\", null, \"dig\"),\n /*#__PURE__*/_createTextVNode(\" comes pre-installed on Linux and MacOS. To check DNS records for a particular website, open a terminal and type \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"dig google.com\"),\n /*#__PURE__*/_createTextVNode(\", then hit enter. This will show the A records of the domain name google.com. To check a different record type, simply append it to the command like so: \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"dig google.com MX\"),\n /*#__PURE__*/_createTextVNode(\".\")\n], -1)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"p\", null, [\n /*#__PURE__*/_createTextVNode(\"You can also use dig on Windows, but you'll have to install it first. It's more convenient to use the built-in nslookup command if you're using Windows. Open a terminal (Start → cmd.exe) and type \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"nslookup facebook.com\"),\n /*#__PURE__*/_createTextVNode(\" to find the IP addresses that host Facebook.com. If you want to check for different record types than A records, you can add the \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"type\"),\n /*#__PURE__*/_createTextVNode(\" argument. So, \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"nslookup -type=TXT facebook.com\"),\n /*#__PURE__*/_createTextVNode(\" retrieves all TXT records of Facebook.com.\")\n], -1)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"p\", null, \"If you want to check the propagation of the DNS records at servers around the globe, then you'll have to execute this command for each server. This is where the online DNS checker comes in handy.\", -1)\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"Online tool\", -1)\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n src: \"/img/pages/dns-checker/nslookup-output.png\",\n alt: \"Output of an online DNS checker\",\n title: \"Output of an online DNS checker\"\n}, null, -1)\nconst _hoisted_15 = /*#__PURE__*/_createElementVNode(\"p\", null, \"A more convenient way to find DNS records is to use an online DNS checker like the one on this page. It helps you check DNS records right from your browser, without the need for a command line. Simply scroll up, type the name of the website you want to check the DNS records of, and click \\\"check propagation\\\".\", -1)\nconst _hoisted_16 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"DNS domain tester\", -1)\nconst _hoisted_17 = /*#__PURE__*/_createElementVNode(\"p\", null, \"The Domain Name System (DNS) contains every domain name. It's sometimes useful to test a DNS domain to see what the IP addresses it resolves to. You can check a DNS domain with the tool on this page.\", -1)\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Scroll to the DNS domain checker at the top of this page and type the domain name you want to test. Click \\\"check propagation\\\" to see all DNS records for that domain.\", -1)\nconst _hoisted_19 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"Why check DNS propagation?\", -1)\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Whether you're setting up a new website, updating records for an existing site, or checking the configuration of a mail server, a DNS propagation checker can come in handy!\", -1)\nconst _hoisted_21 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"New website\", -1)\nconst _hoisted_22 = /*#__PURE__*/_createElementVNode(\"p\", null, \"When setting up a new website, one of the things you'll have to do is configure DNS records. Nearly all hosting providers have dedicated DNS servers. You can use these to configure DNS records. If you want to use DNS servers of another organization, you'll have to point the NS records from the hosting provider there. This process can take a while, so it can be convenient to check if the DNS records are still propagating, or have already fully propagated.\", -1)\nconst _hoisted_23 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"Check updated records\", -1)\nconst _hoisted_24 = /*#__PURE__*/_createElementVNode(\"p\", null, \"If you're changing DNS records, there might be some DNS servers that cache the old version of your records. They will eventually remove that version, but it might take a while before the so-called 'time to live' (TTL) expires. So, if you've just updated your DNS records, you can use a DNS checker to find out whether the DNS servers are serving a fresh or stale set of records.\", -1)\nconst _hoisted_25 = /*#__PURE__*/_createElementVNode(\"h3\", null, \"Mail server configuration\", -1)\nconst _hoisted_26 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Email works like a distributed system, consisting of independent mail servers. The mail servers from Gmail and Outlook.com, for example, can change independently. They need some way to communicate these changes. That's where DNS comes in.\", -1)\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Everyone that has configured email for a domain name, has to update their DNS records. MX records tell which to which servers an email for a certain domain should be sent. TXT records contain SPF data that prevents spam. You can inspect these settings with a DNS checker.\", -1)\nconst _hoisted_28 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"How does it work?\", -1)\nconst _hoisted_29 = /*#__PURE__*/_createElementVNode(\"p\", null, \"You can check the DNS propagation of a domain name like this:\", -1)\nconst _hoisted_30 = /*#__PURE__*/_createElementVNode(\"ol\", null, [\n /*#__PURE__*/_createElementVNode(\"li\", null, \"Fill in a domain name in on the top of this page and click \\\"check propagation\\\".\"),\n /*#__PURE__*/_createElementVNode(\"li\", null, \"One of the servers of Nslookup will query the DNS records for that website using many local and global DNS servers.\"),\n /*#__PURE__*/_createElementVNode(\"li\", null, \"The DNS servers responds with DNS records.\"),\n /*#__PURE__*/_createElementVNode(\"li\", null, \"The DNS records are parsed and grouped, so you can easily see which servers respond with the same set of DNS records.\")\n], -1)\n\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport SearchWithHiddenContentPage from '@/components/pages/SearchWithHiddenContentPage.vue';\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DnsChecker',\n setup(__props) {\n\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: \"DNS Propagation Checker\",\n description: \"Check global DNS propagation for any website using this free online tool. Global DNS propagation checker — check DNS records around the world.\",\n url: \"https://www.nslookup.io/dns-checker/\"\n })\n ])),\n _createVNode(SearchWithHiddenContentPage, {\n \"domain-search-to-url\": (encodedDomain) => `/domains/${encodedDomain}/dns-propagation/a/`,\n \"search-button-text\": \"Check propagation\"\n }, {\n \"search-explanation\": _withCtx(() => [\n _createTextVNode(\" Check the DNS propagation for any website using this online tool. For example, try \"),\n _createVNode(DnsRecordsLink, {\n page: \"propagation\",\n domain: \"youtube.com\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n page: \"propagation\",\n domain: \"amazon.com\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" to view their DNS propagation. \")\n ]),\n content: _withCtx(() => [\n _hoisted_1,\n _hoisted_2,\n _hoisted_3,\n _hoisted_4,\n _hoisted_5,\n _hoisted_6,\n _hoisted_7,\n _hoisted_8,\n _hoisted_9,\n _hoisted_10,\n _hoisted_11,\n _hoisted_12,\n _hoisted_13,\n _hoisted_14,\n _hoisted_15,\n _hoisted_16,\n _hoisted_17,\n _hoisted_18,\n _hoisted_19,\n _hoisted_20,\n _hoisted_21,\n _hoisted_22,\n _hoisted_23,\n _hoisted_24,\n _hoisted_25,\n _hoisted_26,\n _hoisted_27,\n _hoisted_28,\n _hoisted_29,\n _hoisted_30\n ]),\n _: 1\n }, 8, [\"domain-search-to-url\"])\n ], 64))\n}\n}\n\n})","import script from \"./DnsChecker.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DnsChecker.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, unref as _unref, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto\" }\nconst _hoisted_3 = { class: \"max-w-lg min-h-[calc(100vh-250px)] mx-auto text-center\" }\nconst _hoisted_4 = {\n class: \"text-base flex flex-col items-center justify-center min-h-screen\",\n autocomplete: \"off\"\n}\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"font-extrabold text-4xl max-w-full my-8\" }, \"Reverse IP lookup\", -1)\nconst _hoisted_6 = { class: \"mt-8 mb-20 text-center max-w-full h-20 w-[500px] text-neutral-800\" }\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\n\nimport { useRouter } from 'vue-router';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { domainNameToUrlPath } from '@/common/domainName';\nimport { ReverseIpLookup } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ReverseIpLookup',\n setup(__props) {\n\nconst router = useRouter();\n\nfunction redirectTo(ip: string): void {\n router.push(`/ip/${domainNameToUrlPath(ip)}/domain-names/`);\n}\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: \"Reverse IP Lookup\",\n description: \"Find the domain name that is connected to an IP address. Check if the any websites are hosted on an IP by doing a reverse DNS lookup.\",\n url: \"https://www.nslookup.io/reverse-ip-lookup/\"\n })\n ])),\n _createVNode(HeaderComponent, {\n \"domain-search-to-url\": (encodedDomain) => `/ip/${encodedDomain}/domain-names/`,\n \"search-button-text\": \"Reverse lookup\",\n \"autocomplete-enabled\": false\n }, null, 8, [\"domain-search-to-url\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"form\", _hoisted_4, [\n _hoisted_5,\n _createVNode(DomainSearch, {\n class: \"h-12 mb-6 max-w-full w-[500px]\",\n autofocus: \"\",\n emphasize: \"\",\n \"autocomplete-enabled\": false,\n buttonText: \"Reverse lookup\",\n \"placeholder-text\": \"IP address\",\n onSubmitted: redirectTo\n }),\n _createElementVNode(\"p\", _hoisted_6, [\n _createTextVNode(\"Find the domain name that is connected to an IP address. Check if the any websites are hosted on an IP by doing a reverse DNS lookup.\"),\n _hoisted_7,\n _createTextVNode(\"For example, try \"),\n _createVNode(_component_router_link, {\n to: \"/ip/91.198.174.192/domain-names/\",\n title: \"Domain names for 91.198.174.192\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"91.198.174.192\")\n ]),\n _: 1\n }),\n _createTextVNode(\" or \"),\n _createVNode(_component_router_link, {\n to: \"/ip/1.1.1.1/domain-names/\",\n title: \"Domain names for 1.1.1.1\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"1.1.1.1\")\n ]),\n _: 1\n }),\n _createTextVNode(\" to view their domain names. \")\n ]),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(ReverseIpLookup)\n }, null, 8, [\"config\"])\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./ReverseIpLookup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ReverseIpLookup.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, unref as _unref, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex-grow bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto max-w-6xl\" }\nconst _hoisted_3 = { class: \"flex flex-col justify-between mt-8 mb-6 ml-6 sm:flex-row sm:items-center\" }\nconst _hoisted_4 = { class: \"text-3xl\" }\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"button\", {\n type: \"button\",\n class: \"inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2\"\n}, \"All DNS records\", -1)\nconst _hoisted_6 = { class: \"bg-white shadow p-6 pb-10 rounded-t\" }\nconst _hoisted_7 = {\n key: 1,\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_8 = { class: \"mb-3\" }\nconst _hoisted_9 = {\n key: 0,\n class: \"mt-4\"\n}\nconst _hoisted_10 = { class: \"font-semibold\" }\nconst _hoisted_11 = { class: \"font-semibold\" }\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"Question and response\", -1)\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"Find the domain name for another IP address\", -1)\nconst _hoisted_14 = { class: \"flex flex-col lg:flex-row\" }\nconst _hoisted_15 = { class: \"shrink max-w-xl\" }\nconst _hoisted_16 = {\n class: \"mt-3 w-[500px] max-w-full sm:px-6 lg:mt-0\",\n autocomplete: \"off\"\n}\n\nimport axios, { Canceler } from 'axios';\nimport { ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport ApiErrorAlert from '@/components/ApiErrorAlert.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport CopyComponent from '@/components/micro/CopyComponent.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport SkeletonComponent from '@/components/micro/SkeletonComponent.vue';\nimport { QueryResult, emptyDnsServer, emptyResponse } from '@/model/Api';\nimport { ApiErrorType, toErrorType } from '@/model/ApiErrorAlert';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { domainNameToUrlPath } from '@/common/domainName';\nimport { ReverseIpResults } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ReverseIpLookupResults',\n props: {\n routerIp: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst router = useRouter();\n\nconst ip = ref('');\nconst domainPunycode = ref('');\nconst loading = ref(true);\nconst error = ref(null);\nconst showSidebar = ref(window.innerWidth > 991);\nconst cancelToken = ref(null);\nconst queryResult = ref({\n query: {\n server: emptyDnsServer,\n domain: ip.value,\n recordType: 'PTR',\n },\n response: emptyResponse,\n});\n\nfunction redirectTo(newIp: string): void {\n router.push(`/ip/${domainNameToUrlPath(newIp)}/domain-names/`);\n}\n\nfunction load() {\n loading.value = true;\n error.value = null;\n\n if (cancelToken.value) {\n cancelToken.value();\n }\n const axiosSource = axios.CancelToken.source();\n cancelToken.value = axiosSource.cancel;\n\n axios\n .post('api/v1/ptr-records', {\n domain: ip.value,\n dnsServer: 'authoritative',\n }, {\n cancelToken: axiosSource.token,\n })\n .then((response) => {\n queryResult.value = response.data;\n loading.value = false;\n })\n .catch((e) => {\n if (!axios.isCancel(e)) {\n error.value = toErrorType(e.response.data.error);\n }\n });\n}\n\nwatch(() => props.routerIp, () => {\n if (domainPunycode.value !== props.routerIp) {\n ip.value = decodeURI(props.routerIp)\n .toLowerCase();\n domainPunycode.value = decodeURI(props.routerIp)\n .toLowerCase();\n load();\n }\n}, {\n immediate: true,\n});\n\nwindow.addEventListener('resize', () => {\n showSidebar.value = window.innerWidth > 991;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: `Reverse IP lookup for ${ip.value}`,\n description: `This is the canonical hostname for ${ip.value}. It has been configured by the owner of this IP address.`,\n url: `https://www.nslookup.io/ip/${domainPunycode.value}/domain-names/`\n }, null, 8, [\"title\", \"description\", \"url\"])\n ])),\n _createVNode(HeaderComponent, {\n \"domain-search-to-url\": (encodedDomain) => `/ip/${encodedDomain}/domain-names/`,\n \"search-button-text\": \"Reverse lookup\",\n domain: ip.value,\n \"autocomplete-enabled\": false\n }, null, 8, [\"domain-search-to-url\", \"domain\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"h1\", _hoisted_4, [\n _createTextVNode(\"Reverse IP lookup for \"),\n _createElementVNode(\"b\", null, _toDisplayString(ip.value), 1)\n ]),\n _createVNode(DnsRecordsLink, {\n domain: ip.value,\n class: \"shrink-0 hidden mr-6 sm:block xl:mr-0\"\n }, {\n default: _withCtx(() => [\n _hoisted_5\n ]),\n _: 1\n }, 8, [\"domain\"])\n ]),\n _createElementVNode(\"div\", _hoisted_6, [\n (error.value !== null)\n ? (_openBlock(), _createBlock(ApiErrorAlert, {\n key: 0,\n error: error.value,\n domain: ip.value,\n dnsserver: \"authoritative\"\n }, null, 8, [\"error\", \"domain\"]))\n : (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/2 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64)),\n _createVNode(SkeletonComponent, { class: \"inline-block w-56 h-8 my-6\" }),\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: n }, [\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" })\n ], 64))\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createElementVNode(\"p\", _hoisted_8, \"Our DNS servers responded with these IP addresses when we queried it for the domain \" + _toDisplayString(ip.value) + \". Some DNS servers may return different IP addresses based on your location.\", 1),\n (queryResult.value.response.answer.length === 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n _createVNode(Alert, { type: \"warning\" }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", null, [\n _createElementVNode(\"span\", _hoisted_10, _toDisplayString(ip.value), 1),\n _createTextVNode(\" does not have a reverse lookup record.\")\n ])\n ]),\n _: 1\n })\n ]))\n : (_openBlock(), _createBlock(Alert, {\n key: 1,\n type: \"success\",\n class: \"mt-4\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\" The canonical hostname of \"),\n _createElementVNode(\"span\", _hoisted_11, _toDisplayString(ip.value), 1),\n _createTextVNode(\" is \"),\n _createVNode(DnsRecordsLink, {\n domain: queryResult.value.response.answer[0].record.target,\n class: \"font-semibold hover:underline\"\n }, null, 8, [\"domain\"]),\n _createVNode(CopyComponent, {\n content: queryResult.value.response.answer[0].record.target\n }, null, 8, [\"content\"])\n ]),\n _: 1\n })),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(ReverseIpResults)\n }, null, 8, [\"config\"]),\n _hoisted_12,\n _createVNode(RawRecords, { records: queryResult.value }, null, 8, [\"records\"])\n ], 64)),\n _hoisted_13,\n _createElementVNode(\"div\", _hoisted_14, [\n _createElementVNode(\"p\", _hoisted_15, [\n _createTextVNode(\"With \"),\n _createVNode(_component_router_link, {\n to: \"/reverse-ip-lookup/\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"reverse IP lookup\")\n ]),\n _: 1\n }),\n _createTextVNode(\", you can find the domain name for any IP address. When you enter an IPv4 or IPv6 address in the input field below, it will show the canonical domain name for that IP address.\")\n ]),\n _createElementVNode(\"form\", _hoisted_16, [\n _createVNode(DomainSearch, {\n \"placeholder-text\": \"IP address\",\n emphasize: \"\",\n buttonText: \"Reverse lookup\",\n prefill: ip.value,\n onSubmitted: redirectTo,\n \"autocomplete-enabled\": false\n }, null, 8, [\"prefill\"])\n ])\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./ReverseIpLookupResults.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ReverseIpLookupResults.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, unref as _unref, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto\" }\nconst _hoisted_3 = { class: \"flex flex-col justify-center max-w-lg min-h-[calc(100vh-250px)] mx-auto text-center\" }\nconst _hoisted_4 = {\n class: \"text-base flex flex-col items-center justify-center\",\n autocomplete: \"off\"\n}\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"font-extrabold text-4xl max-w-full my-8\" }, \"Website to IP lookup\", -1)\nconst _hoisted_6 = { class: \"mt-8 mb-20 text-center max-w-full h-20 w-[500px] text-neutral-800\" }\nconst _hoisted_7 = { class: \"prose max-w-6xl prose-indigo mt-6 mx-auto bg-white p-6 rounded-t shadow\" }\nconst _hoisted_8 = { class: \"flex flex-col justify-between md:flex-row\" }\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"inline-block text-2xl mt-0\" }, \"How to lookup a website's IP address\", -1)\nconst _hoisted_10 = { class: \"shrink-0 flex items-center mb-5 text-sm font-medium leading-4\" }\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"hidden mr-2 sm:inline\" }, \"Jump to\", -1)\nconst _hoisted_12 = {\n type: \"button\",\n class: \"inline-flex items-center rounded-md border border-[#3a0161] bg-white px-3 py-2 text-[#3a0161] shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2\"\n}\nconst _hoisted_13 = { class: \"first-letter:uppercase\" }\nconst _hoisted_14 = { class: \"md:grid md:gap-6 md:grid-cols-2\" }\nconst _hoisted_15 = /*#__PURE__*/_createElementVNode(\"p\", null, [\n /*#__PURE__*/_createTextVNode(\"Every website has at least one IP address connected to its domain name. For example, the website Facebook has, among others, the IP address \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"157.240.214.35\"),\n /*#__PURE__*/_createTextVNode(\" connected to the domain name \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"www.facebook.com\"),\n /*#__PURE__*/_createTextVNode(\".\")\n], -1)\nconst _hoisted_16 = /*#__PURE__*/_createElementVNode(\"p\", null, \"When you enter a URL in your browser, it will first determine the domain name of that URL. It then looks up the IP address and connects to the server with this IP. Once connected, it fetches the website's source code to display the page.\", -1)\nconst _hoisted_17 = /*#__PURE__*/_createElementVNode(\"img\", {\n class: \"w-full md:mb-0 md:mt-6\",\n src: \"img/pages/record-type-lookup/a-lookup-mac.png\",\n alt: \"Example output of an IPv4 address lookup\"\n}, null, -1)\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"h2\", { id: \"windows\" }, \"How to lookup a website's IP address on Windows\", -1)\nconst _hoisted_19 = /*#__PURE__*/_createElementVNode(\"p\", null, \"To check the server IP addresses for a domain name on Windows, follow these steps:\", -1)\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"em\", null, \"command prompt\", -1)\nconst _hoisted_21 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/open-command-prompt-windows.png\",\n alt: \"Open a command prompt in Windows\"\n}, null, -1)\nconst _hoisted_22 = /*#__PURE__*/_createElementVNode(\"code\", null, \"nslookup -q=A example.com\", -1)\nconst _hoisted_23 = /*#__PURE__*/_createElementVNode(\"code\", null, \"example.com\", -1)\nconst _hoisted_24 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/a-lookup-windows.png\",\n alt: \"IPv4 address lookup in Windows\"\n}, null, -1)\nconst _hoisted_25 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"The IP addresses are listed below the \"),\n /*#__PURE__*/_createElementVNode(\"strong\", null, \"Non-authoritative answer\"),\n /*#__PURE__*/_createTextVNode(\" heading.\")\n], -1)\nconst _hoisted_26 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"(Optional) To also see the IPv6 addresses, repeat these steps with \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"AAAA\"),\n /*#__PURE__*/_createTextVNode(\" instead of \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"A\"),\n /*#__PURE__*/_createTextVNode(\".\")\n], -1)\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"h2\", { id: \"mac\" }, \"How to lookup a website's IP address on Mac OS\", -1)\nconst _hoisted_28 = /*#__PURE__*/_createElementVNode(\"p\", null, \"To check the IP addresses for a domain name on a Mac, follow these steps:\", -1)\nconst _hoisted_29 = /*#__PURE__*/_createElementVNode(\"em\", null, \"terminal\", -1)\nconst _hoisted_30 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/open-terminal-mac.png\",\n alt: \"Open a terminal on a Mac\"\n}, null, -1)\nconst _hoisted_31 = /*#__PURE__*/_createElementVNode(\"code\", null, \"dig example.com A\", -1)\nconst _hoisted_32 = /*#__PURE__*/_createElementVNode(\"code\", null, \"example.com\", -1)\nconst _hoisted_33 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/a-lookup-mac.png\",\n alt: \"IPv4 lookup on a Mac\"\n}, null, -1)\nconst _hoisted_34 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"The IP addresses are listed below the \"),\n /*#__PURE__*/_createElementVNode(\"strong\", null, \"ANSWER SECTION\"),\n /*#__PURE__*/_createTextVNode(\" heading.\")\n], -1)\nconst _hoisted_35 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"(Optional) To also see the IPv6 addresses, repeat these steps with \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"AAAA\"),\n /*#__PURE__*/_createTextVNode(\" instead of \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"A\"),\n /*#__PURE__*/_createTextVNode(\".\")\n], -1)\nconst _hoisted_36 = /*#__PURE__*/_createElementVNode(\"h2\", { id: \"linux\" }, \"How to lookup a website's IP address on Linux\", -1)\nconst _hoisted_37 = /*#__PURE__*/_createElementVNode(\"p\", null, \"To check the IP addresses for a domain name on Linux, follow these steps:\", -1)\nconst _hoisted_38 = /*#__PURE__*/_createElementVNode(\"em\", null, \"terminal\", -1)\nconst _hoisted_39 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/open-terminal-linux.png\",\n alt: \"Open a terminal in Linux\"\n}, null, -1)\nconst _hoisted_40 = /*#__PURE__*/_createElementVNode(\"code\", null, \"dig example.com A\", -1)\nconst _hoisted_41 = /*#__PURE__*/_createElementVNode(\"code\", null, \"example.com\", -1)\nconst _hoisted_42 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/record-type-lookup/a-lookup-linux.png\",\n alt: \"IPv4 lookup in Linux\"\n}, null, -1)\nconst _hoisted_43 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"The IP addresses are listed below the \"),\n /*#__PURE__*/_createElementVNode(\"strong\", null, \"ANSWER SECTION\"),\n /*#__PURE__*/_createTextVNode(\" heading.\")\n], -1)\nconst _hoisted_44 = /*#__PURE__*/_createElementVNode(\"li\", null, [\n /*#__PURE__*/_createTextVNode(\"(Optional) To also see the IPv6 addresses, repeat these steps with \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"AAAA\"),\n /*#__PURE__*/_createTextVNode(\" instead of \"),\n /*#__PURE__*/_createElementVNode(\"code\", null, \"A\"),\n /*#__PURE__*/_createTextVNode(\".\")\n], -1)\nconst _hoisted_45 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"How to find a website's IP address\", -1)\nconst _hoisted_46 = /*#__PURE__*/_createElementVNode(\"p\", null, \"To check the IP addresses of a domain, follow these steps:\", -1)\nconst _hoisted_47 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/website-to-ip-lookup/website-to-ip-lookup.png\",\n alt: \"Open the website to IP lookup tool\"\n}, null, -1)\nconst _hoisted_48 = /*#__PURE__*/_createElementVNode(\"img\", {\n loading: \"lazy\",\n class: \"block my-2 w-full border border-black/10 rounded-md shadow md:w-1/2\",\n src: \"img/pages/website-to-ip-lookup/website-to-ip-lookup-results.png\",\n alt: \"Example IP addresses\"\n}, null, -1)\nconst _hoisted_49 = /*#__PURE__*/_createElementVNode(\"li\", null, \"The tool will query the IPv4 and IPv6 addresses and shown them at the top of the page.\", -1)\n\nimport { useRouter } from 'vue-router';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport Icon from '@/components/micro/IconComponent.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport { LargeRectangle, MediumRectangle } from '@/common/adSizes';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { domainNameToUrlPath } from '@/common/domainName';\nimport { WebsiteToIpLookup } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'WebsiteToIpLookup',\n setup(__props) {\n\nconst router = useRouter();\n\nconst platforms: Array<'windows' | 'mac' | 'linux'> = [\n 'windows',\n 'mac',\n 'linux',\n];\n\nfunction redirectTo(domain: string): void {\n router.push(`/domains/${domainNameToUrlPath(domain)}/webservers/`);\n}\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: \"Website to IP Lookup\",\n description: \"Find the IP addresses for any website or domain name. This online tool shows both IPv4 and IPv6 addresses as well as their hosting provider and location.\",\n url: `https://www.nslookup.io/website-to-ip-lookup/`\n }, null, 8, [\"url\"])\n ])),\n _createVNode(HeaderComponent, {\n \"domain-search-to-url\": (encodedDomain) => `/domains/${encodedDomain}/webservers/`,\n \"search-button-text\": \"Find IP addresses\"\n }, null, 8, [\"domain-search-to-url\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"form\", _hoisted_4, [\n _hoisted_5,\n _createVNode(DomainSearch, {\n class: \"h-12 mb-6 max-w-full w-[500px]\",\n autofocus: \"\",\n emphasize: \"\",\n buttonText: \"Find IP addresses\",\n \"placeholder-text\": \"URL or domain name\",\n onSubmitted: redirectTo\n }),\n _createElementVNode(\"p\", _hoisted_6, [\n _createTextVNode(\"Find all IP addresses with this website to IP checker. For example, try \"),\n _createVNode(DnsRecordsLink, {\n page: \"webservers\",\n domain: \"facebook.com\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n page: \"webservers\",\n domain: \"google.com\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" to view their IP addresses. You can also enter a URL to get its IP addresses. \")\n ]),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(WebsiteToIpLookup)\n }, null, 8, [\"config\"])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"div\", _hoisted_8, [\n _hoisted_9,\n _createElementVNode(\"span\", _hoisted_10, [\n _hoisted_11,\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(platforms, (platform) => {\n return _createVNode(_component_router_link, {\n key: platform,\n to: `#${platform.toLowerCase()}`,\n class: \"no-underline mr-2 last:mr-0\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", _hoisted_12, [\n _createVNode(Icon, {\n icon: platform,\n class: \"mr-2\"\n }, null, 8, [\"icon\"]),\n _createElementVNode(\"span\", _hoisted_13, _toDisplayString(platform), 1)\n ])\n ]),\n _: 2\n }, 1032, [\"to\"])\n }), 64))\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_14, [\n _createElementVNode(\"div\", null, [\n _hoisted_15,\n _hoisted_16,\n _createElementVNode(\"p\", null, [\n _createTextVNode(\"These IP addresses are configured in the Domain Name System (DNS) as \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/a/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"A\")\n ]),\n _: 1\n }),\n _createTextVNode(\" and \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/aaaa/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"AAAA\")\n ]),\n _: 1\n }),\n _createTextVNode(\" records. But how can you look up those IP addresses? That depends on the operating system you are using. Windows, Linux and Mac all have a different way of finding the IPv4 and IPv6 addresses. The sections below list the instructions for each operating system.\")\n ])\n ]),\n _hoisted_17\n ]),\n _hoisted_18,\n _hoisted_19,\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_20,\n _createTextVNode(\" by navigating to \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" Start → \"),\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" 'Type here to search' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'cmd' → \"),\n _createVNode(Icon, { icon: \"click\" }),\n _createTextVNode(\" Open\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_21\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _hoisted_22\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the IPv4 addresses for \"),\n _hoisted_23,\n _createTextVNode(\".\"),\n _hoisted_24\n ]),\n _hoisted_25,\n _hoisted_26\n ]),\n _hoisted_27,\n _hoisted_28,\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_29,\n _createTextVNode(\" by entering \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [command] + [space] → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'terminal.app' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_30\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _hoisted_31\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the IPv4 addresses for \"),\n _hoisted_32,\n _createTextVNode(\".\"),\n _hoisted_33\n ]),\n _hoisted_34,\n _hoisted_35\n ]),\n _hoisted_36,\n _hoisted_37,\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open a \"),\n _hoisted_38,\n _createTextVNode(\" by entering \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [Super] → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" 'terminal' → \"),\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_39\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Type \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(),\n _hoisted_40\n ]),\n _createTextVNode(\" and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\" to get the IPv4 addresses for \"),\n _hoisted_41,\n _createTextVNode(\".\"),\n _hoisted_42\n ]),\n _hoisted_43,\n _hoisted_44\n ]),\n _hoisted_45,\n _hoisted_46,\n _createElementVNode(\"ol\", null, [\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Open the \"),\n _createVNode(_component_router_link, { to: \"/website-to-ip-lookup/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"website to IP lookup tool\")\n ]),\n _: 1\n }),\n _createTextVNode(\".\"),\n _hoisted_47\n ]),\n _createElementVNode(\"li\", null, [\n _createTextVNode(\"Enter the URL or domain name and hit \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(Icon, { icon: \"type\" }),\n _createTextVNode(\" [enter]\")\n ]),\n _createTextVNode(\".\"),\n _hoisted_48\n ]),\n _hoisted_49\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./WebsiteToIpLookup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./WebsiteToIpLookup.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createVNode as _createVNode, createTextVNode as _createTextVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"colgroup\", null, [\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"min-w-[35px]\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-full sm:w-[60%] md:w-[35%]\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-[10%] hidden md:table-column\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-[40%] hidden md:w-[25%] sm:table-column\" }),\n /*#__PURE__*/_createElementVNode(\"col\", { class: \"w-[30%] hidden md:table-column\" })\n], -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"thead\", null, [\n /*#__PURE__*/_createElementVNode(\"tr\", { class: \"border-b-2 border-gray-200 text-left\" }, [\n /*#__PURE__*/_createElementVNode(\"th\", { scope: \"col\" }),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium\"\n }, \"IP address\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium hidden md:table-cell\"\n }, \"Type\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium hidden sm:table-cell\"\n }, \"Hosted by\"),\n /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-1.5 font-medium hidden md:table-cell\"\n }, \"Location\")\n ])\n], -1)\nconst _hoisted_4 = { class: \"group\" }\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"svg\", {\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 16 16\",\n class: \"inline\",\n fill: \"currentColor\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}, [\n /*#__PURE__*/_createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"\n })\n], -1)\nconst _hoisted_6 = [\n _hoisted_5\n]\nconst _hoisted_7 = { key: 1 }\nconst _hoisted_8 = { class: \"py-1\" }\nconst _hoisted_9 = { class: \"break-all\" }\nconst _hoisted_10 = { class: \"hidden md:table-cell\" }\nconst _hoisted_11 = { class: \"hidden sm:table-cell\" }\nconst _hoisted_12 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_13 = { class: \"hidden md:table-cell\" }\nconst _hoisted_14 = {\n key: 0,\n class: \"hidden\"\n}\nconst _hoisted_15 = { colspan: \"5\" }\nconst _hoisted_16 = { class: \"flex flex-col items-stretch bg-neutral-50 rounded-sm overflow-hidden md:flex-row\" }\nconst _hoisted_17 = { class: \"md:w-1/2\" }\nconst _hoisted_18 = { class: \"block m-6 ml-8 mb-4 text-lg font-medium\" }\nconst _hoisted_19 = { class: \"w-full mx-6 md:mb-4 border-separate border-spacing-2\" }\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium\"\n}, \"Location\", -1)\nconst _hoisted_21 = [\"href\"]\nconst _hoisted_22 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium\"\n}, \"AS\", -1)\nconst _hoisted_23 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"row\",\n class: \"text-left font-medium whitespace-nowrap\"\n}, \"AS name\", -1)\nconst _hoisted_24 = { class: \"w-full p-4 md:w-1/2\" }\nconst _hoisted_25 = { key: 1 }\n\nimport { computed, PropType } from 'vue';\nimport Copy from '@/components/micro/CopyComponent.vue';\nimport {\n A, AAAA, QueryResult, RecordInfo,\n} from '@/model/Api';\n\ntype IpRecordWithInfo = {\n record: A | AAAA;\n} & RecordInfo\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'IpAddresses',\n props: {\n aRecords: {\n type: Object as PropType,\n required: true,\n },\n aaaaRecords: {\n type: Object as PropType,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst processedRecords = computed(() => props.aRecords.response.answer.concat(props.aaaaRecords.response.answer).filter((item) => ['A', 'AAAA'].includes(item.record.recordType)) as Array);\n\nfunction getIp(record: A | AAAA): string {\n if ('ipv4' in record) return record.ipv4;\n return record.ipv6.slice(1, -1);\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_unref(processedRecords).length !== 0)\n ? (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n _hoisted_2,\n _hoisted_3,\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(processedRecords), (record, index) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: index }, [\n _createElementVNode(\"tr\", _hoisted_4, [\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"td\", {\n key: 0,\n class: \"text-center\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(e => { e.target?.closest('tr').nextSibling.classList.toggle('hidden'); e.target?.closest('tr').querySelector('svg').classList.toggle('rotate-90') }, [\"stop\"]))\n }, _hoisted_6))\n : (_openBlock(), _createElementBlock(\"td\", _hoisted_7)),\n _createElementVNode(\"td\", _hoisted_8, [\n _createElementVNode(\"strong\", _hoisted_9, _toDisplayString(getIp(record.record)), 1),\n _createVNode(Copy, {\n content: getIp(record.record),\n class: \"[visibility:hidden] group-hover:visible\"\n }, null, 8, [\"content\"])\n ]),\n _createElementVNode(\"td\", _hoisted_10, _toDisplayString(record.record.recordType === 'A' ? 'IPv4' : 'IPv6'), 1),\n _createElementVNode(\"td\", _hoisted_11, [\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"inline w-4 h-4 mb-0.5 mr-1.5\",\n src: `https://icons.duckduckgo.com/ip3/${record.ipInfo.asdomain}.ico`,\n alt: `Hosted by ${record.ipInfo.asname}`,\n title: `Hosted by ${record.ipInfo.asname}`\n }, null, 8, _hoisted_12))\n : _createCommentVNode(\"\", true),\n _createTextVNode(\" \" + _toDisplayString(record.ipInfo?.asname), 1)\n ]),\n _createElementVNode(\"td\", _hoisted_13, _toDisplayString(record.ipInfo?.country), 1)\n ]),\n (record.ipInfo)\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_14, [\n _createElementVNode(\"td\", _hoisted_15, [\n _createElementVNode(\"div\", _hoisted_16, [\n _createElementVNode(\"div\", _hoisted_17, [\n _createElementVNode(\"span\", _hoisted_18, _toDisplayString(record.ipInfo.org), 1),\n _createElementVNode(\"table\", _hoisted_19, [\n _createElementVNode(\"tbody\", null, [\n _createElementVNode(\"tr\", null, [\n _hoisted_20,\n _createElementVNode(\"td\", null, [\n _createElementVNode(\"a\", {\n href: `https://www.google.com/maps/search/${record.ipInfo.city}, ${record.ipInfo.regionName}, ${record.ipInfo.country}`,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, _toDisplayString(record.ipInfo.city) + \", \" + _toDisplayString(record.ipInfo.regionName) + \", \" + _toDisplayString(record.ipInfo.country), 9, _hoisted_21)\n ])\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_22,\n _createElementVNode(\"td\", null, _toDisplayString(record.ipInfo.as), 1)\n ]),\n _createElementVNode(\"tr\", null, [\n _hoisted_23,\n _createElementVNode(\"td\", null, _toDisplayString(record.ipInfo.asname), 1)\n ])\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_24, [\n _createElementVNode(\"div\", {\n class: \"min-h-[140px] h-full w-full rounded-sm bg-center\",\n style: _normalizeStyle({ backgroundImage: `url(https://stadiamaps.com/static/outdoors?api_key=23fe682b-ac7c-4f2b-83db-39dcf2a8b9ac¢er=${record.ipInfo.lat + 2},${record.ipInfo.lon}&zoom=2&markers=${record.ipInfo.lat},${record.ipInfo.lon}&size=1068x534 )` })\n }, null, 4)\n ])\n ])\n ])\n ]))\n : _createCommentVNode(\"\", true)\n ], 64))\n }), 128))\n ])\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_25, \"No IP addresses records found.\"))\n}\n}\n\n})","import script from \"./IpAddresses.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./IpAddresses.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, unref as _unref, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex-grow bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto max-w-6xl\" }\nconst _hoisted_3 = { class: \"flex flex-col justify-between mt-8 mb-6 ml-6 sm:flex-row sm:items-center\" }\nconst _hoisted_4 = { class: \"text-3xl\" }\nconst _hoisted_5 = { key: 0 }\nconst _hoisted_6 = { key: 1 }\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"button\", {\n type: \"button\",\n class: \"inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2\"\n}, \"All DNS records\", -1)\nconst _hoisted_8 = { class: \"bg-white shadow p-6 pb-10 rounded-t\" }\nconst _hoisted_9 = {\n key: 1,\n \"aria-hidden\": \"true\"\n}\nconst _hoisted_10 = { class: \"mb-3\" }\nconst _hoisted_11 = {\n key: 0,\n class: \"mt-4\"\n}\nconst _hoisted_12 = { class: \"font-semibold\" }\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl clear-right\" }, \"Question and response\", -1)\nconst _hoisted_14 = { class: \"flex flex-col gap-6 lg:flex-row\" }\nconst _hoisted_15 = { class: \"min-w-0\" }\nconst _hoisted_16 = { class: \"min-w-0\" }\nconst _hoisted_17 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"Find the IP addresses for another website or domain name\", -1)\nconst _hoisted_18 = { class: \"flex flex-col lg:flex-row\" }\nconst _hoisted_19 = { class: \"shrink max-w-xl\" }\nconst _hoisted_20 = {\n class: \"mt-3 w-[500px] max-w-full sm:px-6 lg:mt-0\",\n autocomplete: \"off\"\n}\n\nimport { ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport axios, { Canceler } from 'axios';\nimport { domainNameToDisplayName, domainNameToUrlPath, urlPathToDomainName } from '@/common/domainName';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport Alert from '@/components/micro/AlertComponent.vue';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport RawRecords from '@/components/micro/RawRecords.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport SkeletonComponent from '@/components/micro/SkeletonComponent.vue';\nimport { ApiErrorType, toErrorType } from '@/model/ApiErrorAlert';\nimport ApiErrorAlert from '@/components/ApiErrorAlert.vue';\nimport IpAddresses from '@/components/records/IpAddresses.vue';\nimport {\n QueryResult, WebserversResponse, emptyDnsServer, emptyResponse,\n} from '@/model/Api';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { WebsiteToIpResultsTop, WebsiteToIpResultsSide, WebsiteToIpResultsBottom } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'WebsiteToIpLookupResults',\n props: {\n routerDomain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst router = useRouter();\n\nconst domain = ref('');\nconst domainPunycode = ref('');\nconst loading = ref(true);\nconst error = ref(null);\nconst showSidebar = ref(window.innerWidth > 991);\nconst cancelToken = ref(null);\nconst queryResultA = ref({\n query: {\n server: emptyDnsServer,\n domain: domain.value,\n recordType: 'A',\n },\n response: emptyResponse,\n});\nconst queryResultAaaa = ref({\n query: {\n server: emptyDnsServer,\n domain: domain.value,\n recordType: 'AAAA',\n },\n response: emptyResponse,\n});\n\nfunction redirectTo(newDomain: string): void {\n router.push(`/domains/${domainNameToUrlPath(newDomain)}/webservers/`);\n}\n\nfunction load() {\n loading.value = true;\n error.value = null;\n\n if (cancelToken.value) {\n cancelToken.value();\n }\n const axiosSource = axios.CancelToken.source();\n cancelToken.value = axiosSource.cancel;\n\n axios\n .post('api/v1/webservers', {\n domain: domain.value,\n }, {\n cancelToken: axiosSource.token,\n })\n .then((response) => {\n if (props.routerDomain !== domainNameToUrlPath(response.data.punycodeDomain)) {\n router.replace({\n path: `/domains/${domainNameToUrlPath(response.data.punycodeDomain)}/webservers/`,\n });\n }\n domain.value = domainNameToDisplayName(response.data.unicodeDomain);\n domainPunycode.value = domainNameToDisplayName(response.data.punycodeDomain);\n queryResultA.value = response.data.a;\n queryResultAaaa.value = response.data.aaaa;\n loading.value = false;\n })\n .catch((e) => {\n if (!axios.isCancel(e)) {\n error.value = toErrorType(e.response.data.error);\n }\n });\n}\n\nwatch(() => props.routerDomain, () => {\n const domainName = urlPathToDomainName(props.routerDomain);\n domain.value = domainName;\n domainPunycode.value = domainName;\n load();\n}, {\n immediate: true,\n});\n\nwindow.addEventListener('resize', () => {\n showSidebar.value = window.innerWidth > 991;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: `IP addresses used by ${domain.value}`,\n description: `These are the IPv4 and IPv6 addresses for ${domain.value}, according to the authoritative DNS server.`,\n url: `https://www.nslookup.io/domains/${domainPunycode.value}/webservers/`\n }, null, 8, [\"title\", \"description\", \"url\"])\n ])),\n _createVNode(HeaderComponent, {\n domain: domain.value,\n \"domain-search-to-url\": (encodedDomain) => `/domains/${encodedDomain}/webservers/`,\n \"search-button-text\": \"Find IP addresses\"\n }, null, 8, [\"domain\", \"domain-search-to-url\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createVNode(AdUnit, {\n class: \"mx-auto\",\n config: _unref(WebsiteToIpResultsTop)\n }, null, 8, [\"config\"]),\n _createElementVNode(\"div\", _hoisted_3, [\n _createElementVNode(\"h1\", _hoisted_4, [\n _createTextVNode(\"IP addresses for \"),\n (domain.value === domainPunycode.value)\n ? (_openBlock(), _createElementBlock(\"b\", _hoisted_5, _toDisplayString(domain.value), 1))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_6, [\n _createElementVNode(\"b\", null, _toDisplayString(domainPunycode.value), 1),\n _createTextVNode(\" (\" + _toDisplayString(domain.value) + \")\", 1)\n ]))\n ]),\n _createVNode(DnsRecordsLink, {\n domain: domain.value,\n class: \"shrink-0 hidden mr-6 sm:block xl:mr-0\"\n }, {\n default: _withCtx(() => [\n _hoisted_7\n ]),\n _: 1\n }, 8, [\"domain\"])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(AdUnit, {\n class: \"float-right ml-6\",\n config: _unref(WebsiteToIpResultsSide)\n }, null, 8, [\"config\"]),\n (error.value !== null)\n ? (_openBlock(), _createBlock(ApiErrorAlert, {\n key: 0,\n error: error.value,\n domain: domain.value,\n dnsserver: \"authoritative\"\n }, null, 8, [\"error\", \"domain\"]))\n : (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/2 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64)),\n _createVNode(SkeletonComponent, { class: \"inline-block w-56 h-8 my-6\" }),\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: n }, [\n _createVNode(SkeletonComponent, { class: \"w-24 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-2 block\" }),\n _createVNode(SkeletonComponent, { class: \"w-1/2 h-4 mb-6\" })\n ], 64))\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createElementVNode(\"p\", _hoisted_10, \"Our DNS servers responded with these IP addresses when we queried it for the domain \" + _toDisplayString(domain.value) + \". Some DNS servers may return different IP addresses based on your location.\", 1),\n (queryResultA.value.response.answer.length === 0 && queryResultAaaa.value.response.answer.length === 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [\n _createVNode(Alert, { type: \"warning\" }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", null, [\n _createElementVNode(\"span\", _hoisted_12, _toDisplayString(domain.value), 1),\n _createTextVNode(\" does not have any IP addresses.\")\n ])\n ]),\n _: 1\n })\n ]))\n : (_openBlock(), _createBlock(IpAddresses, {\n key: 1,\n \"a-records\": queryResultA.value,\n \"aaaa-records\": queryResultAaaa.value\n }, null, 8, [\"a-records\", \"aaaa-records\"])),\n _hoisted_13,\n _createElementVNode(\"div\", _hoisted_14, [\n _createElementVNode(\"div\", _hoisted_15, [\n _createVNode(RawRecords, { records: queryResultA.value }, null, 8, [\"records\"])\n ]),\n _createElementVNode(\"div\", _hoisted_16, [\n _createVNode(RawRecords, { records: queryResultAaaa.value }, null, 8, [\"records\"])\n ])\n ])\n ], 64)),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(WebsiteToIpResultsBottom)\n }, null, 8, [\"config\"]),\n _hoisted_17,\n _createElementVNode(\"div\", _hoisted_18, [\n _createElementVNode(\"p\", _hoisted_19, [\n _createTextVNode(\"With \"),\n _createVNode(_component_router_link, {\n to: \"/website-to-ip-lookup/\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"website to IP lookup\")\n ]),\n _: 1\n }),\n _createTextVNode(\", you can find the IP addresses for any domain name or subdomain. When you enter the domain in the input field below, it will show whether or not IP addresses are configured for that domain.\")\n ]),\n _createElementVNode(\"form\", _hoisted_20, [\n _createVNode(DomainSearch, {\n \"placeholder-text\": \"Domain name\",\n emphasize: \"\",\n buttonText: \"Find IP addresses\",\n prefill: domain.value,\n onSubmitted: redirectTo\n }, null, 8, [\"prefill\"])\n ])\n ])\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./WebsiteToIpLookupResults.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./WebsiteToIpLookupResults.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, createTextVNode as _createTextVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, Teleport as _Teleport, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, unref as _unref, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"span\", { \"data-ccpa-link\": \"1\" }, null, -1)\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"h1\", { class: \"text-3xl mt-14\" }, \"Dns lookup\", -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Online nslookup is a web based DNS client that queries DNS records for a given domain name. It allows you to view all the DNS records for a website. It provides the same information as command line tools like dig and nslookup, from the convenience of your web browser.\", -1)\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Nslookup.io does not cache the DNS responses it shows, but the DNS servers that are queried usually do respond with a cached record set. Except for authoritative DNS servers. They never serve cached DNS records.\", -1)\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"How does online nslookup work?\", -1)\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Using nslookup online is very simple. Enter a domain name in the search bar above and hit 'enter'. This will take you to an overview of DNS records for the domain name you specified. Behind the scenes, NsLookup.io will query a DNS server for DNS records without caching the results.\", -1)\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"Supported DNS record types\", -1)\nconst _hoisted_8 = /*#__PURE__*/_createElementVNode(\"a\", {\n href: \"https://en.wikipedia.org/wiki/List_of_DNS_record_types#Obsolete_record_types\",\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n}, \"obsolete record types\", -1)\nconst _hoisted_9 = { class: \"ml-2 list-disc list-inside\" }\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"h2\", null, \"Use cases for online DNS lookup\", -1)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"p\", null, \"There are many situations where online nslookup can be a useful tool. For example, when you are configuring the DNS records of your own domain, you might want to check whether you have configured them correctly. You can do this by entering the domain name at the top of this page.\", -1)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Whenever you change DNS records, it takes a while for it to propagate through the entire domain name system. This takes time because DNS servers cache records in order to speed up DNS resolution. So whenever you change DNS records, you can check whether they have propagated yet by doing a DNS lookup.\", -1)\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"p\", null, \"There are of course more use cases for online nslookup, instead of using a CLI. Those include being able to share the results with a colleague or friend, and the ability to see multiple record types at the same time, without querying multiple times.\", -1)\n\nimport { recordTypes } from '@/common/recordTypes';\nimport DnsRecordsLink from '@/components/micro/DnsRecordsLink.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport SearchWithHiddenContentPage from '@/components/pages/SearchWithHiddenContentPage.vue';\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'HomeView',\n setup(__props) {\n\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: \"DNS Lookup\",\n description: \"Find all DNS records for a domain name with this online tool. Nslookup shows A, AAAA, CNAME, TXT, MX, SPF, NS, SOA and more.\",\n url: \"https://www.nslookup.io/\",\n img1024x512: \"https://www.nslookup.io/img/social-1024x512.png\",\n img1200x630: \"https://www.nslookup.io/img/social-1200x630.png\"\n }),\n (_openBlock(), _createBlock(_resolveDynamicComponent('script'), { type: \"application/ld+json\" }, {\n default: _withCtx(() => [\n _createTextVNode(\" { \\\"@context\\\": \\\"https://schema.org\\\", \\\"@type\\\": \\\"WebSite\\\", \\\"url\\\": \\\"https://www.nslookup.io/\\\", \\\"potentialAction\\\": { \\\"@type\\\": \\\"SearchAction\\\", \\\"target\\\": \\\"https://www.nslookup.io/domains/{search_term_string}/dns-records/\\\", \\\"query-input\\\": \\\"required name=search_term_string\\\" } } \")\n ]),\n _: 1\n }))\n ])),\n _createVNode(SearchWithHiddenContentPage, {\n domainSearchToUrl: (domain) => `/domains/${domain}/dns-records/`\n }, {\n \"search-explanation\": _withCtx(() => [\n _hoisted_1,\n _createTextVNode(\" Find all DNS records for a domain name using this online tool. For example, try \"),\n _createVNode(DnsRecordsLink, {\n domain: \"wikipedia.org\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" or \"),\n _createVNode(DnsRecordsLink, {\n domain: \"www.twitter.com\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }),\n _createTextVNode(\" to view their DNS records. \")\n ]),\n content: _withCtx(() => [\n _hoisted_2,\n _hoisted_3,\n _hoisted_4,\n _hoisted_5,\n _hoisted_6,\n _createElementVNode(\"p\", null, [\n _createTextVNode(\"You can select from a range of DNS servers on the result page. These include popular public DNS servers, the authoritative DNS server for the given domain, and local DNS servers all around the world. By default, only \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/a/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"A\")\n ]),\n _: 1\n }),\n _createTextVNode(\", \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/aaaa/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"AAAA\")\n ]),\n _: 1\n }),\n _createTextVNode(\", \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/cname/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"CNAME\")\n ]),\n _: 1\n }),\n _createTextVNode(\", \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/txt/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"TXT\")\n ]),\n _: 1\n }),\n _createTextVNode(\", \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/ns/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"NS\")\n ]),\n _: 1\n }),\n _createTextVNode(\", \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/mx/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"MX\")\n ]),\n _: 1\n }),\n _createTextVNode(\" and \"),\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/soa/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"SOA\")\n ]),\n _: 1\n }),\n _createTextVNode(\" records are shown, but you can select additional record types. \")\n ]),\n _hoisted_7,\n _createElementVNode(\"p\", null, [\n _createVNode(_component_router_link, { to: \"/learning/dns-record-types/\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"DNS has many record types\")\n ]),\n _: 1\n }),\n _createTextVNode(\" that each serve a distinct purpose. However, some of these record types are no longer in use. Wikipedia has a list of \"),\n _hoisted_8,\n _createTextVNode(\". These obsolete types are not supported by nslookup.io. All the DNS record types that are known to be in active use are supported by nslookup:\")\n ]),\n _createElementVNode(\"ul\", _hoisted_9, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(recordTypes), (otherRecordType, index) => {\n return (_openBlock(), _createElementBlock(\"li\", { key: index }, [\n _createVNode(_component_router_link, {\n to: `/${otherRecordType.lower}-lookup/`\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(otherRecordType.upper) + \" lookup\", 1)\n ]),\n _: 2\n }, 1032, [\"to\"]),\n _createTextVNode(\" — \" + _toDisplayString(otherRecordType.description), 1)\n ]))\n }), 128))\n ]),\n _hoisted_10,\n _hoisted_11,\n _hoisted_12,\n _hoisted_13\n ]),\n _: 1\n }, 8, [\"domainSearchToUrl\"])\n ], 64))\n}\n}\n\n})","import script from \"./HomeView.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HomeView.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, isRef as _isRef, withCtx as _withCtx, createVNode as _createVNode, renderSlot as _renderSlot, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"text-sm font-medium text-gray-900 w-full\" }\n\nimport { useStore } from 'vuex';\nimport { computed } from 'vue';\nimport { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'ToggleRawOutput',\n setup(__props) {\n\nconst store = useStore();\nconst showRawOutput = computed({\n get() {\n return store.state.showRawOutput;\n },\n set() {\n store.commit('toggleRawOutput');\n },\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createBlock(_unref(SwitchGroup), {\n as: \"div\",\n class: \"flex items-center\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(Switch), {\n modelValue: _unref(showRawOutput),\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => (_isRef(showRawOutput) ? (showRawOutput).value = $event : null)),\n class: _normalizeClass([_unref(showRawOutput) ? 'bg-indigo-600' : 'bg-gray-200', 'relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2'])\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", {\n \"aria-hidden\": \"true\",\n class: _normalizeClass([_unref(showRawOutput) ? 'translate-x-5' : 'translate-x-0', 'pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out'])\n }, null, 2)\n ]),\n _: 1\n }, 8, [\"modelValue\", \"class\"]),\n _createVNode(_unref(SwitchLabel), {\n as: \"span\",\n class: \"ml-3 w-full\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"span\", _hoisted_1, [\n _renderSlot(_ctx.$slots, \"default\")\n ])\n ]),\n _: 3\n })\n ]),\n _: 3\n }))\n}\n}\n\n})","import script from \"./ToggleRawOutput.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ToggleRawOutput.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, unref as _unref, renderList as _renderList, Fragment as _Fragment, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx, Transition as _Transition } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex-grow bg-neutral-100\" }\nconst _hoisted_2 = { class: \"container mx-auto max-w-6xl\" }\nconst _hoisted_3 = { class: \"text-3xl mt-8 ml-6\" }\nconst _hoisted_4 = { key: 0 }\nconst _hoisted_5 = { key: 1 }\nconst _hoisted_6 = {\n key: 0,\n class: \"inline-block mt-1 ml-6 text-gray-600 font-medium text-sm hover:text-indigo-600\",\n href: \"https://usersearch.org/landing/index.html\",\n rel: \"noopener\"\n}\nconst _hoisted_7 = { class: \"sticky z-10 mt-6 top-0 bg-neutral-100\" }\nconst _hoisted_8 = {\n class: \"pl-6 flex gap-7 items-center md:gap-8\",\n \"aria-label\": \"Tabs\"\n}\nconst _hoisted_9 = { class: \"py-1\" }\nconst _hoisted_10 = {\n href: \"https://controld.com/?cid=nslookup\",\n target: \"_blank\",\n rel: \"noopener nereferrer\"\n}\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"inline sm:hidden\" }, \"Other\", -1)\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"hidden sm:inline\" }, \"Local DNS\", -1)\nconst _hoisted_13 = { class: \"py-1\" }\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"block px-4 mt-2 text-sm font-semibold text-gray-500 sm:hidden\" }, \"Global\", -1)\nconst _hoisted_15 = { class: \"block px-4 mt-2 text-sm font-semibold text-gray-500\" }\nconst _hoisted_16 = { class: \"grow\" }\nconst _hoisted_17 = { class: \"bg-white shadow p-6 pb-10 rounded-t\" }\nconst _hoisted_18 = { key: 0 }\nconst _hoisted_19 = { key: 1 }\nconst _hoisted_20 = { class: \"mb-2\" }\nconst _hoisted_21 = { class: \"mt-2\" }\nconst _hoisted_22 = { key: 0 }\nconst _hoisted_23 = { key: 1 }\nconst _hoisted_24 = { key: 2 }\nconst _hoisted_25 = { key: 3 }\nconst _hoisted_26 = { key: 4 }\nconst _hoisted_27 = { key: 5 }\nconst _hoisted_28 = /*#__PURE__*/_createElementVNode(\"a\", {\n href: \"https://controld.com/free-dns?cid=nslookup\",\n class: \"text-blue-600 hover:text-blue-800 hover:underline\",\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n}, \"Configure this server on your device.\", -1)\nconst _hoisted_29 = { key: 3 }\nconst _hoisted_30 = { class: \"flex gap-6\" }\nconst _hoisted_31 = {\n key: 0,\n class: \"shrink w-full lg:max-w-2xl\"\n}\nconst _hoisted_32 = {\n key: 1,\n class: \"shrink w-full lg:max-w-2xl\"\n}\nconst _hoisted_33 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"A records\", -1)\nconst _hoisted_34 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"AAAA records\", -1)\nconst _hoisted_35 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"CNAME record\", -1)\nconst _hoisted_36 = {\n key: 2,\n class: \"grow w-[330px] mt-10 hidden lg:block\"\n}\nconst _hoisted_37 = {\n key: 4,\n \"aria-hidden\": \"true\",\n class: \"mb-8\"\n}\nconst _hoisted_38 = { key: 5 }\nconst _hoisted_39 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"TXT records\", -1)\nconst _hoisted_40 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"NS records\", -1)\nconst _hoisted_41 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"MX records\", -1)\nconst _hoisted_42 = {\n key: 6,\n \"aria-hidden\": \"true\",\n class: \"mt-6 mb-8\"\n}\nconst _hoisted_43 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-4 font-semibold text-2xl inline-block\" }, \"Other records\", -1)\nconst _hoisted_44 = { class: \"relative\" }\nconst _hoisted_45 = {\n key: 8,\n \"aria-hidden\": \"true\",\n class: \"mt-6 mb-8\"\n}\nconst _hoisted_46 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"mt-8 mb-2 font-semibold text-2xl\" }, \"Look up DNS records for another domain name\", -1)\nconst _hoisted_47 = { class: \"flex flex-col lg:flex-row\" }\nconst _hoisted_48 = { class: \"shrink max-w-xl\" }\nconst _hoisted_49 = {\n class: \"mt-3 w-[500px] max-w-full sm:px-6 lg:mt-0\",\n autocomplete: \"off\"\n}\n\nimport { computed, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport axios, { Canceler } from 'axios';\nimport {\n Combobox,\n ComboboxButton,\n ComboboxInput,\n ComboboxLabel,\n ComboboxOption,\n ComboboxOptions,\n Menu,\n MenuButton,\n MenuItem,\n MenuItems,\n} from '@headlessui/vue';\nimport {\n CheckIcon,\n ChevronUpDownIcon,\n ChevronDownIcon,\n ArrowTopRightOnSquareIcon,\n} from '@heroicons/vue/20/solid';\nimport { Cog6ToothIcon } from '@heroicons/vue/24/outline';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport DnsRecords from '@/components/records/DnsRecords.vue';\nimport IpDnsRecords from '@/components/records/IpDnsRecords.vue';\nimport SoaRecords from '@/components/records/SoaRecords.vue';\nimport TxtRecords from '@/components/records/TxtRecords.vue';\nimport MxRecords from '@/components/records/MxRecords.vue';\nimport ToggleRawOutput from '@/components/ToggleRawOutput.vue';\nimport NsRecords from '@/components/records/NsRecords.vue';\nimport MetaTags from '@/components/MetaTags.vue';\nimport CaaRecords from '@/components/records/CaaRecords.vue';\nimport PtrRecords from '@/components/records/PtrRecords.vue';\nimport SrvRecords from '@/components/records/SrvRecords.vue';\nimport TlsaRecords from '@/components/records/TlsaRecords.vue';\nimport { domainNameToDisplayName, domainNameToUrlPath, urlPathToDomainName } from '@/common/domainName';\nimport SkeletonComponent from '@/components/micro/SkeletonComponent.vue';\nimport DomainSearch from '@/components/DomainSearch.vue';\nimport { ApiErrorType, toErrorType } from '@/model/ApiErrorAlert';\nimport ApiErrorAlert from '@/components/ApiErrorAlert.vue';\nimport { dnsServers } from '@/common/dnsServers';\nimport {\n GetRecordsResponse, PopularRecords, QueryResult, emptyPopularRecords, emptyQueryResult,\n} from '@/model/Api';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport { DnsRecordsOther, DnsRecordsSidebar, DnsRecordsTxt } from '@/common/adSlots';\nimport { showUsersearchAd } from '@/common/dateTime';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DnsRecordsResults',\n props: {\n routerDomain: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst tabs = [\n { name: 'cloudflare', display: 'Cloudflare' },\n { name: 'google', display: 'Google DNS' },\n { name: 'authoritative', display: 'Authoritative' },\n];\nconst controlDQueryTargest = [\n { name: 'controldunfiltered', display: 'Unfiltered' },\n { name: 'controldmalware', display: 'Malware' },\n { name: 'controldadstracking', display: 'Ads & Tracking' },\n { name: 'controldsocial', display: 'Social' },\n { name: 'controldfamilyfriendly', display: 'Family Friendly' },\n];\nconst localQueryTargets = {\n Africa: [\n { name: 'southafrica', display: 'South Africa' },\n ],\n Australia: [\n { name: 'australia', display: 'Australia' },\n ],\n Asia: [\n { name: 'india', display: 'India' },\n { name: 'russia', display: 'Russia' },\n ],\n Europe: [\n { name: 'thenetherlands', display: 'The Netherlands' },\n { name: 'ukraine', display: 'Ukraine' },\n ],\n 'North America': [\n { name: 'canada', display: 'Canada' },\n { name: 'usa', display: 'United States of America' },\n ],\n 'South America': [\n { name: 'brazil', display: 'Brazil' },\n ],\n};\n\nconst otherRecordType = ref('SOA');\nconst otherRecordTypes = ['AFSDB', 'APL', 'CAA', 'CDNSKEY', 'CDS', 'CERT', 'CSYNC', 'DHCID', 'DLV', 'DNAME', 'DNSKEY', 'DS', 'HINFO', 'HIP', 'IPSECKEY', 'IXFR', 'KEY', 'KX', 'LOC', 'NAPTR', 'NSEC', 'NSEC3', 'NSEC3PARAM', 'OPENPGPKEY', 'OPT', 'PTR', 'RP', 'RRSIG', 'SIG', 'SMIMEA', 'SOA', 'SRV', 'SSHFP', 'TA', 'TKEY', 'TLSA', 'TSIG', 'URI', 'ZONEMD'];\nconst otherRecordTypeQuery = ref('SOA');\nconst filteredOtherRecordTypes = computed(() => (otherRecordTypeQuery.value === ''\n ? otherRecordTypes\n : otherRecordTypes.filter((item) => item.toLowerCase().includes(otherRecordTypeQuery.value.toLowerCase()))));\n\nconst domain = ref('');\nconst domainPunycode = ref('');\nconst dnsserver = ref(route.hash.substring(1));\nconst loadingOther = ref(true);\nconst loading = ref(true);\nconst error = ref(null);\nconst showSidebar = ref(window.innerWidth > 991);\nconst cancelToken = ref(null);\nconst cancelTokenOtherRecords = ref(null);\nconst records = ref(emptyPopularRecords);\nconst otherRecords = ref(emptyQueryResult);\n\nfunction isCurrentTab(tab: string) {\n if (tab === 'local') {\n return Object.values(localQueryTargets).some((queryTargets) => queryTargets.some((target) => target.name === dnsserver.value));\n }\n if (tab === 'controld') {\n return Object.values(controlDQueryTargest).some((target) => target.name === dnsserver.value);\n }\n return tab === dnsserver.value;\n}\n\nfunction loadOtherRecord(): void {\n loadingOther.value = true;\n otherRecords.value = emptyQueryResult;\n\n // Cancel any previous request\n if (cancelTokenOtherRecords.value) {\n cancelTokenOtherRecords.value();\n }\n const axiosSource = axios.CancelToken.source();\n cancelTokenOtherRecords.value = axiosSource.cancel;\n\n axios.post('api/v1/other-records', {\n domain: domain.value,\n dnsServer: dnsserver.value,\n recordType: otherRecordType.value,\n }, {\n cancelToken: axiosSource.token,\n })\n .then((response) => {\n otherRecords.value = response.data.queryResult;\n loadingOther.value = false;\n })\n .catch((e) => {\n if (!axios.isCancel(e)) {\n console.log(e.message);\n }\n });\n}\n\nfunction load() {\n if (dnsserver.value === '') {\n dnsserver.value = 'cloudflare';\n }\n loading.value = true;\n error.value = null;\n records.value = emptyPopularRecords;\n\n if (cancelToken.value) {\n cancelToken.value();\n }\n const axiosSource = axios.CancelToken.source();\n cancelToken.value = axiosSource.cancel;\n\n axios.post('api/v1/records', {\n domain: domain.value,\n dnsServer: dnsserver.value,\n }, {\n cancelToken: axiosSource.token,\n })\n .then((response) => {\n if (props.routerDomain !== domainNameToUrlPath(response.data.punycodeDomain)) {\n router.replace({\n path: `/domains/${domainNameToUrlPath(response.data.punycodeDomain)}/dns-records/`,\n hash: route.hash,\n });\n }\n domain.value = domainNameToDisplayName(response.data.unicodeDomain);\n domainPunycode.value = domainNameToDisplayName(response.data.punycodeDomain);\n records.value = response.data.records;\n if (otherRecordType.value === 'SOA') {\n loadingOther.value = false;\n }\n loading.value = false;\n })\n .catch((e) => {\n if (!axios.isCancel(e)) {\n error.value = toErrorType(e.response.data.error);\n }\n });\n\n if (otherRecordType.value === 'SOA') {\n loadingOther.value = true;\n } else {\n loadOtherRecord();\n }\n}\n\nfunction redirectTo(newDomain: string): void {\n router.push(`/domains/${domainNameToUrlPath(newDomain)}/dns-records/`);\n}\n\nwatch(() => otherRecordType.value, () => loadOtherRecord());\n\nwatch(() => props.routerDomain, () => {\n const domainName = urlPathToDomainName(props.routerDomain);\n domain.value = domainName;\n domainPunycode.value = domainName;\n load();\n}, {\n immediate: true,\n});\n\nwatch(() => route.hash, () => {\n if (route.name !== 'Dns records') {\n return; // Prevent loading DNS records when moving to another page\n }\n\n dnsserver.value = route.hash.substring(1);\n load();\n});\n\nwindow.addEventListener('resize', () => {\n showSidebar.value = window.innerWidth > 991;\n});\n\nreturn (_ctx: any,_cache: any) => {\n const _component_router_link = _resolveComponent(\"router-link\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_Teleport, { to: \"head\" }, [\n _createVNode(MetaTags, {\n title: `DNS records for ${domain.value}`,\n description: `These are the uncached A, AAAA, CNAME, TXT, NS, MX and SOA records for ${domain.value}. Other DNS records are also available.`,\n url: `https://www.nslookup.io/domains/${domainPunycode.value}/dns-records/`\n }, null, 8, [\"title\", \"description\", \"url\"])\n ])),\n _createVNode(HeaderComponent, { domain: domain.value }, null, 8, [\"domain\"]),\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"main\", _hoisted_2, [\n _createElementVNode(\"h1\", _hoisted_3, [\n _createTextVNode(\"DNS records for \"),\n (domain.value === domainPunycode.value)\n ? (_openBlock(), _createElementBlock(\"b\", _hoisted_4, _toDisplayString(domain.value), 1))\n : (_openBlock(), _createElementBlock(\"span\", _hoisted_5, [\n _createElementVNode(\"b\", null, _toDisplayString(domainPunycode.value), 1),\n _createTextVNode(\" (\" + _toDisplayString(domain.value) + \")\", 1)\n ]))\n ]),\n (_unref(showUsersearchAd)())\n ? (_openBlock(), _createElementBlock(\"a\", _hoisted_6, \"Find domains by this owner\"))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", _hoisted_7, [\n _createElementVNode(\"nav\", _hoisted_8, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(tabs, (tab) => {\n return _createVNode(_component_router_link, {\n key: tab.name,\n to: `#${tab.name}`,\n \"aria-current\": isCurrentTab(tab.name) ? 'page' : undefined,\n class: _normalizeClass([isCurrentTab(tab.name) ? 'border-indigo-500 text-indigo-600' : 'border-transparent text-gray-600 hover:text-gray-700 hover:border-gray-300',\n ['google', 'opendns', 'authoritative'].includes(tab.name) ? 'hidden sm:inline' : '',\n 'whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm'])\n }, {\n default: _withCtx(() => [\n _createTextVNode(_toDisplayString(tab.display), 1)\n ]),\n _: 2\n }, 1032, [\"to\", \"aria-current\", \"class\"])\n }), 64)),\n _createVNode(_unref(Menu), {\n as: \"div\",\n class: \"hidden sm:inline-block relative text-left\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", null, [\n _createVNode(_unref(MenuButton), {\n class: _normalizeClass([\n isCurrentTab('controld') ? 'border-indigo-500 text-indigo-600' : 'border-transparent text-gray-600 hover:text-gray-700 hover:border-gray-300',\n 'inline-flex w-full justify-center whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm focus:outline-transparent',\n ])\n }, {\n default: _withCtx(() => [\n _createTextVNode(\" Control D \"),\n _createVNode(_unref(ChevronDownIcon), {\n class: \"-mr-1 ml-2 h-5 w-5\",\n \"aria-hidden\": \"true\"\n })\n ]),\n _: 1\n }, 8, [\"class\"])\n ]),\n _createVNode(_Transition, {\n \"enter-active-class\": \"transition ease-out duration-100\",\n \"enter-from-class\": \"transform opacity-0 scale-95\",\n \"enter-to-class\": \"transform opacity-100 scale-100\",\n \"leave-active-class\": \"transition ease-in duration-75\",\n \"leave-from-class\": \"transform opacity-100 scale-100\",\n \"leave-to-class\": \"transform opacity-0 scale-95\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItems), { class: \"absolute -right-16 z-10 mt-2 w-44 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:right-0\" }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_9, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(controlDQueryTargest, (queryTarget) => {\n return _createVNode(_component_router_link, {\n key: queryTarget.name,\n to: `#${queryTarget.name}`\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItem), null, {\n default: _withCtx(({ active }) => [\n _createElementVNode(\"span\", {\n class: _normalizeClass([active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', isCurrentTab(queryTarget.name) ? '!text-indigo-600 font-medium' : '', 'block pl-6 pr-4 py-2 text-sm'])\n }, _toDisplayString(queryTarget.display), 3)\n ]),\n _: 2\n }, 1024)\n ]),\n _: 2\n }, 1032, [\"to\"])\n }), 64)),\n _createElementVNode(\"a\", _hoisted_10, [\n _createVNode(_unref(MenuItem), null, {\n default: _withCtx(({ active }) => [\n _createElementVNode(\"span\", {\n class: _normalizeClass([active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'flex justify-between pl-6 pr-4 py-2 text-sm'])\n }, [\n _createTextVNode(\" Custom \"),\n _createVNode(_unref(ArrowTopRightOnSquareIcon), { class: \"w-4 float-right\" })\n ], 2)\n ]),\n _: 1\n })\n ])\n ])\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ]),\n _: 1\n }),\n _createVNode(_unref(Menu), {\n as: \"div\",\n class: \"relative inline-block text-left\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", null, [\n _createVNode(_unref(MenuButton), {\n class: _normalizeClass([\n isCurrentTab('cloudflare') ? 'border-transparent text-gray-600 hover:text-gray-700 hover:border-gray-300' : 'border-indigo-500 text-indigo-600',\n !isCurrentTab('cloudflare') && !isCurrentTab('local') ? 'sm:border-transparent sm:text-gray-600 sm:hover:text-gray-700 sm:hover:border-gray-300' : '',\n 'inline-flex w-full justify-center whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm focus:outline-transparent',\n ])\n }, {\n default: _withCtx(() => [\n _hoisted_11,\n _hoisted_12,\n _createVNode(_unref(ChevronDownIcon), {\n class: \"-mr-1 ml-2 h-5 w-5\",\n \"aria-hidden\": \"true\"\n })\n ]),\n _: 1\n }, 8, [\"class\"])\n ]),\n _createVNode(_Transition, {\n \"enter-active-class\": \"transition ease-out duration-100\",\n \"enter-from-class\": \"transform opacity-0 scale-95\",\n \"enter-to-class\": \"transform opacity-100 scale-100\",\n \"leave-active-class\": \"transition ease-in duration-75\",\n \"leave-from-class\": \"transform opacity-100 scale-100\",\n \"leave-to-class\": \"transform opacity-0 scale-95\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItems), { class: \"absolute -right-16 z-10 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:right-0\" }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_13, [\n _hoisted_14,\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(tabs.slice(1), (queryTarget) => {\n return (_openBlock(), _createBlock(_component_router_link, {\n key: queryTarget.name,\n to: `#${queryTarget.name}`,\n class: \"block sm:hidden\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItem), null, {\n default: _withCtx(({ active }) => [\n _createElementVNode(\"span\", {\n class: _normalizeClass([active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', isCurrentTab(queryTarget.name) ? '!text-indigo-600 font-medium' : '', 'block pl-6 pr-4 py-2 text-sm'])\n }, _toDisplayString(queryTarget.display), 3)\n ]),\n _: 2\n }, 1024)\n ]),\n _: 2\n }, 1032, [\"to\"]))\n }), 128)),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(localQueryTargets, (queryTargets, name) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: name }, [\n _createElementVNode(\"span\", _hoisted_15, _toDisplayString(name), 1),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(queryTargets, (queryTarget) => {\n return (_openBlock(), _createBlock(_component_router_link, {\n key: queryTarget.name,\n to: `#${queryTarget.name}`\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItem), null, {\n default: _withCtx(({ active }) => [\n _createElementVNode(\"span\", {\n class: _normalizeClass([active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', isCurrentTab(queryTarget.name) ? '!text-indigo-600 font-medium' : '', 'block pl-6 pr-4 py-2 text-sm'])\n }, _toDisplayString(queryTarget.display), 3)\n ]),\n _: 2\n }, 1024)\n ]),\n _: 2\n }, 1032, [\"to\"]))\n }), 128))\n ], 64))\n }), 64))\n ])\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ]),\n _: 1\n }),\n _createElementVNode(\"div\", _hoisted_16, [\n _createVNode(_unref(Menu), {\n as: \"div\",\n class: \"ml-auto w-6 mr-4 flex\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuButton), null, {\n default: _withCtx(() => [\n _createVNode(_unref(Cog6ToothIcon), {\n class: \"h-6 w-6 text-gray-600\",\n \"aria-hidden\": \"true\"\n })\n ]),\n _: 1\n }),\n _createVNode(_Transition, {\n \"enter-active-class\": \"transition ease-out duration-100\",\n \"enter-from-class\": \"transform opacity-0 scale-95\",\n \"enter-to-class\": \"transform opacity-100 scale-100\",\n \"leave-active-class\": \"transition ease-in duration-75\",\n \"leave-from-class\": \"transform opacity-100 scale-100\",\n \"leave-to-class\": \"transform opacity-0 scale-95\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(MenuItems), { class: \"absolute right-12 top-3 z-10 p-3 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none\" }, {\n default: _withCtx(() => [\n _createVNode(ToggleRawOutput, null, {\n default: _withCtx(() => [\n _createTextVNode(\"Show raw data\")\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ]),\n _: 1\n })\n ])\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_17, [\n (error.value !== null)\n ? (_openBlock(), _createBlock(ApiErrorAlert, {\n key: 0,\n error: error.value,\n domain: domain.value,\n dnsserver: dnsserver.value\n }, null, 8, [\"error\", \"domain\", \"dnsserver\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n (_unref(dnsServers)[dnsserver.value].type === 'local')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_18, \"A local DNS server in \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" responded with these DNS records. It will serve these records for as long as the time to live (TTL) has not expired. After this period, the DNS server will update its cache by querying one of the authoritative name servers.\", 1))\n : (_unref(dnsServers)[dnsserver.value].type === 'popular')\n ? (_openBlock(), _createElementBlock(\"p\", _hoisted_19, \"The \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" DNS server responded with these DNS records. \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" will serve these records for as long as the time to live (TTL) has not expired. After this period, \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" will update its cache by querying one of the authoritative name servers.\", 1))\n : (_unref(dnsServers)[dnsserver.value].type === 'control d')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createElementVNode(\"p\", _hoisted_20, \"The \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" DNS server responded with these DNS records. \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" will serve these records for as long as the time to live (TTL) has not expired. After this period, \" + _toDisplayString(_unref(dnsServers)[dnsserver.value].pretty) + \" will update its cache by querying one of the authoritative name servers.\", 1),\n _createElementVNode(\"p\", _hoisted_21, [\n (dnsserver.value == 'controldunfiltered')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_22, \"This DNS server does not filter requests. \"))\n : (dnsserver.value == 'controldmalware')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_23, \"This DNS server filters malware. \"))\n : (dnsserver.value == 'controldadstracking')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_24, \"This DNS server filters ads and trackers. \"))\n : (dnsserver.value == 'controldsocial')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_25, \"This DNS server filters social media. \"))\n : (dnsserver.value == 'controldfamilyfriendly')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_26, \"This DNS server filters adult and drugs related sites. \"))\n : (dnsserver.value == 'controlduncesored')\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_27, \"This DNS server restores access to censored sites. \"))\n : _createCommentVNode(\"\", true),\n _hoisted_28\n ])\n ], 64))\n : (_openBlock(), _createElementBlock(\"p\", _hoisted_29, \"The authoritative DNS server responded with these DNS records. It has indicated that records should be cached for the period specified by the time to live (TTL). When the configuration of the authoritative DNS server changes, it will immediately serve the updated DNS records.\")),\n _createElementVNode(\"div\", _hoisted_30, [\n (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6 mt-8\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(2, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/2 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64))\n ])\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [\n _hoisted_33,\n _createVNode(IpDnsRecords, {\n records: records.value.a,\n \"column-title\": \"IPv4 address\",\n \"record-type\": \"A\"\n }, null, 8, [\"records\"]),\n _hoisted_34,\n _createVNode(IpDnsRecords, {\n records: records.value.aaaa,\n \"column-title\": \"IPv6 address\",\n \"record-type\": \"AAAA\"\n }, null, 8, [\"records\"]),\n _hoisted_35,\n _createVNode(DnsRecords, {\n records: records.value.cname,\n \"column-title\": \"Canonical name\",\n \"record-type\": \"CNAME\",\n \"is-domain\": true,\n \"can-have-multiple-records\": false,\n class: \"w-full\"\n }, null, 8, [\"records\"])\n ])),\n (showSidebar.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [\n _createVNode(AdUnit, {\n class: \"!sticky top-16 mx-auto\",\n config: _unref(DnsRecordsSidebar)\n }, null, 8, [\"config\"])\n ]))\n : _createCommentVNode(\"\", true)\n ]),\n (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_37, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6 mt-8\" }),\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/3 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64))\n ])\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(\"div\", _hoisted_38, [\n _hoisted_39,\n _createVNode(TxtRecords, {\n records: records.value.txt,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(DnsRecordsTxt)\n }, null, 8, [\"config\"]),\n _hoisted_40,\n _createVNode(NsRecords, {\n records: records.value.ns,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]),\n _hoisted_41,\n _createVNode(MxRecords, {\n records: records.value.mx,\n class: \"w-full\"\n }, null, 8, [\"records\"])\n ])),\n (loading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_42, [\n _createVNode(SkeletonComponent, { class: \"w-56 h-8 mb-6 mt-8\" })\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _hoisted_43,\n _createVNode(_unref(Combobox), {\n as: \"div\",\n modelValue: otherRecordType.value,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((otherRecordType).value = $event)),\n class: \"mb-3 sm:mb-0 sm:mt-8 sm:ml-10 sm:inline-block\"\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(ComboboxLabel), { class: \"sr-only\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"Additional record type\")\n ]),\n _: 1\n }),\n _createElementVNode(\"div\", _hoisted_44, [\n _createVNode(_unref(ComboboxInput), {\n onChange: _cache[0] || (_cache[0] = ($event: any) => (otherRecordTypeQuery.value = $event.target.value)),\n onFocus: _cache[1] || (_cache[1] = ($event: any) => (otherRecordTypeQuery.value = '')),\n class: \"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-10 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\"\n }),\n _createVNode(_unref(ComboboxButton), { class: \"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\" }, {\n default: _withCtx(() => [\n _createVNode(_unref(ChevronUpDownIcon), {\n class: \"h-5 w-5 text-gray-400\",\n \"aria-hidden\": \"true\"\n })\n ]),\n _: 1\n }),\n (_unref(filteredOtherRecordTypes).length > 0)\n ? (_openBlock(), _createBlock(_unref(ComboboxOptions), {\n key: 0,\n class: \"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\"\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(filteredOtherRecordTypes), (person) => {\n return (_openBlock(), _createBlock(_unref(ComboboxOption), {\n key: person,\n value: person,\n as: \"template\"\n }, {\n default: _withCtx(({ active, selected }) => [\n _createElementVNode(\"li\", {\n class: _normalizeClass(['relative cursor-default select-none py-2 pl-3 pr-9', active ? 'bg-indigo-600 text-white' : 'text-gray-900'])\n }, [\n _createElementVNode(\"span\", {\n class: _normalizeClass(['block truncate', selected && 'font-semibold'])\n }, _toDisplayString(person), 3),\n selected\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n class: _normalizeClass(['absolute inset-y-0 right-0 flex items-center pr-4', active ? 'text-white' : 'text-indigo-600'])\n }, [\n _createVNode(_unref(CheckIcon), {\n class: \"h-5 w-5\",\n \"aria-hidden\": \"true\"\n })\n ], 2))\n : _createCommentVNode(\"\", true)\n ], 2)\n ]),\n _: 2\n }, 1032, [\"value\"]))\n }), 128))\n ]),\n _: 1\n }))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"])\n ], 64)),\n (loading.value || loadingOther.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return _createElementVNode(\"div\", { key: n }, [\n (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (n) => {\n return _createVNode(SkeletonComponent, {\n key: n,\n class: \"inline-block w-1/3 h-4 pr-[10%] bg-clip-content\"\n })\n }), 64))\n ])\n }), 64))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 9 }, [\n (otherRecordType.value === 'SOA')\n ? (_openBlock(), _createBlock(SoaRecords, {\n key: 0,\n records: records.value.soa,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]))\n : (otherRecordType.value === 'CAA')\n ? (_openBlock(), _createBlock(CaaRecords, {\n key: 1,\n records: otherRecords.value,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]))\n : (otherRecordType.value === 'PTR')\n ? (_openBlock(), _createBlock(PtrRecords, {\n key: 2,\n records: otherRecords.value,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]))\n : (otherRecordType.value === 'SRV')\n ? (_openBlock(), _createBlock(SrvRecords, {\n key: 3,\n records: otherRecords.value,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]))\n : (otherRecordType.value === 'TLSA')\n ? (_openBlock(), _createBlock(TlsaRecords, {\n key: 4,\n records: otherRecords.value,\n domain: domain.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"domain\"]))\n : (_openBlock(), _createBlock(DnsRecords, {\n key: 5,\n records: otherRecords.value,\n \"column-title\": \"Data\",\n \"record-type\": otherRecordType.value,\n class: \"w-full\"\n }, null, 8, [\"records\", \"record-type\"]))\n ], 64)),\n _createVNode(AdUnit, {\n class: \"mt-8 mx-auto\",\n config: _unref(DnsRecordsOther)\n }, null, 8, [\"config\"]),\n _hoisted_46,\n _createElementVNode(\"div\", _hoisted_47, [\n _createElementVNode(\"p\", _hoisted_48, [\n _createTextVNode(\"With \"),\n _createVNode(_component_router_link, {\n to: `/`,\n class: \"text-blue-600 hover:text-blue-800 hover:underline\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"DNS lookup\")\n ]),\n _: 1\n }),\n _createTextVNode(\", you can find the DNS record for any domain name or subdomain. When you enter the domain, it will show all the DNS records that are configured for that domain.\")\n ]),\n _createElementVNode(\"form\", _hoisted_49, [\n _createVNode(DomainSearch, {\n emphasize: \"\",\n prefill: domain.value,\n onSubmitted: redirectTo\n }, null, 8, [\"prefill\"])\n ])\n ])\n ], 64))\n ])\n ])\n ]),\n _createVNode(FooterComponent)\n ], 64))\n}\n}\n\n})","import script from \"./DnsRecordsResults.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DnsRecordsResults.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { RR } from '@/model/Api';\nimport { DnsPropagationAnswer } from '@/model/PropagationEndpoint';\n\nexport interface Variant {\n records: Array;\n answers: Array;\n isAuthoritative: boolean;\n}\n\nfunction rrEquals(a: RR, b: RR): boolean {\n return a.raw === b.raw && a.name === b.name && a.recordType === b.recordType;\n}\n\nfunction responseEquals(a: Array, b: Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n const remaining = [...b];\n return a.every((element) => {\n const index = remaining.findIndex((rr) => rrEquals(rr, element));\n if (index === -1) {\n return false;\n }\n remaining.splice(index, 1);\n return true;\n });\n}\n\nexport function addResponse(\n variants: Array,\n answer: DnsPropagationAnswer,\n recordType: string,\n): Array {\n const records = answer.answer.filter((rr) => rr.recordType === recordType);\n const index = variants.findIndex((variant) => responseEquals(variant.records, records));\n if (index === -1) {\n return [...variants, { records, answers: [answer], isAuthoritative: answer.queryTarget === 'Authoritative' }];\n }\n\n const newVariants = [...variants];\n newVariants[index].answers.push(answer);\n if (answer.queryTarget === 'Authoritative') {\n newVariants[index].isAuthoritative = true;\n }\n return variants;\n}\n\nexport function getVariantName(index: number): string {\n return String.fromCharCode(65 + index);\n}\n\nexport function getVariant(variants: Array, answer: DnsPropagationAnswer): string {\n const index = variants.findIndex((variant) => variant.answers.includes(answer));\n if (index === -1) {\n return '';\n }\n return getVariantName(index);\n}\n","import { DnsServer, RR } from './Api';\n\nconst regionalQueryTargets = ['SouthAfrica', 'TheNetherlands', 'Australia', 'India', 'Canada', 'USA', 'Brazil', 'Ukraine', 'Russia'];\nconst globalQueryTargets = ['CloudFlare', 'Google', 'OpenDns', 'Quad9', 'CleanBrowsing', 'AdGuard', 'NextDNS', 'ControlDUnfiltered', 'UltimateHostsBlacklist'];\nexport type RegionalQueryTarget = 'SouthAfrica' | 'TheNetherlands' | 'Australia' | 'India' | 'Canada' | 'USA' | 'Brazil' | 'Ukraine' | 'Russia';\nexport type GlobalQueryTarget = 'CloudFlare' | 'Google' | 'OpenDns' | 'Quad9' | 'CleanBrowsing' | 'AdGuard' | 'NextDNS' | 'ControlDUnfiltered' | 'UltimateHostsBlacklist';\nexport type QueryTarget = 'Authoritative' | RegionalQueryTarget | GlobalQueryTarget;\n\nexport function isRegionalQueryTarget(qt: QueryTarget): qt is RegionalQueryTarget {\n return regionalQueryTargets.includes(qt);\n}\n\nexport function isGlobalQueryTarget(qt: QueryTarget): qt is GlobalQueryTarget {\n return globalQueryTargets.includes(qt);\n}\n\nexport type QueryLocation = 'Amsterdam' | 'SanFransisco';\n\nexport type DnsPropagationAnswer = {\n queryLocation: QueryLocation;\n queryTarget: QueryTarget;\n server: DnsServer;\n answer: Array;\n}\n\nexport type DnsPropagationError = {\n Left: {\n queryTarget: QueryTarget;\n server: string;\n };\n}\n\nexport type DnsPropagationSuccess = {\n Right: DnsPropagationAnswer;\n}\n\nexport type DnsPropagationResult = DnsPropagationSuccess | DnsPropagationError;\n","import {\n DnsPropagationAnswer, GlobalQueryTarget, isGlobalQueryTarget, RegionalQueryTarget,\n} from '@/model/PropagationEndpoint';\n\nexport type DnsOrganization = 'CloudFlare' | 'Google' | 'OpenDns' | 'Quad9' | 'CleanBrowsing' | 'AdGuard' | 'NextDNS' | 'ControlDUnfiltered' | 'UltimateHostsBlacklist' |\n 'AWS' | 'Godaddy' | 'Akamai' | 'Enom' | 'DnsMadeEasy' | 'NS1' | 'Wordpress' | 'Dreamhost' | 'Namecheap' | 'Gandi' | 'Linode' |\n 'DNSimple' | 'Siteground' | 'DigitalOcean' | 'DynDNS' | 'Azure' | 'OVH' | 'IONOS' | 'Siteground' | 'Bluehost' | 'Wix' | 'Hover' |\n 'Verisign' | 'ICB' | 'Afilias' | 'UniversityOfSouthernCalifornia' | 'Cogent' | 'UniversityOfMaryland' | 'NASA' | 'ISC' |\n 'UsDepartmentOfDefense' | 'UsArmy' | 'Netnod' | 'RIPE' | 'ICANN' | 'WideProject' | 'NetworkSolutions' | 'Register' | 'Squarespace' |\n 'HostGator' | 'ClouDNS' | 'NameBright' | 'ArubaIt' | 'NameCom' | 'InMotion' | 'A2Hosting' | 'OneCom' | 'Ezoic' | 'Unknown';\nexport type Country = 'SouthAfrica' | 'TheNetherlands' | 'Australia' | 'India' | 'Canada' | 'USA' | 'Brazil' | 'Ukraine' | 'Russia';\nexport type HostingEntity = DnsOrganization | Country;\n\nconst knownDnsServerSuffixes: Array<{ suffix: string, organization: DnsOrganization}> = [\n { suffix: '.cloudflare.com.', organization: 'CloudFlare' },\n { suffix: '.domaincontrol.com.', organization: 'Godaddy' },\n { suffix: '.akam.net.', organization: 'Akamai' },\n { suffix: '.googledomains.com.', organization: 'Google' },\n { suffix: '.name-services.com.', organization: 'Enom' },\n { suffix: '.dnsmadeeasy.com.', organization: 'DnsMadeEasy' },\n { suffix: '.nsone.net.', organization: 'NS1' },\n { suffix: '.wordpress.com.', organization: 'Wordpress' },\n { suffix: '.wordpress.org.', organization: 'Wordpress' },\n { suffix: '.dreamhost.com.', organization: 'Dreamhost' },\n { suffix: '.registrar-servers.com.', organization: 'Namecheap' },\n { suffix: '.namecheaphosting.com.', organization: 'Namecheap' },\n { suffix: '.gandi.net.', organization: 'Gandi' },\n { suffix: '.linode.com.', organization: 'Linode' },\n { suffix: '.dnsimple.com.', organization: 'DNSimple' },\n { suffix: '.siteground.com.', organization: 'Siteground' },\n { suffix: '.siteground.net.', organization: 'Siteground' },\n { suffix: '.digitalocean.com.', organization: 'DigitalOcean' },\n { suffix: '.dynect.net.', organization: 'DynDNS' },\n { suffix: '.dyn.com.', organization: 'DynDNS' },\n { suffix: '.azure-dns.com.', organization: 'Azure' },\n { suffix: '.azure-dns.org.', organization: 'Azure' },\n { suffix: '.azure-dns.net.', organization: 'Azure' },\n { suffix: '.azure-dns.info.', organization: 'Azure' },\n { suffix: '.ovh.net.', organization: 'OVH' },\n { suffix: '.ui-dns.de.', organization: 'IONOS' },\n { suffix: '.ui-dns.org.', organization: 'IONOS' },\n { suffix: '.ui-dns.biz.', organization: 'IONOS' },\n { suffix: '.ui-dns.com.', organization: 'IONOS' },\n { suffix: '.bluehost.com.', organization: 'Bluehost' },\n { suffix: '.wixdns.net.', organization: 'Wix' },\n { suffix: '.hover.com.', organization: 'Hover' },\n { suffix: '.worldnic.com.', organization: 'NetworkSolutions' },\n { suffix: '.register.com.', organization: 'Register' },\n { suffix: '.squarespacedns.com.', organization: 'Squarespace' },\n { suffix: '.hostgator.com.', organization: 'HostGator' },\n { suffix: '.cloudns.net.', organization: 'ClouDNS' },\n { suffix: '.namebrightdns.com.', organization: 'NameBright' },\n { suffix: '.technorail.com.', organization: 'ArubaIt' },\n { suffix: '.arubadns.net.', organization: 'ArubaIt' },\n { suffix: '.arubadns.cz.', organization: 'ArubaIt' },\n { suffix: '.name.com.', organization: 'NameCom' },\n { suffix: '.inmotionhosting.com.', organization: 'InMotion' },\n { suffix: '.a2hosting.com.', organization: 'A2Hosting' },\n { suffix: '.one.com.', organization: 'OneCom' },\n { suffix: '.ezoicns.com.', organization: 'Ezoic' },\n { suffix: '.gtld-servers.net.', organization: 'Verisign' },\n { suffix: '.nic.io.', organization: 'ICB' },\n { suffix: '.nic.ac.', organization: 'ICB' },\n { suffix: '.nic.sh.', organization: 'ICB' },\n { suffix: '.afilias-nst.info.', organization: 'Afilias' },\n { suffix: '.afilias-nst.org.', organization: 'Afilias' },\n { suffix: 'a.root-servers.net.', organization: 'Verisign' },\n { suffix: 'b.root-servers.net.', organization: 'UniversityOfSouthernCalifornia' },\n { suffix: 'c.root-servers.net.', organization: 'Cogent' },\n { suffix: 'd.root-servers.net.', organization: 'UniversityOfMaryland' },\n { suffix: 'e.root-servers.net.', organization: 'NASA' },\n { suffix: 'f.root-servers.net.', organization: 'ISC' },\n { suffix: 'g.root-servers.net.', organization: 'UsDepartmentOfDefense' },\n { suffix: 'h.root-servers.net.', organization: 'UsArmy' },\n { suffix: 'i.root-servers.net.', organization: 'Netnod' },\n { suffix: 'j.root-servers.net.', organization: 'Verisign' },\n { suffix: 'k.root-servers.net.', organization: 'RIPE' },\n { suffix: 'l.root-servers.net.', organization: 'ICANN' },\n { suffix: 'm.root-servers.net.', organization: 'WideProject' },\n];\n\nexport function displayHostingEntity(entity: HostingEntity): string {\n switch (entity) {\n case 'CloudFlare':\n return 'Cloudflare';\n case 'Google':\n return 'Google DNS';\n case 'OpenDns':\n return 'Open DNS';\n case 'Quad9':\n return 'Quad 9';\n case 'AWS':\n return 'Amazon Web Services';\n case 'ControlDUnfiltered':\n return 'Control D';\n case 'UltimateHostsBlacklist':\n return 'Ultimate Hosts Blacklist';\n case 'Godaddy':\n return 'GoDaddy';\n case 'DnsMadeEasy':\n return 'DNS Made Easy';\n case 'DynDNS':\n return 'Oracle Cloud (DynDNS)';\n case 'Azure':\n return 'Microsoft Azure';\n case 'NetworkSolutions':\n return 'Network Solutions';\n case 'Register':\n return 'Register.com';\n case 'ArubaIt':\n return 'Aruba.it';\n case 'NameCom':\n return 'Name.com';\n case 'InMotion':\n return 'InMotion Hosting';\n case 'A2Hosting':\n return 'A2 Hosting';\n case 'OneCom':\n return 'One.com';\n case 'SouthAfrica':\n return 'South Africa';\n case 'TheNetherlands':\n return 'The Netherlands';\n case 'USA':\n return 'United States of Amarica';\n case 'UniversityOfSouthernCalifornia':\n return 'University of Southern California';\n case 'Cogent':\n return 'Cogent Communications';\n case 'UniversityOfMaryland':\n return 'University of Maryland';\n case 'UsDepartmentOfDefense':\n return 'US Department of Defense';\n case 'UsArmy':\n return 'US Army';\n case 'WideProject':\n return 'Wide Project';\n default:\n return entity;\n }\n}\n\nfunction toDnsOrganization(dnsServerDomainName: string | null): DnsOrganization {\n if (dnsServerDomainName) {\n const org = knownDnsServerSuffixes.find((suffix) => dnsServerDomainName.endsWith(suffix.suffix))?.organization;\n if (org) {\n return org;\n }\n if (dnsServerDomainName.includes('.awsdns-')) {\n return 'AWS';\n }\n }\n return 'Unknown';\n}\n\nexport function organizationIconSrc(org: DnsOrganization): string {\n if (org === 'Unknown') {\n return 'img/flags/1x1/xx.svg';\n }\n return `/img/logos/${org.toLowerCase()}.png`;\n}\n\nexport function flagIconSrc(country: Country, square = false): string {\n switch (country) {\n case 'SouthAfrica':\n return `img/flags/${square ? '1x1' : '4x3'}/za.svg`;\n case 'TheNetherlands':\n return `img/flags/${square ? '1x1' : '4x3'}/nl.svg`;\n case 'Australia':\n return `img/flags/${square ? '1x1' : '4x3'}/au.svg`;\n case 'India':\n return `img/flags/${square ? '1x1' : '4x3'}/in.svg`;\n case 'Canada':\n return `img/flags/${square ? '1x1' : '4x3'}/ca.svg`;\n case 'USA':\n return `img/flags/${square ? '1x1' : '4x3'}/us.svg`;\n case 'Brazil':\n return `img/flags/${square ? '1x1' : '4x3'}/br.svg`;\n case 'Ukraine':\n return `img/flags/${square ? '1x1' : '4x3'}/ua.svg`;\n case 'Russia':\n return `img/flags/${square ? '1x1' : '4x3'}/ru.svg`;\n default:\n return `img/flags/${square ? '1x1' : '4x3'}/xx.svg`;\n }\n}\n\nfunction globalQueryTargetToOrganization(qt: GlobalQueryTarget): DnsOrganization {\n return qt;\n}\n\nfunction regionalQueryTargetToCountry(qt: RegionalQueryTarget): Country {\n return qt;\n}\n\nexport function iconSrc(answer: DnsPropagationAnswer): string {\n if (answer.queryTarget === 'Authoritative') {\n return organizationIconSrc(toDnsOrganization(answer.server.domain));\n }\n if (isGlobalQueryTarget(answer.queryTarget)) {\n return organizationIconSrc(globalQueryTargetToOrganization(answer.queryTarget));\n }\n return flagIconSrc(answer.queryTarget, true);\n}\n\nexport function iconAlt(answer: DnsPropagationAnswer): string {\n if (answer.queryTarget === 'Authoritative') {\n const org = displayHostingEntity(toDnsOrganization(answer.server.domain));\n if (org === 'Unknown') {\n return `Authoritative server ${answer.server.domain}` || '';\n }\n return `Authoritative server ${answer.server.domain} (by ${org})`;\n }\n if (isGlobalQueryTarget(answer.queryTarget)) {\n return `${answer.server.ip} (by ${displayHostingEntity(globalQueryTargetToOrganization(answer.queryTarget))})`;\n }\n return displayHostingEntity(regionalQueryTargetToCountry(answer.queryTarget));\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, isRef as _isRef } from \"vue\"\n\nconst _hoisted_1 = { class: \"relative\" }\n\nimport { ref, computed } from 'vue';\nimport {\n Combobox,\n ComboboxButton,\n ComboboxInput,\n ComboboxLabel,\n ComboboxOption,\n ComboboxOptions,\n} from '@headlessui/vue';\nimport { CheckIcon, ChevronUpDownIcon } from '@heroicons/vue/20/solid';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'RecordTypePicker',\n props: {\n modelValue: {\n type: String,\n default: '',\n },\n},\n emits: ['update:modelValue'],\n setup(__props, { emit }) {\n\nconst props = __props;\n\n\n\n\n\nconst value = computed({\n get() {\n return props.modelValue;\n },\n set(newValue) {\n emit('update:modelValue', newValue);\n },\n});\n\nconst recordTypes = ['A', 'AAAA', 'AFSDB', 'APL', 'CAA', 'CDNSKEY', 'CDS', 'CERT', 'CNAME', 'CSYNC', 'DHCID', 'DLV', 'DNAME', 'DNSKEY', 'DS', 'HINFO', 'HIP', 'IPSECKEY', 'IXFR', 'KEY', 'KX', 'LOC', 'MX', 'NAPTR', 'NS', 'NSEC', 'NSEC3', 'NSEC3PARAM', 'OPENPGPKEY', 'OPT', 'PTR', 'RP', 'RRSIG', 'SIG', 'SMIMEA', 'SOA', 'SRV', 'SSHFP', 'TA', 'TKEY', 'TLSA', 'TSIG', 'TXT', 'URI', 'ZONEMD'];\nconst recordTypeQuery = ref(props.modelValue);\nconst filteredRecordTypes = computed(() => (recordTypeQuery.value === ''\n ? recordTypes\n : recordTypes.filter((item) => item.toLowerCase().includes(recordTypeQuery.value.toLowerCase()))));\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createBlock(_unref(Combobox), {\n as: \"div\",\n class: \"inline-block\",\n modelValue: _unref(value),\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => (_isRef(value) ? (value).value = $event : null))\n }, {\n default: _withCtx(() => [\n _createVNode(_unref(ComboboxLabel), { class: \"block text-sm font-medium text-gray-600\" }, {\n default: _withCtx(() => [\n _createTextVNode(\"Record type\")\n ]),\n _: 1\n }),\n _createElementVNode(\"div\", _hoisted_1, [\n _createVNode(_unref(ComboboxInput), {\n onChange: _cache[0] || (_cache[0] = ($event: any) => (recordTypeQuery.value = $event.target.value)),\n onFocus: _cache[1] || (_cache[1] = ($event: any) => (recordTypeQuery.value = '')),\n class: \"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-10 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\"\n }),\n _createVNode(_unref(ComboboxButton), { class: \"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\" }, {\n default: _withCtx(() => [\n _createVNode(_unref(ChevronUpDownIcon), {\n class: \"h-5 w-5 text-gray-400\",\n \"aria-hidden\": \"true\"\n })\n ]),\n _: 1\n }),\n (_unref(filteredRecordTypes).length > 0)\n ? (_openBlock(), _createBlock(_unref(ComboboxOptions), {\n key: 0,\n class: \"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\"\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(filteredRecordTypes), (person) => {\n return (_openBlock(), _createBlock(_unref(ComboboxOption), {\n key: person,\n value: person,\n as: \"template\"\n }, {\n default: _withCtx(({ active, selected }) => [\n _createElementVNode(\"li\", {\n class: _normalizeClass(['relative cursor-default select-none py-2 pl-3 pr-9', active ? 'bg-indigo-600 text-white' : 'text-gray-900'])\n }, [\n _createElementVNode(\"span\", {\n class: _normalizeClass(['block truncate', selected && 'font-semibold'])\n }, _toDisplayString(person), 3),\n selected\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n class: _normalizeClass(['absolute inset-y-0 right-0 flex items-center pr-4', active ? 'text-white' : 'text-indigo-600'])\n }, [\n _createVNode(_unref(CheckIcon), {\n class: \"h-5 w-5\",\n \"aria-hidden\": \"true\"\n })\n ], 2))\n : _createCommentVNode(\"\", true)\n ], 2)\n ]),\n _: 2\n }, 1032, [\"value\"]))\n }), 128))\n ]),\n _: 1\n }))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"]))\n}\n}\n\n})","import script from \"./RecordTypePicker.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RecordTypePicker.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, unref as _unref, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"inline-block min-w-full align-middle\" }\nconst _hoisted_2 = { class: \"overflow-hidden shadow ring-1 ring-black ring-opacity-5 md:rounded-lg\" }\nconst _hoisted_3 = { class: \"min-w-full divide-y divide-gray-300\" }\nconst _hoisted_4 = { class: \"bg-gray-50\" }\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6\"\n}, \"DNS server\", -1)\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"th\", {\n scope: \"col\",\n class: \"px-3 py-3.5 text-left text-sm font-semibold text-gray-900\"\n}, \"TTL\", -1)\nconst _hoisted_7 = {\n scope: \"col\",\n class: \"px-3 py-3.5 text-center text-sm font-semibold text-gray-900\"\n}\nconst _hoisted_8 = { class: \"divide-y divide-gray-200 bg-white\" }\nconst _hoisted_9 = { class: \"py-2 pl-4 pr-3 text-sm sm:pl-6\" }\nconst _hoisted_10 = { class: \"h-10 flex items-center\" }\nconst _hoisted_11 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_12 = { class: \"ml-4\" }\nconst _hoisted_13 = { class: \"break-words font-medium text-gray-900\" }\nconst _hoisted_14 = { class: \"break-all text-gray-500\" }\nconst _hoisted_15 = { class: \"break-words px-3 py-2 text-sm text-gray-500\" }\nconst _hoisted_16 = { class: \"text-gray-900\" }\nconst _hoisted_17 = { class: \"whitespace-nowrap px-3 py-2 text-lg text-gray-500 font-medium text-center\" }\n\nimport { computed, PropType } from 'vue';\nimport { CheckCircleIcon } from '@heroicons/vue/20/solid';\nimport Duration from '@/components/micro/DurationComponent.vue';\n\nexport interface PropagationServerListItem {\n firstLine: string;\n secondLine: string;\n ttl: number | null;\n // null = not yet checked; true = only one variant; string = multiple variants\n variant: string | true | null;\n iconSrc: string;\n iconAlt: string;\n iconShape: 'circle' | '4x3';\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'PropagationServerList',\n props: {\n items: {\n type: Array as PropType>,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst hasVariants = computed(() => props.items.some((item) => item.variant !== true && item.variant !== null));\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"div\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"table\", _hoisted_3, [\n _createElementVNode(\"thead\", _hoisted_4, [\n _createElementVNode(\"tr\", null, [\n _hoisted_5,\n _hoisted_6,\n _createElementVNode(\"th\", _hoisted_7, _toDisplayString(_unref(hasVariants) ? 'Variant' : 'Response'), 1)\n ])\n ]),\n _createElementVNode(\"tbody\", _hoisted_8, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(props.items, (item) => {\n return (_openBlock(), _createElementBlock(\"tr\", {\n key: item.firstLine\n }, [\n _createElementVNode(\"td\", _hoisted_9, [\n _createElementVNode(\"div\", _hoisted_10, [\n _createElementVNode(\"div\", {\n class: _normalizeClass([item.iconShape === 'circle' ? 'h-6 w-6 rounded-full' : 'h-[1.125rem] w-6', \"flex-shrink-0\"])\n }, [\n _createElementVNode(\"img\", {\n class: _normalizeClass(item.iconShape === 'circle' ? 'h-6 w-6 rounded-full' : 'h-[1.125rem] w-6'),\n src: item.iconSrc,\n alt: item.iconAlt,\n title: item.iconAlt\n }, null, 10, _hoisted_11)\n ], 2),\n _createElementVNode(\"div\", _hoisted_12, [\n _createElementVNode(\"div\", _hoisted_13, _toDisplayString(item.firstLine), 1),\n _createElementVNode(\"div\", _hoisted_14, _toDisplayString(item.secondLine), 1)\n ])\n ])\n ]),\n _createElementVNode(\"td\", _hoisted_15, [\n _createElementVNode(\"div\", _hoisted_16, [\n (item.ttl)\n ? (_openBlock(), _createBlock(Duration, {\n key: 0,\n seconds: item.ttl\n }, null, 8, [\"seconds\"]))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _createElementVNode(\"td\", _hoisted_17, [\n (item.variant === true)\n ? (_openBlock(), _createBlock(_unref(CheckCircleIcon), {\n key: 0,\n class: \"h-6 w-6 text-green-500 mx-auto\",\n \"aria-hidden\": \"true\"\n }))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createTextVNode(_toDisplayString(item.variant), 1)\n ], 64))\n ])\n ]))\n }), 128))\n ])\n ])\n ])\n ])\n ]))\n}\n}\n\n})","import script from \"./PropagationServerList.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PropagationServerList.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","// eslint-disable-next-line @typescript-eslint/ban-types\nexport default function debounce(cb: T, wait = 20) {\n let h = 0;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const callable = (...args: any) => {\n clearTimeout(h);\n h = setTimeout(() => cb(...args), wait);\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (callable);\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"src\"]\n\nimport {\n PropType, watch, ref,\n} from 'vue';\nimport debounce from '@/common/debounce';\n\nexport interface Marker {\n lat: number;\n lon: number;\n variant: string | true | null;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'PropagationMap',\n props: {\n markers: {\n type: Array as PropType>,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst markers = ref('');\n\nconst debouncedUpdateMarkers = debounce(() => {\n markers.value = props.markers.map((marker) => `&m=${marker.lat},${marker.lon},osm_bright,f87171${marker.variant === true ? ',,' : `,${marker.variant},fff`}`).join();\n}, 100);\n\nwatch(() => props.markers, () => {\n if (props.markers.length === 8) {\n // Don't wait 100ms if we have all the markers\n markers.value = props.markers.map((marker) => `&m=${marker.lat},${marker.lon},osm_bright,f87171${marker.variant === true ? ',,' : `,${marker.variant},fff`}`).join();\n } else {\n debouncedUpdateMarkers();\n }\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(\"img\", {\n src: `https://stadiamaps.com/static/outdoors?api_key=23fe682b-ac7c-4f2b-83db-39dcf2a8b9ac¢er=27,10&zoom=0${markers.value}&size=512x265@2x`,\n alt: \"World map\"\n }, null, 8, _hoisted_1))\n}\n}\n\n})","import script from \"./PropagationMap.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PropagationMap.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, unref as _unref, createCommentVNode as _createCommentVNode, Fragment as _Fragment, createElementBlock as _createElementBlock, renderList as _renderList } from \"vue\"\n\nconst _hoisted_1 = { class: \"flex-grow bg-[#f5f5f5]\" }\nconst _hoisted_2 = { class: \"container mx-auto px-4 pt-6 pb-14 sm:px-6 lg:px-8\" }\nconst _hoisted_3 = { class: \"flex flex-row flex-wrap justify-between mt-8 mb-6 gap-3 md:items-center\" }\nconst _hoisted_4 = { class: \"w-full lg:w-auto\" }\nconst _hoisted_5 = { class: \"text-3xl tracking-tight font-medium text-gray-900\" }\nconst _hoisted_6 = { class: \"grid grid-cols-1 gap-6 md:grid-cols-2 xl:grid-cols-3 clear-both\" }\nconst _hoisted_7 = { class: \"mb-6 col-span-2\" }\nconst _hoisted_8 = { class: \"prose\" }\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"p\", null, \"Their responses are grouped, so you can easily see which DNS servers are returning the same records.\", -1)\nconst _hoisted_10 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_11 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_12 = { class: \"grid grid-cols-1 gap-6 md:grid-cols-2 xl:grid-cols-3 clear-both\" }\nconst _hoisted_13 = { class: \"px-4 py-5 sm:px-6 bg-gray-50\" }\nconst _hoisted_14 = { class: \"-ml-4 -mt-4 flex flex-wrap items-center justify-between sm:flex-nowrap\" }\nconst _hoisted_15 = { class: \"ml-4 mt-4\" }\nconst _hoisted_16 = { class: \"flex items-center space-x-3\" }\nconst _hoisted_17 = { class: \"text-lg font-medium leading-6 text-gray-900\" }\nconst _hoisted_18 = {\n key: 0,\n class: \"inline-block flex-shrink-0 rounded-full bg-green-100 ml-2 px-2 py-0.5 text-xs font-medium text-green-800\"\n}\nconst _hoisted_19 = { class: \"mt-1 text-sm text-gray-500\" }\nconst _hoisted_20 = { class: \"ml-4 mt-4 flex-shrink-0\" }\nconst _hoisted_21 = { class: \"flex -space-x-2\" }\nconst _hoisted_22 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_23 = { class: \"inline-flex h-8 w-8 items-center justify-center rounded-full bg-gray-500\" }\nconst _hoisted_24 = { class: \"text-sm font-medium leading-none text-white\" }\nconst _hoisted_25 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_26 = {\n key: 0,\n class: \"flex-grow font-mono overflow-x-auto px-4 py-5 sm:px-6\"\n}\nconst _hoisted_27 = {\n key: 1,\n class: \"flex-grow px-4 py-5 sm:px-6\"\n}\nconst _hoisted_28 = { class: \"grid grid-cols-1 gap-6 lg:grid-cols-2 xl:grid-cols-3\" }\nconst _hoisted_29 = { class: \"col-span-1\" }\nconst _hoisted_30 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"pt-12 text-xl font-semibold text-gray-900\" }, \"Authoritative DNS servers\", -1)\nconst _hoisted_31 = { class: \"mt-2 pb-3 text-sm text-gray-700\" }\nconst _hoisted_32 = { class: \"col-span-1\" }\nconst _hoisted_33 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"pt-12 text-xl font-semibold text-gray-900\" }, \"Global DNS networks\", -1)\nconst _hoisted_34 = { class: \"mt-2 pb-3 text-sm text-gray-700\" }\nconst _hoisted_35 = { class: \"col-span-1 lg:col-span-2 xl:col-span-1\" }\nconst _hoisted_36 = /*#__PURE__*/_createElementVNode(\"h2\", { class: \"pt-12 text-xl font-semibold text-gray-900\" }, \"Regional DNS servers\", -1)\nconst _hoisted_37 = /*#__PURE__*/_createElementVNode(\"p\", { class: \"mt-2 pb-3 text-sm text-gray-700\" }, \"These servers may cache DNS records.\", -1)\n\nimport { computed, ref, watch } from 'vue';\nimport router from '@/router';\nimport {\n addResponse, getVariant, getVariantName, Variant,\n} from '@/common/propagationVariant';\nimport {\n flagIconSrc, organizationIconSrc, displayHostingEntity, iconSrc, iconAlt,\n} from '@/common/hostingEntity';\nimport MetaTags from '@/components/MetaTags.vue';\nimport FooterComponent from '@/components/layout/FooterComponent.vue';\nimport HeaderComponent from '@/components/layout/HeaderComponent.vue';\nimport RecordTypePicker from '@/components/RecordTypePicker.vue';\nimport PropagationServerList, { PropagationServerListItem } from '@/components/dns-propagation/PropagationServerList.vue';\nimport {\n DnsPropagationAnswer, DnsPropagationResult, GlobalQueryTarget, isGlobalQueryTarget, RegionalQueryTarget,\n} from '@/model/PropagationEndpoint';\nimport PropagationMap from '@/components/dns-propagation/PropagationMap.vue';\nimport AlertComponent from '@/components/micro/AlertComponent.vue';\nimport DurationComponent from '@/components/micro/DurationComponent.vue';\nimport { DnsServer } from '@/model/Api';\nimport AdUnit from '@/components/ads/AdUnit.vue';\nimport {\n Billboard, LargeLeaderboard, LargeRectangle, Leaderboard, MediumRectangle,\n} from '@/common/adSizes';\nimport { PropagationTop, PropagationMid, PropagationBottom } from '@/common/adSlots';\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DnsPropagationResults',\n props: {\n routerDomain: {\n type: String,\n required: true,\n },\n routerRecordType: {\n type: String,\n required: true,\n },\n},\n setup(__props) {\n\nconst props = __props;\n\n\n\nconst organizationList: Array = ['CloudFlare', 'Google', 'Quad9', 'OpenDns', 'CleanBrowsing', 'AdGuard', 'NextDNS', 'ControlDUnfiltered', 'UltimateHostsBlacklist'];\nconst countryList: Array = ['SouthAfrica', 'TheNetherlands', 'Australia', 'India', 'USA', 'Brazil', 'Ukraine', 'Russia', 'Canada'];\n\nconst domain = ref('');\nconst domainPunycode = ref('');\nconst loading = ref(true);\n\nconst recordType = ref(props.routerRecordType.toUpperCase());\n\nconst globalResponses = ref