Index: node_modules/ip-address/LICENSE
===================================================================
--- node_modules/ip-address/LICENSE	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/LICENSE	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,19 @@
+Copyright (C) 2011 by Beau Gunderson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: node_modules/ip-address/README.md
===================================================================
--- node_modules/ip-address/README.md	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/README.md	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,105 @@
+[![CircleCI](https://dl.circleci.com/status-badge/img/circleci/9fJmTZfn8d8p7GtVt688PY/JjriGjhcxBD6zYKygMZaet/tree/master.svg?style=svg&circle-token=7baede7efd3db5f1f25fb439e97d5f695ff76318)](https://dl.circleci.com/status-badge/redirect/circleci/9fJmTZfn8d8p7GtVt688PY/JjriGjhcxBD6zYKygMZaet/tree/master)
+[![codecov]](https://codecov.io/github/beaugunderson/ip-address?branch=master)
+[![downloads]](https://www.npmjs.com/package/ip-address)
+[![npm]](https://www.npmjs.com/package/ip-address)
+[![snyk]](https://snyk.io/test/github/beaugunderson/ip-address)
+
+[codecov]: https://codecov.io/github/beaugunderson/ip-address/coverage.svg?branch=master
+[downloads]: https://img.shields.io/npm/dm/ip-address.svg
+[npm]: https://img.shields.io/npm/v/ip-address.svg
+[snyk]: https://snyk.io/test/github/beaugunderson/ip-address/badge.svg
+
+## ip-address
+
+`ip-address` is a library for validating and manipulating IPv4 and IPv6
+addresses in JavaScript.
+
+### Upgrading from 9.x to 10.x
+
+The dependency on `jsbn` was removed thanks to
+[michal-kocarek](https://github.com/michal-kocarek). Thanks Michal! For
+clarity, all methods with BigInteger in the name were renamed to BigInt.
+
+#### Breaking changes
+
+- `#fromBigInteger()` → `#fromBigInt()`; now returns a native BigInt
+- `#bigInteger()` → `#bigInt()`; now returns a native BigInt
+
+### Documentation
+
+Documentation is available at [ip-address.js.org](http://ip-address.js.org/).
+
+### Examples
+
+```js
+var Address6 = require('ip-address').Address6;
+
+var address = new Address6('2001:0:ce49:7601:e866:efff:62c3:fffe');
+
+var teredo = address.inspectTeredo();
+
+teredo.client4;    // '157.60.0.1'
+```
+
+### Features
+
+- Usable via CommonJS or ESM
+- Parsing of all IPv6 notations
+- Parsing of IPv6 addresses and ports from URLs with `Address6.fromURL(url)`
+- Validity checking
+- Decoding of the [Teredo
+  information](http://en.wikipedia.org/wiki/Teredo_tunneling#IPv6_addressing)
+  in an address
+- Whether one address is a valid subnet of another
+- What special properties a given address has (multicast prefix, unique
+  local address prefix, etc.)
+- Number of subnets of a certain size in a given address
+- Display methods
+  - Hex, binary, and decimal
+  - Canonical form
+  - Correct form
+  - IPv4-compatible (i.e. `::ffff:192.168.0.1`)
+- Works in [node](http://nodejs.org/) and the browser (with browserify)
+- ~1,600 test cases
+
+### Used by
+
+- [anon](https://github.com/edsu/anon) which powers
+  [@congressedits](https://twitter.com/congressedits), among
+  [many others](https://github.com/edsu/anon#community)
+- [base85](https://github.com/noseglid/base85): base85 encoding/decoding
+- [contrail-web-core](https://github.com/Juniper/contrail-web-core): part of
+  Contrail, a network virtualization solution made by Juniper Networks
+- [dhcpjs](https://github.com/apaprocki/node-dhcpjs): a DHCP client and server
+- [epochtalk](https://github.com/epochtalk/epochtalk): next generation forum
+  software
+- [geoip-web](https://github.com/tfrce/node-geoip-web): a server for
+  quickly geolocating IP addresses
+- [hexabus](https://github.com/mysmartgrid/hexabus): an IPv6-based home
+  automation bus
+- [hubot-deploy](https://github.com/atmos/hubot-deploy): GitHub Flow via hubot
+- [heroku-portscanner](https://github.com/robison/heroku-portscanner): nmap
+  hosted on Heroku
+- [ipfs-swarm](https://github.com/diasdavid/node-ipfs-swarm): a swarm
+  implementation based on IPFS
+- [javascript-x-server](https://github.com/GothAck/javascript-x-server): an X
+  server written in JavaScript
+- [libnmap](https://github.com/jas-/node-libnmap): a node API for nmap
+- [mail-io](https://github.com/mofux/mail-io): a lightweight SMTP server
+- [maxmind-db-reader](https://github.com/PaddeK/node-maxmind-db): a library for
+  reading MaxMind database files
+- [proxy-protocol-v2](https://github.com/ably/proxy-protocol-v2): a proxy
+  protocol encoder/decoder built by [Ably](https://www.ably.io/)
+- [Samsara](https://github.com/mariusGundersen/Samsara): a Docker web interface
+- [sis-api](https://github.com/sis-cmdb/sis-api): a configuration management
+  database API
+- [socks5-client](https://github.com/mattcg/socks5-client): a SOCKS v5 client
+- [socksified](https://github.com/vially/node-socksified): a SOCKS v5 client
+- [socksv5](https://github.com/mscdex/socksv5): a SOCKS v5 server/client
+- [ssdapi](https://github.com/rsolomou/ssdapi): an API created by the
+  University of Portsmouth
+- [SwitchyOmega](https://github.com/FelisCatus/SwitchyOmega): a [Chrome
+  extension](https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)
+  for switching between multiple proxies with ~311k users!
+- [swiz](https://github.com/racker/node-swiz): a serialization framework built
+  and used by [Rackspace](http://www.rackspace.com/)
Index: node_modules/ip-address/dist/address-error.d.ts
===================================================================
--- node_modules/ip-address/dist/address-error.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/address-error.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,5 @@
+export declare class AddressError extends Error {
+    parseMessage?: string;
+    constructor(message: string, parseMessage?: string);
+}
+//# sourceMappingURL=address-error.d.ts.map
Index: node_modules/ip-address/dist/address-error.d.ts.map
===================================================================
--- node_modules/ip-address/dist/address-error.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/address-error.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"address-error.d.ts","sourceRoot":"","sources":["../src/address-error.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAOnD"}
Index: node_modules/ip-address/dist/address-error.js
===================================================================
--- node_modules/ip-address/dist/address-error.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/address-error.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AddressError = void 0;
+class AddressError extends Error {
+    constructor(message, parseMessage) {
+        super(message);
+        this.name = 'AddressError';
+        this.parseMessage = parseMessage;
+    }
+}
+exports.AddressError = AddressError;
+//# sourceMappingURL=address-error.js.map
Index: node_modules/ip-address/dist/address-error.js.map
===================================================================
--- node_modules/ip-address/dist/address-error.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/address-error.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"address-error.js","sourceRoot":"","sources":["../src/address-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAa,SAAQ,KAAK;IAGrC,YAAY,OAAe,EAAE,YAAqB;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAE3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAVD,oCAUC"}
Index: node_modules/ip-address/dist/common.d.ts
===================================================================
--- node_modules/ip-address/dist/common.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/common.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,15 @@
+import { Address4 } from './ipv4';
+import { Address6 } from './ipv6';
+export interface ReverseFormOptions {
+    omitSuffix?: boolean;
+}
+export declare function isInSubnet(this: Address4 | Address6, address: Address4 | Address6): boolean;
+export declare function isCorrect(defaultBits: number): (this: Address4 | Address6) => boolean;
+export declare function numberToPaddedHex(number: number): string;
+export declare function stringToPaddedHex(numberString: string): string;
+/**
+ * @param binaryValue Binary representation of a value (e.g. `10`)
+ * @param position Byte position, where 0 is the least significant bit
+ */
+export declare function testBit(binaryValue: string, position: number): boolean;
+//# sourceMappingURL=common.d.ts.map
Index: node_modules/ip-address/dist/common.d.ts.map
===================================================================
--- node_modules/ip-address/dist/common.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/common.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,QAAQ,WAUjF;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,UACpB,QAAQ,GAAG,QAAQ,aAW3C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStE"}
Index: node_modules/ip-address/dist/common.js
===================================================================
--- node_modules/ip-address/dist/common.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/common.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,46 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isInSubnet = isInSubnet;
+exports.isCorrect = isCorrect;
+exports.numberToPaddedHex = numberToPaddedHex;
+exports.stringToPaddedHex = stringToPaddedHex;
+exports.testBit = testBit;
+function isInSubnet(address) {
+    if (this.subnetMask < address.subnetMask) {
+        return false;
+    }
+    if (this.mask(address.subnetMask) === address.mask()) {
+        return true;
+    }
+    return false;
+}
+function isCorrect(defaultBits) {
+    return function () {
+        if (this.addressMinusSuffix !== this.correctForm()) {
+            return false;
+        }
+        if (this.subnetMask === defaultBits && !this.parsedSubnet) {
+            return true;
+        }
+        return this.parsedSubnet === String(this.subnetMask);
+    };
+}
+function numberToPaddedHex(number) {
+    return number.toString(16).padStart(2, '0');
+}
+function stringToPaddedHex(numberString) {
+    return numberToPaddedHex(parseInt(numberString, 10));
+}
+/**
+ * @param binaryValue Binary representation of a value (e.g. `10`)
+ * @param position Byte position, where 0 is the least significant bit
+ */
+function testBit(binaryValue, position) {
+    const { length } = binaryValue;
+    if (position > length) {
+        return false;
+    }
+    const positionInString = length - position;
+    return binaryValue.substring(positionInString, positionInString + 1) === '1';
+}
+//# sourceMappingURL=common.js.map
Index: node_modules/ip-address/dist/common.js.map
===================================================================
--- node_modules/ip-address/dist/common.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/common.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":";;AAOA,gCAUC;AAED,8BAYC;AAED,8CAEC;AAED,8CAEC;AAMD,0BASC;AA/CD,SAAgB,UAAU,CAA4B,OAA4B;IAChF,IAAI,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,SAAS,CAAC,WAAmB;IAC3C,OAAO;QACL,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAc;IAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,iBAAiB,CAAC,YAAoB;IACpD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,WAAmB,EAAE,QAAgB;IAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IAE/B,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3C,OAAO,WAAW,CAAC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;AAC/E,CAAC"}
Index: node_modules/ip-address/dist/ip-address.d.ts
===================================================================
--- node_modules/ip-address/dist/ip-address.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ip-address.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,8 @@
+export { Address4 } from './ipv4';
+export { Address6 } from './ipv6';
+export { AddressError } from './address-error';
+import * as helpers from './v6/helpers';
+export declare const v6: {
+    helpers: typeof helpers;
+};
+//# sourceMappingURL=ip-address.d.ts.map
Index: node_modules/ip-address/dist/ip-address.d.ts.map
===================================================================
--- node_modules/ip-address/dist/ip-address.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ip-address.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ip-address.d.ts","sourceRoot":"","sources":["../src/ip-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC,eAAO,MAAM,EAAE;;CAAc,CAAC"}
Index: node_modules/ip-address/dist/ip-address.js
===================================================================
--- node_modules/ip-address/dist/ip-address.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ip-address.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,35 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.v6 = exports.AddressError = exports.Address6 = exports.Address4 = void 0;
+var ipv4_1 = require("./ipv4");
+Object.defineProperty(exports, "Address4", { enumerable: true, get: function () { return ipv4_1.Address4; } });
+var ipv6_1 = require("./ipv6");
+Object.defineProperty(exports, "Address6", { enumerable: true, get: function () { return ipv6_1.Address6; } });
+var address_error_1 = require("./address-error");
+Object.defineProperty(exports, "AddressError", { enumerable: true, get: function () { return address_error_1.AddressError; } });
+const helpers = __importStar(require("./v6/helpers"));
+exports.v6 = { helpers };
+//# sourceMappingURL=ip-address.js.map
Index: node_modules/ip-address/dist/ip-address.js.map
===================================================================
--- node_modules/ip-address/dist/ip-address.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ip-address.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ip-address.js","sourceRoot":"","sources":["../src/ip-address.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAAkC;AAAzB,gGAAA,QAAQ,OAAA;AACjB,+BAAkC;AAAzB,gGAAA,QAAQ,OAAA;AACjB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,sDAAwC;AAE3B,QAAA,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC"}
Index: node_modules/ip-address/dist/ipv4.d.ts
===================================================================
--- node_modules/ip-address/dist/ipv4.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv4.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,209 @@
+import * as common from './common';
+/**
+ * Represents an IPv4 address
+ * @class Address4
+ * @param {string} address - An IPv4 address string
+ */
+export declare class Address4 {
+    address: string;
+    addressMinusSuffix?: string;
+    groups: number;
+    parsedAddress: string[];
+    parsedSubnet: string;
+    subnet: string;
+    subnetMask: number;
+    v4: boolean;
+    constructor(address: string);
+    static isValid(address: string): boolean;
+    parse(address: string): string[];
+    /**
+     * Returns the correct form of an address
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    correctForm(): string;
+    /**
+     * Returns true if the address is correct, false otherwise
+     * @memberof Address4
+     * @instance
+     * @returns {Boolean}
+     */
+    isCorrect: (this: Address4 | import("./ipv6").Address6) => boolean;
+    /**
+     * Converts a hex string to an IPv4 address object
+     * @memberof Address4
+     * @static
+     * @param {string} hex - a hex string to convert
+     * @returns {Address4}
+     */
+    static fromHex(hex: string): Address4;
+    /**
+     * Converts an integer into a IPv4 address object
+     * @memberof Address4
+     * @static
+     * @param {integer} integer - a number to convert
+     * @returns {Address4}
+     */
+    static fromInteger(integer: number): Address4;
+    /**
+     * Return an address from in-addr.arpa form
+     * @memberof Address4
+     * @static
+     * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address
+     * @returns {Adress4}
+     * @example
+     * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.)
+     * address.correctForm(); // '192.0.2.42'
+     */
+    static fromArpa(arpaFormAddress: string): Address4;
+    /**
+     * Converts an IPv4 address object to a hex string
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    toHex(): string;
+    /**
+     * Converts an IPv4 address object to an array of bytes
+     * @memberof Address4
+     * @instance
+     * @returns {Array}
+     */
+    toArray(): number[];
+    /**
+     * Converts an IPv4 address object to an IPv6 address group
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    toGroup6(): string;
+    /**
+     * Returns the address as a `bigint`
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    bigInt(): bigint;
+    /**
+     * Helper function getting start address.
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    _startAddress(): bigint;
+    /**
+     * The first address in the range given by this address' subnet.
+     * Often referred to as the Network Address.
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    startAddress(): Address4;
+    /**
+     * The first host address in the range given by this address's subnet ie
+     * the first address after the Network Address
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    startAddressExclusive(): Address4;
+    /**
+     * Helper function getting end address.
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    _endAddress(): bigint;
+    /**
+     * The last address in the range given by this address' subnet
+     * Often referred to as the Broadcast
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    endAddress(): Address4;
+    /**
+     * The last host address in the range given by this address's subnet ie
+     * the last address prior to the Broadcast Address
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    endAddressExclusive(): Address4;
+    /**
+     * Converts a BigInt to a v4 address object
+     * @memberof Address4
+     * @static
+     * @param {bigint} bigInt - a BigInt to convert
+     * @returns {Address4}
+     */
+    static fromBigInt(bigInt: bigint): Address4;
+    /**
+     * Convert a byte array to an Address4 object
+     * @memberof Address4
+     * @static
+     * @param {Array<number>} bytes - an array of 4 bytes (0-255)
+     * @returns {Address4}
+     */
+    static fromByteArray(bytes: Array<number>): Address4;
+    /**
+     * Convert an unsigned byte array to an Address4 object
+     * @memberof Address4
+     * @static
+     * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)
+     * @returns {Address4}
+     */
+    static fromUnsignedByteArray(bytes: Array<number>): Address4;
+    /**
+     * Returns the first n bits of the address, defaulting to the
+     * subnet mask
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    mask(mask?: number): string;
+    /**
+     * Returns the bits in the given range as a base-2 string
+     * @memberof Address4
+     * @instance
+     * @returns {string}
+     */
+    getBitsBase2(start: number, end: number): string;
+    /**
+     * Return the reversed ip6.arpa form of the address
+     * @memberof Address4
+     * @param {Object} options
+     * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
+     * @instance
+     * @returns {String}
+     */
+    reverseForm(options?: common.ReverseFormOptions): string;
+    /**
+     * Returns true if the given address is in the subnet of the current address
+     * @memberof Address4
+     * @instance
+     * @returns {boolean}
+     */
+    isInSubnet: typeof common.isInSubnet;
+    /**
+     * Returns true if the given address is a multicast address
+     * @memberof Address4
+     * @instance
+     * @returns {boolean}
+     */
+    isMulticast(): boolean;
+    /**
+     * Returns a zero-padded base-2 string representation of the address
+     * @memberof Address4
+     * @instance
+     * @returns {string}
+     */
+    binaryZeroPad(): string;
+    /**
+     * Groups an IPv4 address for inclusion at the end of an IPv6 address
+     * @returns {String}
+     */
+    groupForV6(): string;
+}
+//# sourceMappingURL=ipv4.d.ts.map
Index: node_modules/ip-address/dist/ipv4.d.ts.map
===================================================================
--- node_modules/ip-address/dist/ipv4.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv4.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ipv4.d.ts","sourceRoot":"","sources":["../src/ipv4.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAInC;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAoB;IAClC,aAAa,EAAE,MAAM,EAAE,CAAM;IAC7B,YAAY,EAAE,MAAM,CAAM;IAC1B,MAAM,EAAE,MAAM,CAAS;IACvB,UAAU,EAAE,MAAM,CAAM;IACxB,EAAE,EAAE,OAAO,CAAQ;gBAEP,OAAO,EAAE,MAAM;IAsB3B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAcxC,KAAK,CAAC,OAAO,EAAE,MAAM;IAUrB;;;;;OAKG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;;OAKG;IACH,SAAS,0DAAoC;IAE7C;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAcrC;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAI7C;;;;;;;;;OASG;IACH,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,QAAQ;IASlD;;;;;OAKG;IACH,KAAK,IAAI,MAAM;IAIf;;;;;OAKG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;;;;OAKG;IACH,QAAQ,IAAI,MAAM;IAelB;;;;;OAKG;IACH,MAAM,IAAI,MAAM;IAIhB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAIvB;;;;;;OAMG;IACH,YAAY,IAAI,QAAQ;IAIxB;;;;;;OAMG;IACH,qBAAqB,IAAI,QAAQ;IAKjC;;;;;OAKG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;;;OAMG;IACH,UAAU,IAAI,QAAQ;IAItB;;;;;;OAMG;IACH,mBAAmB,IAAI,QAAQ;IAK/B;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;IAI3C;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ;IAepD;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ;IAS5D;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAQ3B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAIhD;;;;;;;OAOG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,kBAAkB,GAAG,MAAM;IAcxD;;;;;OAKG;IACH,UAAU,2BAAqB;IAE/B;;;;;OAKG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,UAAU,IAAI,MAAM;CAYrB"}
Index: node_modules/ip-address/dist/ipv4.js
===================================================================
--- node_modules/ip-address/dist/ipv4.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv4.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,360 @@
+"use strict";
+/* eslint-disable no-param-reassign */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Address4 = void 0;
+const common = __importStar(require("./common"));
+const constants = __importStar(require("./v4/constants"));
+const address_error_1 = require("./address-error");
+/**
+ * Represents an IPv4 address
+ * @class Address4
+ * @param {string} address - An IPv4 address string
+ */
+class Address4 {
+    constructor(address) {
+        this.groups = constants.GROUPS;
+        this.parsedAddress = [];
+        this.parsedSubnet = '';
+        this.subnet = '/32';
+        this.subnetMask = 32;
+        this.v4 = true;
+        /**
+         * Returns true if the address is correct, false otherwise
+         * @memberof Address4
+         * @instance
+         * @returns {Boolean}
+         */
+        this.isCorrect = common.isCorrect(constants.BITS);
+        /**
+         * Returns true if the given address is in the subnet of the current address
+         * @memberof Address4
+         * @instance
+         * @returns {boolean}
+         */
+        this.isInSubnet = common.isInSubnet;
+        this.address = address;
+        const subnet = constants.RE_SUBNET_STRING.exec(address);
+        if (subnet) {
+            this.parsedSubnet = subnet[0].replace('/', '');
+            this.subnetMask = parseInt(this.parsedSubnet, 10);
+            this.subnet = `/${this.subnetMask}`;
+            if (this.subnetMask < 0 || this.subnetMask > constants.BITS) {
+                throw new address_error_1.AddressError('Invalid subnet mask.');
+            }
+            address = address.replace(constants.RE_SUBNET_STRING, '');
+        }
+        this.addressMinusSuffix = address;
+        this.parsedAddress = this.parse(address);
+    }
+    static isValid(address) {
+        try {
+            // eslint-disable-next-line no-new
+            new Address4(address);
+            return true;
+        }
+        catch (e) {
+            return false;
+        }
+    }
+    /*
+     * Parses a v4 address
+     */
+    parse(address) {
+        const groups = address.split('.');
+        if (!address.match(constants.RE_ADDRESS)) {
+            throw new address_error_1.AddressError('Invalid IPv4 address.');
+        }
+        return groups;
+    }
+    /**
+     * Returns the correct form of an address
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    correctForm() {
+        return this.parsedAddress.map((part) => parseInt(part, 10)).join('.');
+    }
+    /**
+     * Converts a hex string to an IPv4 address object
+     * @memberof Address4
+     * @static
+     * @param {string} hex - a hex string to convert
+     * @returns {Address4}
+     */
+    static fromHex(hex) {
+        const padded = hex.replace(/:/g, '').padStart(8, '0');
+        const groups = [];
+        let i;
+        for (i = 0; i < 8; i += 2) {
+            const h = padded.slice(i, i + 2);
+            groups.push(parseInt(h, 16));
+        }
+        return new Address4(groups.join('.'));
+    }
+    /**
+     * Converts an integer into a IPv4 address object
+     * @memberof Address4
+     * @static
+     * @param {integer} integer - a number to convert
+     * @returns {Address4}
+     */
+    static fromInteger(integer) {
+        return Address4.fromHex(integer.toString(16));
+    }
+    /**
+     * Return an address from in-addr.arpa form
+     * @memberof Address4
+     * @static
+     * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address
+     * @returns {Adress4}
+     * @example
+     * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.)
+     * address.correctForm(); // '192.0.2.42'
+     */
+    static fromArpa(arpaFormAddress) {
+        // remove ending ".in-addr.arpa." or just "."
+        const leader = arpaFormAddress.replace(/(\.in-addr\.arpa)?\.$/, '');
+        const address = leader.split('.').reverse().join('.');
+        return new Address4(address);
+    }
+    /**
+     * Converts an IPv4 address object to a hex string
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    toHex() {
+        return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':');
+    }
+    /**
+     * Converts an IPv4 address object to an array of bytes
+     * @memberof Address4
+     * @instance
+     * @returns {Array}
+     */
+    toArray() {
+        return this.parsedAddress.map((part) => parseInt(part, 10));
+    }
+    /**
+     * Converts an IPv4 address object to an IPv6 address group
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    toGroup6() {
+        const output = [];
+        let i;
+        for (i = 0; i < constants.GROUPS; i += 2) {
+            output.push(`${common.stringToPaddedHex(this.parsedAddress[i])}${common.stringToPaddedHex(this.parsedAddress[i + 1])}`);
+        }
+        return output.join(':');
+    }
+    /**
+     * Returns the address as a `bigint`
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    bigInt() {
+        return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`);
+    }
+    /**
+     * Helper function getting start address.
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    _startAddress() {
+        return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`);
+    }
+    /**
+     * The first address in the range given by this address' subnet.
+     * Often referred to as the Network Address.
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    startAddress() {
+        return Address4.fromBigInt(this._startAddress());
+    }
+    /**
+     * The first host address in the range given by this address's subnet ie
+     * the first address after the Network Address
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    startAddressExclusive() {
+        const adjust = BigInt('1');
+        return Address4.fromBigInt(this._startAddress() + adjust);
+    }
+    /**
+     * Helper function getting end address.
+     * @memberof Address4
+     * @instance
+     * @returns {bigint}
+     */
+    _endAddress() {
+        return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`);
+    }
+    /**
+     * The last address in the range given by this address' subnet
+     * Often referred to as the Broadcast
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    endAddress() {
+        return Address4.fromBigInt(this._endAddress());
+    }
+    /**
+     * The last host address in the range given by this address's subnet ie
+     * the last address prior to the Broadcast Address
+     * @memberof Address4
+     * @instance
+     * @returns {Address4}
+     */
+    endAddressExclusive() {
+        const adjust = BigInt('1');
+        return Address4.fromBigInt(this._endAddress() - adjust);
+    }
+    /**
+     * Converts a BigInt to a v4 address object
+     * @memberof Address4
+     * @static
+     * @param {bigint} bigInt - a BigInt to convert
+     * @returns {Address4}
+     */
+    static fromBigInt(bigInt) {
+        return Address4.fromHex(bigInt.toString(16));
+    }
+    /**
+     * Convert a byte array to an Address4 object
+     * @memberof Address4
+     * @static
+     * @param {Array<number>} bytes - an array of 4 bytes (0-255)
+     * @returns {Address4}
+     */
+    static fromByteArray(bytes) {
+        if (bytes.length !== 4) {
+            throw new address_error_1.AddressError('IPv4 addresses require exactly 4 bytes');
+        }
+        // Validate that all bytes are within valid range (0-255)
+        for (let i = 0; i < bytes.length; i++) {
+            if (!Number.isInteger(bytes[i]) || bytes[i] < 0 || bytes[i] > 255) {
+                throw new address_error_1.AddressError('All bytes must be integers between 0 and 255');
+            }
+        }
+        return this.fromUnsignedByteArray(bytes);
+    }
+    /**
+     * Convert an unsigned byte array to an Address4 object
+     * @memberof Address4
+     * @static
+     * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)
+     * @returns {Address4}
+     */
+    static fromUnsignedByteArray(bytes) {
+        if (bytes.length !== 4) {
+            throw new address_error_1.AddressError('IPv4 addresses require exactly 4 bytes');
+        }
+        const address = bytes.join('.');
+        return new Address4(address);
+    }
+    /**
+     * Returns the first n bits of the address, defaulting to the
+     * subnet mask
+     * @memberof Address4
+     * @instance
+     * @returns {String}
+     */
+    mask(mask) {
+        if (mask === undefined) {
+            mask = this.subnetMask;
+        }
+        return this.getBitsBase2(0, mask);
+    }
+    /**
+     * Returns the bits in the given range as a base-2 string
+     * @memberof Address4
+     * @instance
+     * @returns {string}
+     */
+    getBitsBase2(start, end) {
+        return this.binaryZeroPad().slice(start, end);
+    }
+    /**
+     * Return the reversed ip6.arpa form of the address
+     * @memberof Address4
+     * @param {Object} options
+     * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
+     * @instance
+     * @returns {String}
+     */
+    reverseForm(options) {
+        if (!options) {
+            options = {};
+        }
+        const reversed = this.correctForm().split('.').reverse().join('.');
+        if (options.omitSuffix) {
+            return reversed;
+        }
+        return `${reversed}.in-addr.arpa.`;
+    }
+    /**
+     * Returns true if the given address is a multicast address
+     * @memberof Address4
+     * @instance
+     * @returns {boolean}
+     */
+    isMulticast() {
+        return this.isInSubnet(new Address4('224.0.0.0/4'));
+    }
+    /**
+     * Returns a zero-padded base-2 string representation of the address
+     * @memberof Address4
+     * @instance
+     * @returns {string}
+     */
+    binaryZeroPad() {
+        return this.bigInt().toString(2).padStart(constants.BITS, '0');
+    }
+    /**
+     * Groups an IPv4 address for inclusion at the end of an IPv6 address
+     * @returns {String}
+     */
+    groupForV6() {
+        const segments = this.parsedAddress;
+        return this.address.replace(constants.RE_ADDRESS, `<span class="hover-group group-v4 group-6">${segments
+            .slice(0, 2)
+            .join('.')}</span>.<span class="hover-group group-v4 group-7">${segments
+            .slice(2, 4)
+            .join('.')}</span>`);
+    }
+}
+exports.Address4 = Address4;
+//# sourceMappingURL=ipv4.js.map
Index: node_modules/ip-address/dist/ipv4.js.map
===================================================================
--- node_modules/ip-address/dist/ipv4.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv4.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ipv4.js","sourceRoot":"","sources":["../src/ipv4.ts"],"names":[],"mappings":"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"}
Index: node_modules/ip-address/dist/ipv6.d.ts
===================================================================
--- node_modules/ip-address/dist/ipv6.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv6.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,428 @@
+import * as common from './common';
+import { Address4 } from './ipv4';
+interface SixToFourProperties {
+    prefix: string;
+    gateway: string;
+}
+interface TeredoProperties {
+    prefix: string;
+    server4: string;
+    client4: string;
+    flags: string;
+    coneNat: boolean;
+    microsoft: {
+        reserved: boolean;
+        universalLocal: boolean;
+        groupIndividual: boolean;
+        nonce: string;
+    };
+    udpPort: string;
+}
+/**
+ * Represents an IPv6 address
+ * @class Address6
+ * @param {string} address - An IPv6 address string
+ * @param {number} [groups=8] - How many octets to parse
+ * @example
+ * var address = new Address6('2001::/32');
+ */
+export declare class Address6 {
+    address4?: Address4;
+    address: string;
+    addressMinusSuffix: string;
+    elidedGroups?: number;
+    elisionBegin?: number;
+    elisionEnd?: number;
+    groups: number;
+    parsedAddress4?: string;
+    parsedAddress: string[];
+    parsedSubnet: string;
+    subnet: string;
+    subnetMask: number;
+    v4: boolean;
+    zone: string;
+    constructor(address: string, optionalGroups?: number);
+    static isValid(address: string): boolean;
+    /**
+     * Convert a BigInt to a v6 address object
+     * @memberof Address6
+     * @static
+     * @param {bigint} bigInt - a BigInt to convert
+     * @returns {Address6}
+     * @example
+     * var bigInt = BigInt('1000000000000');
+     * var address = Address6.fromBigInt(bigInt);
+     * address.correctForm(); // '::e8:d4a5:1000'
+     */
+    static fromBigInt(bigInt: bigint): Address6;
+    /**
+     * Convert a URL (with optional port number) to an address object
+     * @memberof Address6
+     * @static
+     * @param {string} url - a URL with optional port number
+     * @example
+     * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');
+     * addressAndPort.address.correctForm(); // 'ffff::'
+     * addressAndPort.port; // 8080
+     */
+    static fromURL(url: string): {
+        error: string;
+        address: null;
+        port: null;
+    } | {
+        address: Address6;
+        port: number | null;
+        error?: undefined;
+    };
+    /**
+     * Create an IPv6-mapped address given an IPv4 address
+     * @memberof Address6
+     * @static
+     * @param {string} address - An IPv4 address string
+     * @returns {Address6}
+     * @example
+     * var address = Address6.fromAddress4('192.168.0.1');
+     * address.correctForm(); // '::ffff:c0a8:1'
+     * address.to4in6(); // '::ffff:192.168.0.1'
+     */
+    static fromAddress4(address: string): Address6;
+    /**
+     * Return an address from ip6.arpa form
+     * @memberof Address6
+     * @static
+     * @param {string} arpaFormAddress - an 'ip6.arpa' form address
+     * @returns {Adress6}
+     * @example
+     * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)
+     * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'
+     */
+    static fromArpa(arpaFormAddress: string): Address6;
+    /**
+     * Return the Microsoft UNC transcription of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String} the Microsoft UNC transcription of the address
+     */
+    microsoftTranscription(): string;
+    /**
+     * Return the first n bits of the address, defaulting to the subnet mask
+     * @memberof Address6
+     * @instance
+     * @param {number} [mask=subnet] - the number of bits to mask
+     * @returns {String} the first n bits of the address as a string
+     */
+    mask(mask?: number): string;
+    /**
+     * Return the number of possible subnets of a given size in the address
+     * @memberof Address6
+     * @instance
+     * @param {number} [subnetSize=128] - the subnet size
+     * @returns {String}
+     */
+    possibleSubnets(subnetSize?: number): string;
+    /**
+     * Helper function getting start address.
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    _startAddress(): bigint;
+    /**
+     * The first address in the range given by this address' subnet
+     * Often referred to as the Network Address.
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    startAddress(): Address6;
+    /**
+     * The first host address in the range given by this address's subnet ie
+     * the first address after the Network Address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    startAddressExclusive(): Address6;
+    /**
+     * Helper function getting end address.
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    _endAddress(): bigint;
+    /**
+     * The last address in the range given by this address' subnet
+     * Often referred to as the Broadcast
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    endAddress(): Address6;
+    /**
+     * The last host address in the range given by this address's subnet ie
+     * the last address prior to the Broadcast Address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    endAddressExclusive(): Address6;
+    /**
+     * Return the scope of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getScope(): string;
+    /**
+     * Return the type of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getType(): string;
+    /**
+     * Return the bits in the given range as a BigInt
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    getBits(start: number, end: number): bigint;
+    /**
+     * Return the bits in the given range as a base-2 string
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsBase2(start: number, end: number): string;
+    /**
+     * Return the bits in the given range as a base-16 string
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsBase16(start: number, end: number): string;
+    /**
+     * Return the bits that are set past the subnet mask length
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsPastSubnet(): string;
+    /**
+     * Return the reversed ip6.arpa form of the address
+     * @memberof Address6
+     * @param {Object} options
+     * @param {boolean} options.omitSuffix - omit the "ip6.arpa" suffix
+     * @instance
+     * @returns {String}
+     */
+    reverseForm(options?: common.ReverseFormOptions): string;
+    /**
+     * Return the correct form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    correctForm(): string;
+    /**
+     * Return a zero-padded base-2 string representation of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     * @example
+     * var address = new Address6('2001:4860:4001:803::1011');
+     * address.binaryZeroPad();
+     * // '0010000000000001010010000110000001000000000000010000100000000011
+     * //  0000000000000000000000000000000000000000000000000001000000010001'
+     */
+    binaryZeroPad(): string;
+    parse4in6(address: string): string;
+    parse(address: string): string[];
+    /**
+     * Return the canonical form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    canonicalForm(): string;
+    /**
+     * Return the decimal form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    decimal(): string;
+    /**
+     * Return the address as a BigInt
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    bigInt(): bigint;
+    /**
+     * Return the last two groups of this address as an IPv4 address string
+     * @memberof Address6
+     * @instance
+     * @returns {Address4}
+     * @example
+     * var address = new Address6('2001:4860:4001::1825:bf11');
+     * address.to4().correctForm(); // '24.37.191.17'
+     */
+    to4(): Address4;
+    /**
+     * Return the v4-in-v6 form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    to4in6(): string;
+    /**
+     * Return an object containing the Teredo properties of the address
+     * @memberof Address6
+     * @instance
+     * @returns {Object}
+     */
+    inspectTeredo(): TeredoProperties;
+    /**
+     * Return an object containing the 6to4 properties of the address
+     * @memberof Address6
+     * @instance
+     * @returns {Object}
+     */
+    inspect6to4(): SixToFourProperties;
+    /**
+     * Return a v6 6to4 address from a v6 v4inv6 address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    to6to4(): Address6 | null;
+    /**
+     * Return a byte array
+     * @memberof Address6
+     * @instance
+     * @returns {Array}
+     */
+    toByteArray(): number[];
+    /**
+     * Return an unsigned byte array
+     * @memberof Address6
+     * @instance
+     * @returns {Array}
+     */
+    toUnsignedByteArray(): number[];
+    /**
+     * Convert a byte array to an Address6 object
+     * @memberof Address6
+     * @static
+     * @returns {Address6}
+     */
+    static fromByteArray(bytes: Array<any>): Address6;
+    /**
+     * Convert an unsigned byte array to an Address6 object
+     * @memberof Address6
+     * @static
+     * @returns {Address6}
+     */
+    static fromUnsignedByteArray(bytes: Array<any>): Address6;
+    /**
+     * Returns true if the given address is in the subnet of the current address
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isInSubnet: typeof common.isInSubnet;
+    /**
+     * Returns true if the address is correct, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isCorrect: (this: Address4 | Address6) => boolean;
+    /**
+     * Returns true if the address is in the canonical form, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isCanonical(): boolean;
+    /**
+     * Returns true if the address is a link local address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isLinkLocal(): boolean;
+    /**
+     * Returns true if the address is a multicast address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isMulticast(): boolean;
+    /**
+     * Returns true if the address is a v4-in-v6 address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    is4(): boolean;
+    /**
+     * Returns true if the address is a Teredo address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isTeredo(): boolean;
+    /**
+     * Returns true if the address is a 6to4 address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    is6to4(): boolean;
+    /**
+     * Returns true if the address is a loopback address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isLoopback(): boolean;
+    /**
+     * @returns {String} the address in link form with a default port of 80
+     */
+    href(optionalPort?: number | string): string;
+    /**
+     * @returns {String} a link suitable for conveying the address via a URL hash
+     */
+    link(options?: {
+        className?: string;
+        prefix?: string;
+        v4?: boolean;
+    }): string;
+    /**
+     * Groups an address
+     * @returns {String}
+     */
+    group(): string;
+    /**
+     * Generate a regular expression string that can be used to find or validate
+     * all variations of this address
+     * @memberof Address6
+     * @instance
+     * @param {boolean} substringSearch
+     * @returns {string}
+     */
+    regularExpressionString(this: Address6, substringSearch?: boolean): string;
+    /**
+     * Generate a regular expression that can be used to find or validate all
+     * variations of this address.
+     * @memberof Address6
+     * @instance
+     * @param {boolean} substringSearch
+     * @returns {RegExp}
+     */
+    regularExpression(this: Address6, substringSearch?: boolean): RegExp;
+}
+export {};
+//# sourceMappingURL=ipv6.d.ts.map
Index: node_modules/ip-address/dist/ipv6.d.ts.map
===================================================================
--- node_modules/ip-address/dist/ipv6.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv6.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ipv6.d.ts","sourceRoot":"","sources":["../src/ipv6.ts"],"names":[],"mappings":"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"}
Index: node_modules/ip-address/dist/ipv6.js
===================================================================
--- node_modules/ip-address/dist/ipv6.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv6.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1003 @@
+"use strict";
+/* eslint-disable prefer-destructuring */
+/* eslint-disable no-param-reassign */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Address6 = void 0;
+const common = __importStar(require("./common"));
+const constants4 = __importStar(require("./v4/constants"));
+const constants6 = __importStar(require("./v6/constants"));
+const helpers = __importStar(require("./v6/helpers"));
+const ipv4_1 = require("./ipv4");
+const regular_expressions_1 = require("./v6/regular-expressions");
+const address_error_1 = require("./address-error");
+const common_1 = require("./common");
+function assert(condition) {
+    if (!condition) {
+        throw new Error('Assertion failed.');
+    }
+}
+function addCommas(number) {
+    const r = /(\d+)(\d{3})/;
+    while (r.test(number)) {
+        number = number.replace(r, '$1,$2');
+    }
+    return number;
+}
+function spanLeadingZeroes4(n) {
+    n = n.replace(/^(0{1,})([1-9]+)$/, '<span class="parse-error">$1</span>$2');
+    n = n.replace(/^(0{1,})(0)$/, '<span class="parse-error">$1</span>$2');
+    return n;
+}
+/*
+ * A helper function to compact an array
+ */
+function compact(address, slice) {
+    const s1 = [];
+    const s2 = [];
+    let i;
+    for (i = 0; i < address.length; i++) {
+        if (i < slice[0]) {
+            s1.push(address[i]);
+        }
+        else if (i > slice[1]) {
+            s2.push(address[i]);
+        }
+    }
+    return s1.concat(['compact']).concat(s2);
+}
+function paddedHex(octet) {
+    return parseInt(octet, 16).toString(16).padStart(4, '0');
+}
+function unsignByte(b) {
+    // eslint-disable-next-line no-bitwise
+    return b & 0xff;
+}
+/**
+ * Represents an IPv6 address
+ * @class Address6
+ * @param {string} address - An IPv6 address string
+ * @param {number} [groups=8] - How many octets to parse
+ * @example
+ * var address = new Address6('2001::/32');
+ */
+class Address6 {
+    constructor(address, optionalGroups) {
+        this.addressMinusSuffix = '';
+        this.parsedSubnet = '';
+        this.subnet = '/128';
+        this.subnetMask = 128;
+        this.v4 = false;
+        this.zone = '';
+        // #region Attributes
+        /**
+         * Returns true if the given address is in the subnet of the current address
+         * @memberof Address6
+         * @instance
+         * @returns {boolean}
+         */
+        this.isInSubnet = common.isInSubnet;
+        /**
+         * Returns true if the address is correct, false otherwise
+         * @memberof Address6
+         * @instance
+         * @returns {boolean}
+         */
+        this.isCorrect = common.isCorrect(constants6.BITS);
+        if (optionalGroups === undefined) {
+            this.groups = constants6.GROUPS;
+        }
+        else {
+            this.groups = optionalGroups;
+        }
+        this.address = address;
+        const subnet = constants6.RE_SUBNET_STRING.exec(address);
+        if (subnet) {
+            this.parsedSubnet = subnet[0].replace('/', '');
+            this.subnetMask = parseInt(this.parsedSubnet, 10);
+            this.subnet = `/${this.subnetMask}`;
+            if (Number.isNaN(this.subnetMask) ||
+                this.subnetMask < 0 ||
+                this.subnetMask > constants6.BITS) {
+                throw new address_error_1.AddressError('Invalid subnet mask.');
+            }
+            address = address.replace(constants6.RE_SUBNET_STRING, '');
+        }
+        else if (/\//.test(address)) {
+            throw new address_error_1.AddressError('Invalid subnet mask.');
+        }
+        const zone = constants6.RE_ZONE_STRING.exec(address);
+        if (zone) {
+            this.zone = zone[0];
+            address = address.replace(constants6.RE_ZONE_STRING, '');
+        }
+        this.addressMinusSuffix = address;
+        this.parsedAddress = this.parse(this.addressMinusSuffix);
+    }
+    static isValid(address) {
+        try {
+            // eslint-disable-next-line no-new
+            new Address6(address);
+            return true;
+        }
+        catch (e) {
+            return false;
+        }
+    }
+    /**
+     * Convert a BigInt to a v6 address object
+     * @memberof Address6
+     * @static
+     * @param {bigint} bigInt - a BigInt to convert
+     * @returns {Address6}
+     * @example
+     * var bigInt = BigInt('1000000000000');
+     * var address = Address6.fromBigInt(bigInt);
+     * address.correctForm(); // '::e8:d4a5:1000'
+     */
+    static fromBigInt(bigInt) {
+        const hex = bigInt.toString(16).padStart(32, '0');
+        const groups = [];
+        let i;
+        for (i = 0; i < constants6.GROUPS; i++) {
+            groups.push(hex.slice(i * 4, (i + 1) * 4));
+        }
+        return new Address6(groups.join(':'));
+    }
+    /**
+     * Convert a URL (with optional port number) to an address object
+     * @memberof Address6
+     * @static
+     * @param {string} url - a URL with optional port number
+     * @example
+     * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');
+     * addressAndPort.address.correctForm(); // 'ffff::'
+     * addressAndPort.port; // 8080
+     */
+    static fromURL(url) {
+        let host;
+        let port = null;
+        let result;
+        // If we have brackets parse them and find a port
+        if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {
+            result = constants6.RE_URL_WITH_PORT.exec(url);
+            if (result === null) {
+                return {
+                    error: 'failed to parse address with port',
+                    address: null,
+                    port: null,
+                };
+            }
+            host = result[1];
+            port = result[2];
+            // If there's a URL extract the address
+        }
+        else if (url.indexOf('/') !== -1) {
+            // Remove the protocol prefix
+            url = url.replace(/^[a-z0-9]+:\/\//, '');
+            // Parse the address
+            result = constants6.RE_URL.exec(url);
+            if (result === null) {
+                return {
+                    error: 'failed to parse address from URL',
+                    address: null,
+                    port: null,
+                };
+            }
+            host = result[1];
+            // Otherwise just assign the URL to the host and let the library parse it
+        }
+        else {
+            host = url;
+        }
+        // If there's a port convert it to an integer
+        if (port) {
+            port = parseInt(port, 10);
+            // squelch out of range ports
+            if (port < 0 || port > 65536) {
+                port = null;
+            }
+        }
+        else {
+            // Standardize `undefined` to `null`
+            port = null;
+        }
+        return {
+            address: new Address6(host),
+            port,
+        };
+    }
+    /**
+     * Create an IPv6-mapped address given an IPv4 address
+     * @memberof Address6
+     * @static
+     * @param {string} address - An IPv4 address string
+     * @returns {Address6}
+     * @example
+     * var address = Address6.fromAddress4('192.168.0.1');
+     * address.correctForm(); // '::ffff:c0a8:1'
+     * address.to4in6(); // '::ffff:192.168.0.1'
+     */
+    static fromAddress4(address) {
+        const address4 = new ipv4_1.Address4(address);
+        const mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);
+        return new Address6(`::ffff:${address4.correctForm()}/${mask6}`);
+    }
+    /**
+     * Return an address from ip6.arpa form
+     * @memberof Address6
+     * @static
+     * @param {string} arpaFormAddress - an 'ip6.arpa' form address
+     * @returns {Adress6}
+     * @example
+     * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)
+     * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'
+     */
+    static fromArpa(arpaFormAddress) {
+        // remove ending ".ip6.arpa." or just "."
+        let address = arpaFormAddress.replace(/(\.ip6\.arpa)?\.$/, '');
+        const semicolonAmount = 7;
+        // correct ip6.arpa form with ending removed will be 63 characters
+        if (address.length !== 63) {
+            throw new address_error_1.AddressError("Invalid 'ip6.arpa' form.");
+        }
+        const parts = address.split('.').reverse();
+        for (let i = semicolonAmount; i > 0; i--) {
+            const insertIndex = i * 4;
+            parts.splice(insertIndex, 0, ':');
+        }
+        address = parts.join('');
+        return new Address6(address);
+    }
+    /**
+     * Return the Microsoft UNC transcription of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String} the Microsoft UNC transcription of the address
+     */
+    microsoftTranscription() {
+        return `${this.correctForm().replace(/:/g, '-')}.ipv6-literal.net`;
+    }
+    /**
+     * Return the first n bits of the address, defaulting to the subnet mask
+     * @memberof Address6
+     * @instance
+     * @param {number} [mask=subnet] - the number of bits to mask
+     * @returns {String} the first n bits of the address as a string
+     */
+    mask(mask = this.subnetMask) {
+        return this.getBitsBase2(0, mask);
+    }
+    /**
+     * Return the number of possible subnets of a given size in the address
+     * @memberof Address6
+     * @instance
+     * @param {number} [subnetSize=128] - the subnet size
+     * @returns {String}
+     */
+    // TODO: probably useful to have a numeric version of this too
+    possibleSubnets(subnetSize = 128) {
+        const availableBits = constants6.BITS - this.subnetMask;
+        const subnetBits = Math.abs(subnetSize - constants6.BITS);
+        const subnetPowers = availableBits - subnetBits;
+        if (subnetPowers < 0) {
+            return '0';
+        }
+        return addCommas((BigInt('2') ** BigInt(subnetPowers)).toString(10));
+    }
+    /**
+     * Helper function getting start address.
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    _startAddress() {
+        return BigInt(`0b${this.mask() + '0'.repeat(constants6.BITS - this.subnetMask)}`);
+    }
+    /**
+     * The first address in the range given by this address' subnet
+     * Often referred to as the Network Address.
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    startAddress() {
+        return Address6.fromBigInt(this._startAddress());
+    }
+    /**
+     * The first host address in the range given by this address's subnet ie
+     * the first address after the Network Address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    startAddressExclusive() {
+        const adjust = BigInt('1');
+        return Address6.fromBigInt(this._startAddress() + adjust);
+    }
+    /**
+     * Helper function getting end address.
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    _endAddress() {
+        return BigInt(`0b${this.mask() + '1'.repeat(constants6.BITS - this.subnetMask)}`);
+    }
+    /**
+     * The last address in the range given by this address' subnet
+     * Often referred to as the Broadcast
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    endAddress() {
+        return Address6.fromBigInt(this._endAddress());
+    }
+    /**
+     * The last host address in the range given by this address's subnet ie
+     * the last address prior to the Broadcast Address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    endAddressExclusive() {
+        const adjust = BigInt('1');
+        return Address6.fromBigInt(this._endAddress() - adjust);
+    }
+    /**
+     * Return the scope of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getScope() {
+        let scope = constants6.SCOPES[parseInt(this.getBits(12, 16).toString(10), 10)];
+        if (this.getType() === 'Global unicast' && scope !== 'Link local') {
+            scope = 'Global';
+        }
+        return scope || 'Unknown';
+    }
+    /**
+     * Return the type of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getType() {
+        for (const subnet of Object.keys(constants6.TYPES)) {
+            if (this.isInSubnet(new Address6(subnet))) {
+                return constants6.TYPES[subnet];
+            }
+        }
+        return 'Global unicast';
+    }
+    /**
+     * Return the bits in the given range as a BigInt
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    getBits(start, end) {
+        return BigInt(`0b${this.getBitsBase2(start, end)}`);
+    }
+    /**
+     * Return the bits in the given range as a base-2 string
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsBase2(start, end) {
+        return this.binaryZeroPad().slice(start, end);
+    }
+    /**
+     * Return the bits in the given range as a base-16 string
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsBase16(start, end) {
+        const length = end - start;
+        if (length % 4 !== 0) {
+            throw new Error('Length of bits to retrieve must be divisible by four');
+        }
+        return this.getBits(start, end)
+            .toString(16)
+            .padStart(length / 4, '0');
+    }
+    /**
+     * Return the bits that are set past the subnet mask length
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    getBitsPastSubnet() {
+        return this.getBitsBase2(this.subnetMask, constants6.BITS);
+    }
+    /**
+     * Return the reversed ip6.arpa form of the address
+     * @memberof Address6
+     * @param {Object} options
+     * @param {boolean} options.omitSuffix - omit the "ip6.arpa" suffix
+     * @instance
+     * @returns {String}
+     */
+    reverseForm(options) {
+        if (!options) {
+            options = {};
+        }
+        const characters = Math.floor(this.subnetMask / 4);
+        const reversed = this.canonicalForm()
+            .replace(/:/g, '')
+            .split('')
+            .slice(0, characters)
+            .reverse()
+            .join('.');
+        if (characters > 0) {
+            if (options.omitSuffix) {
+                return reversed;
+            }
+            return `${reversed}.ip6.arpa.`;
+        }
+        if (options.omitSuffix) {
+            return '';
+        }
+        return 'ip6.arpa.';
+    }
+    /**
+     * Return the correct form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    correctForm() {
+        let i;
+        let groups = [];
+        let zeroCounter = 0;
+        const zeroes = [];
+        for (i = 0; i < this.parsedAddress.length; i++) {
+            const value = parseInt(this.parsedAddress[i], 16);
+            if (value === 0) {
+                zeroCounter++;
+            }
+            if (value !== 0 && zeroCounter > 0) {
+                if (zeroCounter > 1) {
+                    zeroes.push([i - zeroCounter, i - 1]);
+                }
+                zeroCounter = 0;
+            }
+        }
+        // Do we end with a string of zeroes?
+        if (zeroCounter > 1) {
+            zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]);
+        }
+        const zeroLengths = zeroes.map((n) => n[1] - n[0] + 1);
+        if (zeroes.length > 0) {
+            const index = zeroLengths.indexOf(Math.max(...zeroLengths));
+            groups = compact(this.parsedAddress, zeroes[index]);
+        }
+        else {
+            groups = this.parsedAddress;
+        }
+        for (i = 0; i < groups.length; i++) {
+            if (groups[i] !== 'compact') {
+                groups[i] = parseInt(groups[i], 16).toString(16);
+            }
+        }
+        let correct = groups.join(':');
+        correct = correct.replace(/^compact$/, '::');
+        correct = correct.replace(/(^compact)|(compact$)/, ':');
+        correct = correct.replace(/compact/, '');
+        return correct;
+    }
+    /**
+     * Return a zero-padded base-2 string representation of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     * @example
+     * var address = new Address6('2001:4860:4001:803::1011');
+     * address.binaryZeroPad();
+     * // '0010000000000001010010000110000001000000000000010000100000000011
+     * //  0000000000000000000000000000000000000000000000000001000000010001'
+     */
+    binaryZeroPad() {
+        return this.bigInt().toString(2).padStart(constants6.BITS, '0');
+    }
+    // TODO: Improve the semantics of this helper function
+    parse4in6(address) {
+        const groups = address.split(':');
+        const lastGroup = groups.slice(-1)[0];
+        const address4 = lastGroup.match(constants4.RE_ADDRESS);
+        if (address4) {
+            this.parsedAddress4 = address4[0];
+            this.address4 = new ipv4_1.Address4(this.parsedAddress4);
+            for (let i = 0; i < this.address4.groups; i++) {
+                if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) {
+                    throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", address.replace(constants4.RE_ADDRESS, this.address4.parsedAddress.map(spanLeadingZeroes4).join('.')));
+                }
+            }
+            this.v4 = true;
+            groups[groups.length - 1] = this.address4.toGroup6();
+            address = groups.join(':');
+        }
+        return address;
+    }
+    // TODO: Make private?
+    parse(address) {
+        address = this.parse4in6(address);
+        const badCharacters = address.match(constants6.RE_BAD_CHARACTERS);
+        if (badCharacters) {
+            throw new address_error_1.AddressError(`Bad character${badCharacters.length > 1 ? 's' : ''} detected in address: ${badCharacters.join('')}`, address.replace(constants6.RE_BAD_CHARACTERS, '<span class="parse-error">$1</span>'));
+        }
+        const badAddress = address.match(constants6.RE_BAD_ADDRESS);
+        if (badAddress) {
+            throw new address_error_1.AddressError(`Address failed regex: ${badAddress.join('')}`, address.replace(constants6.RE_BAD_ADDRESS, '<span class="parse-error">$1</span>'));
+        }
+        let groups = [];
+        const halves = address.split('::');
+        if (halves.length === 2) {
+            let first = halves[0].split(':');
+            let last = halves[1].split(':');
+            if (first.length === 1 && first[0] === '') {
+                first = [];
+            }
+            if (last.length === 1 && last[0] === '') {
+                last = [];
+            }
+            const remaining = this.groups - (first.length + last.length);
+            if (!remaining) {
+                throw new address_error_1.AddressError('Error parsing groups');
+            }
+            this.elidedGroups = remaining;
+            this.elisionBegin = first.length;
+            this.elisionEnd = first.length + this.elidedGroups;
+            groups = groups.concat(first);
+            for (let i = 0; i < remaining; i++) {
+                groups.push('0');
+            }
+            groups = groups.concat(last);
+        }
+        else if (halves.length === 1) {
+            groups = address.split(':');
+            this.elidedGroups = 0;
+        }
+        else {
+            throw new address_error_1.AddressError('Too many :: groups found');
+        }
+        groups = groups.map((group) => parseInt(group, 16).toString(16));
+        if (groups.length !== this.groups) {
+            throw new address_error_1.AddressError('Incorrect number of groups found');
+        }
+        return groups;
+    }
+    /**
+     * Return the canonical form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    canonicalForm() {
+        return this.parsedAddress.map(paddedHex).join(':');
+    }
+    /**
+     * Return the decimal form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    decimal() {
+        return this.parsedAddress.map((n) => parseInt(n, 16).toString(10).padStart(5, '0')).join(':');
+    }
+    /**
+     * Return the address as a BigInt
+     * @memberof Address6
+     * @instance
+     * @returns {bigint}
+     */
+    bigInt() {
+        return BigInt(`0x${this.parsedAddress.map(paddedHex).join('')}`);
+    }
+    /**
+     * Return the last two groups of this address as an IPv4 address string
+     * @memberof Address6
+     * @instance
+     * @returns {Address4}
+     * @example
+     * var address = new Address6('2001:4860:4001::1825:bf11');
+     * address.to4().correctForm(); // '24.37.191.17'
+     */
+    to4() {
+        const binary = this.binaryZeroPad().split('');
+        return ipv4_1.Address4.fromHex(BigInt(`0b${binary.slice(96, 128).join('')}`).toString(16));
+    }
+    /**
+     * Return the v4-in-v6 form of the address
+     * @memberof Address6
+     * @instance
+     * @returns {String}
+     */
+    to4in6() {
+        const address4 = this.to4();
+        const address6 = new Address6(this.parsedAddress.slice(0, 6).join(':'), 6);
+        const correct = address6.correctForm();
+        let infix = '';
+        if (!/:$/.test(correct)) {
+            infix = ':';
+        }
+        return correct + infix + address4.address;
+    }
+    /**
+     * Return an object containing the Teredo properties of the address
+     * @memberof Address6
+     * @instance
+     * @returns {Object}
+     */
+    inspectTeredo() {
+        /*
+        - Bits 0 to 31 are set to the Teredo prefix (normally 2001:0000::/32).
+        - Bits 32 to 63 embed the primary IPv4 address of the Teredo server that
+          is used.
+        - Bits 64 to 79 can be used to define some flags. Currently only the
+          higher order bit is used; it is set to 1 if the Teredo client is
+          located behind a cone NAT, 0 otherwise. For Microsoft's Windows Vista
+          and Windows Server 2008 implementations, more bits are used. In those
+          implementations, the format for these 16 bits is "CRAAAAUG AAAAAAAA",
+          where "C" remains the "Cone" flag. The "R" bit is reserved for future
+          use. The "U" bit is for the Universal/Local flag (set to 0). The "G" bit
+          is Individual/Group flag (set to 0). The A bits are set to a 12-bit
+          randomly generated number chosen by the Teredo client to introduce
+          additional protection for the Teredo node against IPv6-based scanning
+          attacks.
+        - Bits 80 to 95 contains the obfuscated UDP port number. This is the
+          port number that is mapped by the NAT to the Teredo client with all
+          bits inverted.
+        - Bits 96 to 127 contains the obfuscated IPv4 address. This is the
+          public IPv4 address of the NAT with all bits inverted.
+        */
+        const prefix = this.getBitsBase16(0, 32);
+        const bitsForUdpPort = this.getBits(80, 96);
+        // eslint-disable-next-line no-bitwise
+        const udpPort = (bitsForUdpPort ^ BigInt('0xffff')).toString();
+        const server4 = ipv4_1.Address4.fromHex(this.getBitsBase16(32, 64));
+        const bitsForClient4 = this.getBits(96, 128);
+        // eslint-disable-next-line no-bitwise
+        const client4 = ipv4_1.Address4.fromHex((bitsForClient4 ^ BigInt('0xffffffff')).toString(16));
+        const flagsBase2 = this.getBitsBase2(64, 80);
+        const coneNat = (0, common_1.testBit)(flagsBase2, 15);
+        const reserved = (0, common_1.testBit)(flagsBase2, 14);
+        const groupIndividual = (0, common_1.testBit)(flagsBase2, 8);
+        const universalLocal = (0, common_1.testBit)(flagsBase2, 9);
+        const nonce = BigInt(`0b${flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16)}`).toString(10);
+        return {
+            prefix: `${prefix.slice(0, 4)}:${prefix.slice(4, 8)}`,
+            server4: server4.address,
+            client4: client4.address,
+            flags: flagsBase2,
+            coneNat,
+            microsoft: {
+                reserved,
+                universalLocal,
+                groupIndividual,
+                nonce,
+            },
+            udpPort,
+        };
+    }
+    /**
+     * Return an object containing the 6to4 properties of the address
+     * @memberof Address6
+     * @instance
+     * @returns {Object}
+     */
+    inspect6to4() {
+        /*
+        - Bits 0 to 15 are set to the 6to4 prefix (2002::/16).
+        - Bits 16 to 48 embed the IPv4 address of the 6to4 gateway that is used.
+        */
+        const prefix = this.getBitsBase16(0, 16);
+        const gateway = ipv4_1.Address4.fromHex(this.getBitsBase16(16, 48));
+        return {
+            prefix: prefix.slice(0, 4),
+            gateway: gateway.address,
+        };
+    }
+    /**
+     * Return a v6 6to4 address from a v6 v4inv6 address
+     * @memberof Address6
+     * @instance
+     * @returns {Address6}
+     */
+    to6to4() {
+        if (!this.is4()) {
+            return null;
+        }
+        const addr6to4 = [
+            '2002',
+            this.getBitsBase16(96, 112),
+            this.getBitsBase16(112, 128),
+            '',
+            '/16',
+        ].join(':');
+        return new Address6(addr6to4);
+    }
+    /**
+     * Return a byte array
+     * @memberof Address6
+     * @instance
+     * @returns {Array}
+     */
+    toByteArray() {
+        const valueWithoutPadding = this.bigInt().toString(16);
+        const leadingPad = '0'.repeat(valueWithoutPadding.length % 2);
+        const value = `${leadingPad}${valueWithoutPadding}`;
+        const bytes = [];
+        for (let i = 0, length = value.length; i < length; i += 2) {
+            bytes.push(parseInt(value.substring(i, i + 2), 16));
+        }
+        return bytes;
+    }
+    /**
+     * Return an unsigned byte array
+     * @memberof Address6
+     * @instance
+     * @returns {Array}
+     */
+    toUnsignedByteArray() {
+        return this.toByteArray().map(unsignByte);
+    }
+    /**
+     * Convert a byte array to an Address6 object
+     * @memberof Address6
+     * @static
+     * @returns {Address6}
+     */
+    static fromByteArray(bytes) {
+        return this.fromUnsignedByteArray(bytes.map(unsignByte));
+    }
+    /**
+     * Convert an unsigned byte array to an Address6 object
+     * @memberof Address6
+     * @static
+     * @returns {Address6}
+     */
+    static fromUnsignedByteArray(bytes) {
+        const BYTE_MAX = BigInt('256');
+        let result = BigInt('0');
+        let multiplier = BigInt('1');
+        for (let i = bytes.length - 1; i >= 0; i--) {
+            result += multiplier * BigInt(bytes[i].toString(10));
+            multiplier *= BYTE_MAX;
+        }
+        return Address6.fromBigInt(result);
+    }
+    /**
+     * Returns true if the address is in the canonical form, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isCanonical() {
+        return this.addressMinusSuffix === this.canonicalForm();
+    }
+    /**
+     * Returns true if the address is a link local address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isLinkLocal() {
+        // Zeroes are required, i.e. we can't check isInSubnet with 'fe80::/10'
+        if (this.getBitsBase2(0, 64) ===
+            '1111111010000000000000000000000000000000000000000000000000000000') {
+            return true;
+        }
+        return false;
+    }
+    /**
+     * Returns true if the address is a multicast address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isMulticast() {
+        return this.getType() === 'Multicast';
+    }
+    /**
+     * Returns true if the address is a v4-in-v6 address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    is4() {
+        return this.v4;
+    }
+    /**
+     * Returns true if the address is a Teredo address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isTeredo() {
+        return this.isInSubnet(new Address6('2001::/32'));
+    }
+    /**
+     * Returns true if the address is a 6to4 address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    is6to4() {
+        return this.isInSubnet(new Address6('2002::/16'));
+    }
+    /**
+     * Returns true if the address is a loopback address, false otherwise
+     * @memberof Address6
+     * @instance
+     * @returns {boolean}
+     */
+    isLoopback() {
+        return this.getType() === 'Loopback';
+    }
+    // #endregion
+    // #region HTML
+    /**
+     * @returns {String} the address in link form with a default port of 80
+     */
+    href(optionalPort) {
+        if (optionalPort === undefined) {
+            optionalPort = '';
+        }
+        else {
+            optionalPort = `:${optionalPort}`;
+        }
+        return `http://[${this.correctForm()}]${optionalPort}/`;
+    }
+    /**
+     * @returns {String} a link suitable for conveying the address via a URL hash
+     */
+    link(options) {
+        if (!options) {
+            options = {};
+        }
+        if (options.className === undefined) {
+            options.className = '';
+        }
+        if (options.prefix === undefined) {
+            options.prefix = '/#address=';
+        }
+        if (options.v4 === undefined) {
+            options.v4 = false;
+        }
+        let formFunction = this.correctForm;
+        if (options.v4) {
+            formFunction = this.to4in6;
+        }
+        const form = formFunction.call(this);
+        if (options.className) {
+            return `<a href="${options.prefix}${form}" class="${options.className}">${form}</a>`;
+        }
+        return `<a href="${options.prefix}${form}">${form}</a>`;
+    }
+    /**
+     * Groups an address
+     * @returns {String}
+     */
+    group() {
+        if (this.elidedGroups === 0) {
+            // The simple case
+            return helpers.simpleGroup(this.address).join(':');
+        }
+        assert(typeof this.elidedGroups === 'number');
+        assert(typeof this.elisionBegin === 'number');
+        // The elided case
+        const output = [];
+        const [left, right] = this.address.split('::');
+        if (left.length) {
+            output.push(...helpers.simpleGroup(left));
+        }
+        else {
+            output.push('');
+        }
+        const classes = ['hover-group'];
+        for (let i = this.elisionBegin; i < this.elisionBegin + this.elidedGroups; i++) {
+            classes.push(`group-${i}`);
+        }
+        output.push(`<span class="${classes.join(' ')}"></span>`);
+        if (right.length) {
+            output.push(...helpers.simpleGroup(right, this.elisionEnd));
+        }
+        else {
+            output.push('');
+        }
+        if (this.is4()) {
+            assert(this.address4 instanceof ipv4_1.Address4);
+            output.pop();
+            output.push(this.address4.groupForV6());
+        }
+        return output.join(':');
+    }
+    // #endregion
+    // #region Regular expressions
+    /**
+     * Generate a regular expression string that can be used to find or validate
+     * all variations of this address
+     * @memberof Address6
+     * @instance
+     * @param {boolean} substringSearch
+     * @returns {string}
+     */
+    regularExpressionString(substringSearch = false) {
+        let output = [];
+        // TODO: revisit why this is necessary
+        const address6 = new Address6(this.correctForm());
+        if (address6.elidedGroups === 0) {
+            // The simple case
+            output.push((0, regular_expressions_1.simpleRegularExpression)(address6.parsedAddress));
+        }
+        else if (address6.elidedGroups === constants6.GROUPS) {
+            // A completely elided address
+            output.push((0, regular_expressions_1.possibleElisions)(constants6.GROUPS));
+        }
+        else {
+            // A partially elided address
+            const halves = address6.address.split('::');
+            if (halves[0].length) {
+                output.push((0, regular_expressions_1.simpleRegularExpression)(halves[0].split(':')));
+            }
+            assert(typeof address6.elidedGroups === 'number');
+            output.push((0, regular_expressions_1.possibleElisions)(address6.elidedGroups, halves[0].length !== 0, halves[1].length !== 0));
+            if (halves[1].length) {
+                output.push((0, regular_expressions_1.simpleRegularExpression)(halves[1].split(':')));
+            }
+            output = [output.join(':')];
+        }
+        if (!substringSearch) {
+            output = [
+                '(?=^|',
+                regular_expressions_1.ADDRESS_BOUNDARY,
+                '|[^\\w\\:])(',
+                ...output,
+                ')(?=[^\\w\\:]|',
+                regular_expressions_1.ADDRESS_BOUNDARY,
+                '|$)',
+            ];
+        }
+        return output.join('');
+    }
+    /**
+     * Generate a regular expression that can be used to find or validate all
+     * variations of this address.
+     * @memberof Address6
+     * @instance
+     * @param {boolean} substringSearch
+     * @returns {RegExp}
+     */
+    regularExpression(substringSearch = false) {
+        return new RegExp(this.regularExpressionString(substringSearch), 'i');
+    }
+}
+exports.Address6 = Address6;
+//# sourceMappingURL=ipv6.js.map
Index: node_modules/ip-address/dist/ipv6.js.map
===================================================================
--- node_modules/ip-address/dist/ipv6.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/ipv6.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ipv6.js","sourceRoot":"","sources":["../src/ipv6.ts"],"names":[],"mappings":"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"}
Index: node_modules/ip-address/dist/v4/constants.d.ts
===================================================================
--- node_modules/ip-address/dist/v4/constants.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v4/constants.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,5 @@
+export declare const BITS = 32;
+export declare const GROUPS = 4;
+export declare const RE_ADDRESS: RegExp;
+export declare const RE_SUBNET_STRING: RegExp;
+//# sourceMappingURL=constants.d.ts.map
Index: node_modules/ip-address/dist/v4/constants.d.ts.map
===================================================================
--- node_modules/ip-address/dist/v4/constants.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v4/constants.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/v4/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,KAAK,CAAC;AACvB,eAAO,MAAM,MAAM,IAAI,CAAC;AAExB,eAAO,MAAM,UAAU,QAC8I,CAAC;AAEtK,eAAO,MAAM,gBAAgB,QAAe,CAAC"}
Index: node_modules/ip-address/dist/v4/constants.js
===================================================================
--- node_modules/ip-address/dist/v4/constants.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v4/constants.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,8 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RE_SUBNET_STRING = exports.RE_ADDRESS = exports.GROUPS = exports.BITS = void 0;
+exports.BITS = 32;
+exports.GROUPS = 4;
+exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g;
+exports.RE_SUBNET_STRING = /\/\d{1,2}$/;
+//# sourceMappingURL=constants.js.map
Index: node_modules/ip-address/dist/v4/constants.js.map
===================================================================
--- node_modules/ip-address/dist/v4/constants.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v4/constants.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/v4/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG,EAAE,CAAC;AACV,QAAA,MAAM,GAAG,CAAC,CAAC;AAEX,QAAA,UAAU,GACrB,mKAAmK,CAAC;AAEzJ,QAAA,gBAAgB,GAAG,YAAY,CAAC"}
Index: node_modules/ip-address/dist/v6/constants.d.ts
===================================================================
--- node_modules/ip-address/dist/v6/constants.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/constants.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,45 @@
+export declare const BITS = 128;
+export declare const GROUPS = 8;
+/**
+ * Represents IPv6 address scopes
+ * @memberof Address6
+ * @static
+ */
+export declare const SCOPES: {
+    [key: number]: string | undefined;
+};
+/**
+ * Represents IPv6 address types
+ * @memberof Address6
+ * @static
+ */
+export declare const TYPES: {
+    [key: string]: string | undefined;
+};
+/**
+ * A regular expression that matches bad characters in an IPv6 address
+ * @memberof Address6
+ * @static
+ */
+export declare const RE_BAD_CHARACTERS: RegExp;
+/**
+ * A regular expression that matches an incorrect IPv6 address
+ * @memberof Address6
+ * @static
+ */
+export declare const RE_BAD_ADDRESS: RegExp;
+/**
+ * A regular expression that matches an IPv6 subnet
+ * @memberof Address6
+ * @static
+ */
+export declare const RE_SUBNET_STRING: RegExp;
+/**
+ * A regular expression that matches an IPv6 zone
+ * @memberof Address6
+ * @static
+ */
+export declare const RE_ZONE_STRING: RegExp;
+export declare const RE_URL: RegExp;
+export declare const RE_URL_WITH_PORT: RegExp;
+//# sourceMappingURL=constants.d.ts.map
Index: node_modules/ip-address/dist/v6/constants.d.ts.map
===================================================================
--- node_modules/ip-address/dist/v6/constants.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/constants.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/v6/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,MAAM,CAAC;AACxB,eAAO,MAAM,MAAM,IAAI,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAS9C,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAuB7C,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAqB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAA6C,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,QAAqB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAS,CAAC;AAErC,eAAO,MAAM,MAAM,QAAgC,CAAC;AACpD,eAAO,MAAM,gBAAgB,QAAkC,CAAC"}
Index: node_modules/ip-address/dist/v6/constants.js
===================================================================
--- node_modules/ip-address/dist/v6/constants.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/constants.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,76 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RE_URL_WITH_PORT = exports.RE_URL = exports.RE_ZONE_STRING = exports.RE_SUBNET_STRING = exports.RE_BAD_ADDRESS = exports.RE_BAD_CHARACTERS = exports.TYPES = exports.SCOPES = exports.GROUPS = exports.BITS = void 0;
+exports.BITS = 128;
+exports.GROUPS = 8;
+/**
+ * Represents IPv6 address scopes
+ * @memberof Address6
+ * @static
+ */
+exports.SCOPES = {
+    0: 'Reserved',
+    1: 'Interface local',
+    2: 'Link local',
+    4: 'Admin local',
+    5: 'Site local',
+    8: 'Organization local',
+    14: 'Global',
+    15: 'Reserved',
+};
+/**
+ * Represents IPv6 address types
+ * @memberof Address6
+ * @static
+ */
+exports.TYPES = {
+    'ff01::1/128': 'Multicast (All nodes on this interface)',
+    'ff01::2/128': 'Multicast (All routers on this interface)',
+    'ff02::1/128': 'Multicast (All nodes on this link)',
+    'ff02::2/128': 'Multicast (All routers on this link)',
+    'ff05::2/128': 'Multicast (All routers in this site)',
+    'ff02::5/128': 'Multicast (OSPFv3 AllSPF routers)',
+    'ff02::6/128': 'Multicast (OSPFv3 AllDR routers)',
+    'ff02::9/128': 'Multicast (RIP routers)',
+    'ff02::a/128': 'Multicast (EIGRP routers)',
+    'ff02::d/128': 'Multicast (PIM routers)',
+    'ff02::16/128': 'Multicast (MLDv2 reports)',
+    'ff01::fb/128': 'Multicast (mDNSv6)',
+    'ff02::fb/128': 'Multicast (mDNSv6)',
+    'ff05::fb/128': 'Multicast (mDNSv6)',
+    'ff02::1:2/128': 'Multicast (All DHCP servers and relay agents on this link)',
+    'ff05::1:2/128': 'Multicast (All DHCP servers and relay agents in this site)',
+    'ff02::1:3/128': 'Multicast (All DHCP servers on this link)',
+    'ff05::1:3/128': 'Multicast (All DHCP servers in this site)',
+    '::/128': 'Unspecified',
+    '::1/128': 'Loopback',
+    'ff00::/8': 'Multicast',
+    'fe80::/10': 'Link-local unicast',
+};
+/**
+ * A regular expression that matches bad characters in an IPv6 address
+ * @memberof Address6
+ * @static
+ */
+exports.RE_BAD_CHARACTERS = /([^0-9a-f:/%])/gi;
+/**
+ * A regular expression that matches an incorrect IPv6 address
+ * @memberof Address6
+ * @static
+ */
+exports.RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi;
+/**
+ * A regular expression that matches an IPv6 subnet
+ * @memberof Address6
+ * @static
+ */
+exports.RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/;
+/**
+ * A regular expression that matches an IPv6 zone
+ * @memberof Address6
+ * @static
+ */
+exports.RE_ZONE_STRING = /%.*$/;
+exports.RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/;
+exports.RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/;
+//# sourceMappingURL=constants.js.map
Index: node_modules/ip-address/dist/v6/constants.js.map
===================================================================
--- node_modules/ip-address/dist/v6/constants.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/constants.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/v6/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,MAAM,GAAG,CAAC,CAAC;AAExB;;;;GAIG;AACU,QAAA,MAAM,GAA0C;IAC3D,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,oBAAoB;IACvB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,UAAU;CACN,CAAC;AAEX;;;;GAIG;AACU,QAAA,KAAK,GAA0C;IAC1D,aAAa,EAAE,yCAAyC;IACxD,aAAa,EAAE,2CAA2C;IAC1D,aAAa,EAAE,oCAAoC;IACnD,aAAa,EAAE,sCAAsC;IACrD,aAAa,EAAE,sCAAsC;IACrD,aAAa,EAAE,mCAAmC;IAClD,aAAa,EAAE,kCAAkC;IACjD,aAAa,EAAE,yBAAyB;IACxC,aAAa,EAAE,2BAA2B;IAC1C,aAAa,EAAE,yBAAyB;IACxC,cAAc,EAAE,2BAA2B;IAC3C,cAAc,EAAE,oBAAoB;IACpC,cAAc,EAAE,oBAAoB;IACpC,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,4DAA4D;IAC7E,eAAe,EAAE,4DAA4D;IAC7E,eAAe,EAAE,2CAA2C;IAC5D,eAAe,EAAE,2CAA2C;IAC5D,QAAQ,EAAE,aAAa;IACvB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,oBAAoB;CACzB,CAAC;AAEX;;;;GAIG;AACU,QAAA,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;;GAIG;AACU,QAAA,cAAc,GAAG,0CAA0C,CAAC;AAEzE;;;;GAIG;AACU,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAEnD;;;;GAIG;AACU,QAAA,cAAc,GAAG,MAAM,CAAC;AAExB,QAAA,MAAM,GAAG,6BAA6B,CAAC;AACvC,QAAA,gBAAgB,GAAG,+BAA+B,CAAC"}
Index: node_modules/ip-address/dist/v6/helpers.d.ts
===================================================================
--- node_modules/ip-address/dist/v6/helpers.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/helpers.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,18 @@
+/**
+ * @returns {String} the string with all zeroes contained in a <span>
+ */
+export declare function spanAllZeroes(s: string): string;
+/**
+ * @returns {String} the string with each character contained in a <span>
+ */
+export declare function spanAll(s: string, offset?: number): string;
+/**
+ * @returns {String} the string with leading zeroes contained in a <span>
+ */
+export declare function spanLeadingZeroes(address: string): string;
+/**
+ * Groups an address
+ * @returns {String} a grouped address
+ */
+export declare function simpleGroup(addressString: string, offset?: number): string[];
+//# sourceMappingURL=helpers.d.ts.map
Index: node_modules/ip-address/dist/v6/helpers.d.ts.map
===================================================================
--- node_modules/ip-address/dist/v6/helpers.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/helpers.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/v6/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAQ7D;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,EAAE,CAU/E"}
Index: node_modules/ip-address/dist/v6/helpers.js
===================================================================
--- node_modules/ip-address/dist/v6/helpers.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/helpers.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,45 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.spanAllZeroes = spanAllZeroes;
+exports.spanAll = spanAll;
+exports.spanLeadingZeroes = spanLeadingZeroes;
+exports.simpleGroup = simpleGroup;
+/**
+ * @returns {String} the string with all zeroes contained in a <span>
+ */
+function spanAllZeroes(s) {
+    return s.replace(/(0+)/g, '<span class="zero">$1</span>');
+}
+/**
+ * @returns {String} the string with each character contained in a <span>
+ */
+function spanAll(s, offset = 0) {
+    const letters = s.split('');
+    return letters
+        .map((n, i) => `<span class="digit value-${n} position-${i + offset}">${spanAllZeroes(n)}</span>`)
+        .join('');
+}
+function spanLeadingZeroesSimple(group) {
+    return group.replace(/^(0+)/, '<span class="zero">$1</span>');
+}
+/**
+ * @returns {String} the string with leading zeroes contained in a <span>
+ */
+function spanLeadingZeroes(address) {
+    const groups = address.split(':');
+    return groups.map((g) => spanLeadingZeroesSimple(g)).join(':');
+}
+/**
+ * Groups an address
+ * @returns {String} a grouped address
+ */
+function simpleGroup(addressString, offset = 0) {
+    const groups = addressString.split(':');
+    return groups.map((g, i) => {
+        if (/group-v4/.test(g)) {
+            return g;
+        }
+        return `<span class="hover-group group-${i + offset}">${spanLeadingZeroesSimple(g)}</span>`;
+    });
+}
+//# sourceMappingURL=helpers.js.map
Index: node_modules/ip-address/dist/v6/helpers.js.map
===================================================================
--- node_modules/ip-address/dist/v6/helpers.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/helpers.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/v6/helpers.ts"],"names":[],"mappings":";;AAGA,sCAEC;AAKD,0BAQC;AASD,8CAIC;AAMD,kCAUC;AA/CD;;GAEG;AACH,SAAgB,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,OAAO,CAAC,CAAS,EAAE,SAAiB,CAAC;IACnD,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE5B,OAAO,OAAO;SACX,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,4BAA4B,CAAC,aAAa,CAAC,GAAG,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAC7F;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CAAC,aAAqB,EAAE,SAAiB,CAAC;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,kCAAkC,CAAC,GAAG,MAAM,KAAK,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC"}
Index: node_modules/ip-address/dist/v6/regular-expressions.d.ts
===================================================================
--- node_modules/ip-address/dist/v6/regular-expressions.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/regular-expressions.d.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,6 @@
+export declare function groupPossibilities(possibilities: string[]): string;
+export declare function padGroup(group: string): string;
+export declare const ADDRESS_BOUNDARY = "[^A-Fa-f0-9:]";
+export declare function simpleRegularExpression(groups: string[]): string;
+export declare function possibleElisions(elidedGroups: number, moreLeft?: boolean, moreRight?: boolean): string;
+//# sourceMappingURL=regular-expressions.d.ts.map
Index: node_modules/ip-address/dist/v6/regular-expressions.d.ts.map
===================================================================
--- node_modules/ip-address/dist/v6/regular-expressions.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/regular-expressions.d.ts.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"regular-expressions.d.ts","sourceRoot":"","sources":["../../src/v6/regular-expressions.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAElE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UA+BvD;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,OAAO,GAClB,MAAM,CAwCR"}
Index: node_modules/ip-address/dist/v6/regular-expressions.js
===================================================================
--- node_modules/ip-address/dist/v6/regular-expressions.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/regular-expressions.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,95 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ADDRESS_BOUNDARY = void 0;
+exports.groupPossibilities = groupPossibilities;
+exports.padGroup = padGroup;
+exports.simpleRegularExpression = simpleRegularExpression;
+exports.possibleElisions = possibleElisions;
+const v6 = __importStar(require("./constants"));
+function groupPossibilities(possibilities) {
+    return `(${possibilities.join('|')})`;
+}
+function padGroup(group) {
+    if (group.length < 4) {
+        return `0{0,${4 - group.length}}${group}`;
+    }
+    return group;
+}
+exports.ADDRESS_BOUNDARY = '[^A-Fa-f0-9:]';
+function simpleRegularExpression(groups) {
+    const zeroIndexes = [];
+    groups.forEach((group, i) => {
+        const groupInteger = parseInt(group, 16);
+        if (groupInteger === 0) {
+            zeroIndexes.push(i);
+        }
+    });
+    // You can technically elide a single 0, this creates the regular expressions
+    // to match that eventuality
+    const possibilities = zeroIndexes.map((zeroIndex) => groups
+        .map((group, i) => {
+        if (i === zeroIndex) {
+            const elision = i === 0 || i === v6.GROUPS - 1 ? ':' : '';
+            return groupPossibilities([padGroup(group), elision]);
+        }
+        return padGroup(group);
+    })
+        .join(':'));
+    // The simplest case
+    possibilities.push(groups.map(padGroup).join(':'));
+    return groupPossibilities(possibilities);
+}
+function possibleElisions(elidedGroups, moreLeft, moreRight) {
+    const left = moreLeft ? '' : ':';
+    const right = moreRight ? '' : ':';
+    const possibilities = [];
+    // 1. elision of everything (::)
+    if (!moreLeft && !moreRight) {
+        possibilities.push('::');
+    }
+    // 2. complete elision of the middle
+    if (moreLeft && moreRight) {
+        possibilities.push('');
+    }
+    if ((moreRight && !moreLeft) || (!moreRight && moreLeft)) {
+        // 3. complete elision of one side
+        possibilities.push(':');
+    }
+    // 4. elision from the left side
+    possibilities.push(`${left}(:0{1,4}){1,${elidedGroups - 1}}`);
+    // 5. elision from the right side
+    possibilities.push(`(0{1,4}:){1,${elidedGroups - 1}}${right}`);
+    // 6. no elision
+    possibilities.push(`(0{1,4}:){${elidedGroups - 1}}0{1,4}`);
+    // 7. elision (including sloppy elision) from the middle
+    for (let groups = 1; groups < elidedGroups - 1; groups++) {
+        for (let position = 1; position < elidedGroups - groups; position++) {
+            possibilities.push(`(0{1,4}:){${position}}:(0{1,4}:){${elidedGroups - position - groups - 1}}0{1,4}`);
+        }
+    }
+    return groupPossibilities(possibilities);
+}
+//# sourceMappingURL=regular-expressions.js.map
Index: node_modules/ip-address/dist/v6/regular-expressions.js.map
===================================================================
--- node_modules/ip-address/dist/v6/regular-expressions.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/dist/v6/regular-expressions.js.map	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"regular-expressions.js","sourceRoot":"","sources":["../../src/v6/regular-expressions.ts"],"names":[],"mappings":"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"}
Index: node_modules/ip-address/package.json
===================================================================
--- node_modules/ip-address/package.json	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/package.json	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,78 @@
+{
+  "name": "ip-address",
+  "description": "A library for parsing IPv4 and IPv6 IP addresses in node and the browser.",
+  "keywords": [
+    "ipv6",
+    "ipv4",
+    "browser",
+    "validation"
+  ],
+  "version": "10.1.0",
+  "author": "Beau Gunderson <beau@beaugunderson.com> (https://beaugunderson.com/)",
+  "license": "MIT",
+  "main": "dist/ip-address.js",
+  "types": "dist/ip-address.d.ts",
+  "scripts": {
+    "docs": "documentation build --github --output docs --format html ./ip-address.js",
+    "build": "rm -rf dist; mkdir dist; tsc",
+    "prepack": "npm run build",
+    "release": "release-it",
+    "test-ci": "nyc mocha",
+    "test": "mocha",
+    "watch": "mocha --watch"
+  },
+  "nyc": {
+    "extension": [
+      ".ts"
+    ],
+    "exclude": [
+      "**/*.d.ts",
+      ".eslintrc.js",
+      "coverage/",
+      "dist/",
+      "test/",
+      "tmp/"
+    ],
+    "reporter": [
+      "html",
+      "lcov",
+      "text"
+    ],
+    "all": true
+  },
+  "engines": {
+    "node": ">= 12"
+  },
+  "files": [
+    "src",
+    "dist"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/beaugunderson/ip-address.git"
+  },
+  "devDependencies": {
+    "@types/chai": "^5.0.0",
+    "@types/mocha": "^10.0.8",
+    "@typescript-eslint/eslint-plugin": "^8.8.0",
+    "@typescript-eslint/parser": "^8.8.0",
+    "chai": "^5.1.1",
+    "documentation": "^14.0.3",
+    "eslint": "^8.50.0",
+    "eslint_d": "^14.0.4",
+    "eslint-config-airbnb": "^19.0.4",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-plugin-filenames": "^1.3.2",
+    "eslint-plugin-import": "^2.30.0",
+    "eslint-plugin-jsx-a11y": "^6.10.0",
+    "eslint-plugin-prettier": "^5.2.1",
+    "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
+    "mocha": "^10.7.3",
+    "nyc": "^17.1.0",
+    "prettier": "^3.3.3",
+    "release-it": "^17.6.0",
+    "source-map-support": "^0.5.21",
+    "tsx": "^4.19.1",
+    "typescript": "<5.6.0"
+  }
+}
Index: node_modules/ip-address/src/address-error.ts
===================================================================
--- node_modules/ip-address/src/address-error.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/address-error.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,11 @@
+export class AddressError extends Error {
+  parseMessage?: string;
+
+  constructor(message: string, parseMessage?: string) {
+    super(message);
+
+    this.name = 'AddressError';
+
+    this.parseMessage = parseMessage;
+  }
+}
Index: node_modules/ip-address/src/common.ts
===================================================================
--- node_modules/ip-address/src/common.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/common.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,55 @@
+import { Address4 } from './ipv4';
+import { Address6 } from './ipv6';
+
+export interface ReverseFormOptions {
+  omitSuffix?: boolean;
+}
+
+export function isInSubnet(this: Address4 | Address6, address: Address4 | Address6) {
+  if (this.subnetMask < address.subnetMask) {
+    return false;
+  }
+
+  if (this.mask(address.subnetMask) === address.mask()) {
+    return true;
+  }
+
+  return false;
+}
+
+export function isCorrect(defaultBits: number) {
+  return function (this: Address4 | Address6) {
+    if (this.addressMinusSuffix !== this.correctForm()) {
+      return false;
+    }
+
+    if (this.subnetMask === defaultBits && !this.parsedSubnet) {
+      return true;
+    }
+
+    return this.parsedSubnet === String(this.subnetMask);
+  };
+}
+
+export function numberToPaddedHex(number: number) {
+  return number.toString(16).padStart(2, '0');
+}
+
+export function stringToPaddedHex(numberString: string) {
+  return numberToPaddedHex(parseInt(numberString, 10));
+}
+
+/**
+ * @param binaryValue Binary representation of a value (e.g. `10`)
+ * @param position Byte position, where 0 is the least significant bit
+ */
+export function testBit(binaryValue: string, position: number): boolean {
+  const { length } = binaryValue;
+
+  if (position > length) {
+    return false;
+  }
+
+  const positionInString = length - position;
+  return binaryValue.substring(positionInString, positionInString + 1) === '1';
+}
Index: node_modules/ip-address/src/ip-address.ts
===================================================================
--- node_modules/ip-address/src/ip-address.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/ip-address.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,7 @@
+export { Address4 } from './ipv4';
+export { Address6 } from './ipv6';
+export { AddressError } from './address-error';
+
+import * as helpers from './v6/helpers';
+
+export const v6 = { helpers };
Index: node_modules/ip-address/src/ipv4.ts
===================================================================
--- node_modules/ip-address/src/ipv4.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/ipv4.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,394 @@
+/* eslint-disable no-param-reassign */
+
+import * as common from './common';
+import * as constants from './v4/constants';
+import { AddressError } from './address-error';
+
+/**
+ * Represents an IPv4 address
+ * @class Address4
+ * @param {string} address - An IPv4 address string
+ */
+export class Address4 {
+  address: string;
+  addressMinusSuffix?: string;
+  groups: number = constants.GROUPS;
+  parsedAddress: string[] = [];
+  parsedSubnet: string = '';
+  subnet: string = '/32';
+  subnetMask: number = 32;
+  v4: boolean = true;
+
+  constructor(address: string) {
+    this.address = address;
+
+    const subnet = constants.RE_SUBNET_STRING.exec(address);
+
+    if (subnet) {
+      this.parsedSubnet = subnet[0].replace('/', '');
+      this.subnetMask = parseInt(this.parsedSubnet, 10);
+      this.subnet = `/${this.subnetMask}`;
+
+      if (this.subnetMask < 0 || this.subnetMask > constants.BITS) {
+        throw new AddressError('Invalid subnet mask.');
+      }
+
+      address = address.replace(constants.RE_SUBNET_STRING, '');
+    }
+
+    this.addressMinusSuffix = address;
+
+    this.parsedAddress = this.parse(address);
+  }
+
+  static isValid(address: string): boolean {
+    try {
+      // eslint-disable-next-line no-new
+      new Address4(address);
+
+      return true;
+    } catch (e) {
+      return false;
+    }
+  }
+
+  /*
+   * Parses a v4 address
+   */
+  parse(address: string) {
+    const groups = address.split('.');
+
+    if (!address.match(constants.RE_ADDRESS)) {
+      throw new AddressError('Invalid IPv4 address.');
+    }
+
+    return groups;
+  }
+
+  /**
+   * Returns the correct form of an address
+   * @memberof Address4
+   * @instance
+   * @returns {String}
+   */
+  correctForm(): string {
+    return this.parsedAddress.map((part) => parseInt(part, 10)).join('.');
+  }
+
+  /**
+   * Returns true if the address is correct, false otherwise
+   * @memberof Address4
+   * @instance
+   * @returns {Boolean}
+   */
+  isCorrect = common.isCorrect(constants.BITS);
+
+  /**
+   * Converts a hex string to an IPv4 address object
+   * @memberof Address4
+   * @static
+   * @param {string} hex - a hex string to convert
+   * @returns {Address4}
+   */
+  static fromHex(hex: string): Address4 {
+    const padded = hex.replace(/:/g, '').padStart(8, '0');
+    const groups = [];
+    let i;
+
+    for (i = 0; i < 8; i += 2) {
+      const h = padded.slice(i, i + 2);
+
+      groups.push(parseInt(h, 16));
+    }
+
+    return new Address4(groups.join('.'));
+  }
+
+  /**
+   * Converts an integer into a IPv4 address object
+   * @memberof Address4
+   * @static
+   * @param {integer} integer - a number to convert
+   * @returns {Address4}
+   */
+  static fromInteger(integer: number): Address4 {
+    return Address4.fromHex(integer.toString(16));
+  }
+
+  /**
+   * Return an address from in-addr.arpa form
+   * @memberof Address4
+   * @static
+   * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address
+   * @returns {Adress4}
+   * @example
+   * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.)
+   * address.correctForm(); // '192.0.2.42'
+   */
+  static fromArpa(arpaFormAddress: string): Address4 {
+    // remove ending ".in-addr.arpa." or just "."
+    const leader = arpaFormAddress.replace(/(\.in-addr\.arpa)?\.$/, '');
+
+    const address = leader.split('.').reverse().join('.');
+
+    return new Address4(address);
+  }
+
+  /**
+   * Converts an IPv4 address object to a hex string
+   * @memberof Address4
+   * @instance
+   * @returns {String}
+   */
+  toHex(): string {
+    return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':');
+  }
+
+  /**
+   * Converts an IPv4 address object to an array of bytes
+   * @memberof Address4
+   * @instance
+   * @returns {Array}
+   */
+  toArray(): number[] {
+    return this.parsedAddress.map((part) => parseInt(part, 10));
+  }
+
+  /**
+   * Converts an IPv4 address object to an IPv6 address group
+   * @memberof Address4
+   * @instance
+   * @returns {String}
+   */
+  toGroup6(): string {
+    const output = [];
+    let i;
+
+    for (i = 0; i < constants.GROUPS; i += 2) {
+      output.push(
+        `${common.stringToPaddedHex(this.parsedAddress[i])}${common.stringToPaddedHex(
+          this.parsedAddress[i + 1],
+        )}`,
+      );
+    }
+
+    return output.join(':');
+  }
+
+  /**
+   * Returns the address as a `bigint`
+   * @memberof Address4
+   * @instance
+   * @returns {bigint}
+   */
+  bigInt(): bigint {
+    return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`);
+  }
+
+  /**
+   * Helper function getting start address.
+   * @memberof Address4
+   * @instance
+   * @returns {bigint}
+   */
+  _startAddress(): bigint {
+    return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`);
+  }
+
+  /**
+   * The first address in the range given by this address' subnet.
+   * Often referred to as the Network Address.
+   * @memberof Address4
+   * @instance
+   * @returns {Address4}
+   */
+  startAddress(): Address4 {
+    return Address4.fromBigInt(this._startAddress());
+  }
+
+  /**
+   * The first host address in the range given by this address's subnet ie
+   * the first address after the Network Address
+   * @memberof Address4
+   * @instance
+   * @returns {Address4}
+   */
+  startAddressExclusive(): Address4 {
+    const adjust = BigInt('1');
+    return Address4.fromBigInt(this._startAddress() + adjust);
+  }
+
+  /**
+   * Helper function getting end address.
+   * @memberof Address4
+   * @instance
+   * @returns {bigint}
+   */
+  _endAddress(): bigint {
+    return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`);
+  }
+
+  /**
+   * The last address in the range given by this address' subnet
+   * Often referred to as the Broadcast
+   * @memberof Address4
+   * @instance
+   * @returns {Address4}
+   */
+  endAddress(): Address4 {
+    return Address4.fromBigInt(this._endAddress());
+  }
+
+  /**
+   * The last host address in the range given by this address's subnet ie
+   * the last address prior to the Broadcast Address
+   * @memberof Address4
+   * @instance
+   * @returns {Address4}
+   */
+  endAddressExclusive(): Address4 {
+    const adjust = BigInt('1');
+    return Address4.fromBigInt(this._endAddress() - adjust);
+  }
+
+  /**
+   * Converts a BigInt to a v4 address object
+   * @memberof Address4
+   * @static
+   * @param {bigint} bigInt - a BigInt to convert
+   * @returns {Address4}
+   */
+  static fromBigInt(bigInt: bigint): Address4 {
+    return Address4.fromHex(bigInt.toString(16));
+  }
+
+  /**
+   * Convert a byte array to an Address4 object
+   * @memberof Address4
+   * @static
+   * @param {Array<number>} bytes - an array of 4 bytes (0-255)
+   * @returns {Address4}
+   */
+  static fromByteArray(bytes: Array<number>): Address4 {
+    if (bytes.length !== 4) {
+      throw new AddressError('IPv4 addresses require exactly 4 bytes');
+    }
+
+    // Validate that all bytes are within valid range (0-255)
+    for (let i = 0; i < bytes.length; i++) {
+      if (!Number.isInteger(bytes[i]) || bytes[i] < 0 || bytes[i] > 255) {
+        throw new AddressError('All bytes must be integers between 0 and 255');
+      }
+    }
+
+    return this.fromUnsignedByteArray(bytes);
+  }
+
+  /**
+   * Convert an unsigned byte array to an Address4 object
+   * @memberof Address4
+   * @static
+   * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)
+   * @returns {Address4}
+   */
+  static fromUnsignedByteArray(bytes: Array<number>): Address4 {
+    if (bytes.length !== 4) {
+      throw new AddressError('IPv4 addresses require exactly 4 bytes');
+    }
+
+    const address = bytes.join('.');
+    return new Address4(address);
+  }
+
+  /**
+   * Returns the first n bits of the address, defaulting to the
+   * subnet mask
+   * @memberof Address4
+   * @instance
+   * @returns {String}
+   */
+  mask(mask?: number): string {
+    if (mask === undefined) {
+      mask = this.subnetMask;
+    }
+
+    return this.getBitsBase2(0, mask);
+  }
+
+  /**
+   * Returns the bits in the given range as a base-2 string
+   * @memberof Address4
+   * @instance
+   * @returns {string}
+   */
+  getBitsBase2(start: number, end: number): string {
+    return this.binaryZeroPad().slice(start, end);
+  }
+
+  /**
+   * Return the reversed ip6.arpa form of the address
+   * @memberof Address4
+   * @param {Object} options
+   * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
+   * @instance
+   * @returns {String}
+   */
+  reverseForm(options?: common.ReverseFormOptions): string {
+    if (!options) {
+      options = {};
+    }
+
+    const reversed = this.correctForm().split('.').reverse().join('.');
+
+    if (options.omitSuffix) {
+      return reversed;
+    }
+
+    return `${reversed}.in-addr.arpa.`;
+  }
+
+  /**
+   * Returns true if the given address is in the subnet of the current address
+   * @memberof Address4
+   * @instance
+   * @returns {boolean}
+   */
+  isInSubnet = common.isInSubnet;
+
+  /**
+   * Returns true if the given address is a multicast address
+   * @memberof Address4
+   * @instance
+   * @returns {boolean}
+   */
+  isMulticast(): boolean {
+    return this.isInSubnet(new Address4('224.0.0.0/4'));
+  }
+
+  /**
+   * Returns a zero-padded base-2 string representation of the address
+   * @memberof Address4
+   * @instance
+   * @returns {string}
+   */
+  binaryZeroPad(): string {
+    return this.bigInt().toString(2).padStart(constants.BITS, '0');
+  }
+
+  /**
+   * Groups an IPv4 address for inclusion at the end of an IPv6 address
+   * @returns {String}
+   */
+  groupForV6(): string {
+    const segments = this.parsedAddress;
+
+    return this.address.replace(
+      constants.RE_ADDRESS,
+      `<span class="hover-group group-v4 group-6">${segments
+        .slice(0, 2)
+        .join('.')}</span>.<span class="hover-group group-v4 group-7">${segments
+        .slice(2, 4)
+        .join('.')}</span>`,
+    );
+  }
+}
Index: node_modules/ip-address/src/ipv6.ts
===================================================================
--- node_modules/ip-address/src/ipv6.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/ipv6.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,1212 @@
+/* eslint-disable prefer-destructuring */
+/* eslint-disable no-param-reassign */
+
+import * as common from './common';
+import * as constants4 from './v4/constants';
+import * as constants6 from './v6/constants';
+import * as helpers from './v6/helpers';
+import { Address4 } from './ipv4';
+import {
+  ADDRESS_BOUNDARY,
+  possibleElisions,
+  simpleRegularExpression,
+} from './v6/regular-expressions';
+import { AddressError } from './address-error';
+import { testBit } from './common';
+
+function assert(condition: any): asserts condition {
+  if (!condition) {
+    throw new Error('Assertion failed.');
+  }
+}
+
+function addCommas(number: string): string {
+  const r = /(\d+)(\d{3})/;
+
+  while (r.test(number)) {
+    number = number.replace(r, '$1,$2');
+  }
+
+  return number;
+}
+
+function spanLeadingZeroes4(n: string): string {
+  n = n.replace(/^(0{1,})([1-9]+)$/, '<span class="parse-error">$1</span>$2');
+  n = n.replace(/^(0{1,})(0)$/, '<span class="parse-error">$1</span>$2');
+
+  return n;
+}
+
+/*
+ * A helper function to compact an array
+ */
+function compact(address: string[], slice: number[]) {
+  const s1 = [];
+  const s2 = [];
+  let i;
+
+  for (i = 0; i < address.length; i++) {
+    if (i < slice[0]) {
+      s1.push(address[i]);
+    } else if (i > slice[1]) {
+      s2.push(address[i]);
+    }
+  }
+
+  return s1.concat(['compact']).concat(s2);
+}
+
+function paddedHex(octet: string): string {
+  return parseInt(octet, 16).toString(16).padStart(4, '0');
+}
+
+function unsignByte(b: number) {
+  // eslint-disable-next-line no-bitwise
+  return b & 0xff;
+}
+
+interface SixToFourProperties {
+  prefix: string;
+  gateway: string;
+}
+
+interface TeredoProperties {
+  prefix: string;
+  server4: string;
+  client4: string;
+  flags: string;
+  coneNat: boolean;
+  microsoft: {
+    reserved: boolean;
+    universalLocal: boolean;
+    groupIndividual: boolean;
+    nonce: string;
+  };
+  udpPort: string;
+}
+
+/**
+ * Represents an IPv6 address
+ * @class Address6
+ * @param {string} address - An IPv6 address string
+ * @param {number} [groups=8] - How many octets to parse
+ * @example
+ * var address = new Address6('2001::/32');
+ */
+export class Address6 {
+  address4?: Address4;
+  address: string;
+  addressMinusSuffix: string = '';
+  elidedGroups?: number;
+  elisionBegin?: number;
+  elisionEnd?: number;
+  groups: number;
+  parsedAddress4?: string;
+  parsedAddress: string[];
+  parsedSubnet: string = '';
+  subnet: string = '/128';
+  subnetMask: number = 128;
+  v4: boolean = false;
+  zone: string = '';
+
+  constructor(address: string, optionalGroups?: number) {
+    if (optionalGroups === undefined) {
+      this.groups = constants6.GROUPS;
+    } else {
+      this.groups = optionalGroups;
+    }
+
+    this.address = address;
+
+    const subnet = constants6.RE_SUBNET_STRING.exec(address);
+
+    if (subnet) {
+      this.parsedSubnet = subnet[0].replace('/', '');
+      this.subnetMask = parseInt(this.parsedSubnet, 10);
+      this.subnet = `/${this.subnetMask}`;
+
+      if (
+        Number.isNaN(this.subnetMask) ||
+        this.subnetMask < 0 ||
+        this.subnetMask > constants6.BITS
+      ) {
+        throw new AddressError('Invalid subnet mask.');
+      }
+
+      address = address.replace(constants6.RE_SUBNET_STRING, '');
+    } else if (/\//.test(address)) {
+      throw new AddressError('Invalid subnet mask.');
+    }
+
+    const zone = constants6.RE_ZONE_STRING.exec(address);
+
+    if (zone) {
+      this.zone = zone[0];
+
+      address = address.replace(constants6.RE_ZONE_STRING, '');
+    }
+
+    this.addressMinusSuffix = address;
+
+    this.parsedAddress = this.parse(this.addressMinusSuffix);
+  }
+
+  static isValid(address: string): boolean {
+    try {
+      // eslint-disable-next-line no-new
+      new Address6(address);
+
+      return true;
+    } catch (e) {
+      return false;
+    }
+  }
+
+  /**
+   * Convert a BigInt to a v6 address object
+   * @memberof Address6
+   * @static
+   * @param {bigint} bigInt - a BigInt to convert
+   * @returns {Address6}
+   * @example
+   * var bigInt = BigInt('1000000000000');
+   * var address = Address6.fromBigInt(bigInt);
+   * address.correctForm(); // '::e8:d4a5:1000'
+   */
+  static fromBigInt(bigInt: bigint): Address6 {
+    const hex = bigInt.toString(16).padStart(32, '0');
+    const groups = [];
+    let i;
+
+    for (i = 0; i < constants6.GROUPS; i++) {
+      groups.push(hex.slice(i * 4, (i + 1) * 4));
+    }
+
+    return new Address6(groups.join(':'));
+  }
+
+  /**
+   * Convert a URL (with optional port number) to an address object
+   * @memberof Address6
+   * @static
+   * @param {string} url - a URL with optional port number
+   * @example
+   * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');
+   * addressAndPort.address.correctForm(); // 'ffff::'
+   * addressAndPort.port; // 8080
+   */
+  static fromURL(url: string) {
+    let host: string;
+    let port: string | number | null = null;
+    let result: string[] | null;
+
+    // If we have brackets parse them and find a port
+    if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {
+      result = constants6.RE_URL_WITH_PORT.exec(url);
+
+      if (result === null) {
+        return {
+          error: 'failed to parse address with port',
+          address: null,
+          port: null,
+        };
+      }
+
+      host = result[1];
+      port = result[2];
+      // If there's a URL extract the address
+    } else if (url.indexOf('/') !== -1) {
+      // Remove the protocol prefix
+      url = url.replace(/^[a-z0-9]+:\/\//, '');
+
+      // Parse the address
+      result = constants6.RE_URL.exec(url);
+
+      if (result === null) {
+        return {
+          error: 'failed to parse address from URL',
+          address: null,
+          port: null,
+        };
+      }
+
+      host = result[1];
+      // Otherwise just assign the URL to the host and let the library parse it
+    } else {
+      host = url;
+    }
+
+    // If there's a port convert it to an integer
+    if (port) {
+      port = parseInt(port, 10);
+
+      // squelch out of range ports
+      if (port < 0 || port > 65536) {
+        port = null;
+      }
+    } else {
+      // Standardize `undefined` to `null`
+      port = null;
+    }
+
+    return {
+      address: new Address6(host),
+      port,
+    };
+  }
+
+  /**
+   * Create an IPv6-mapped address given an IPv4 address
+   * @memberof Address6
+   * @static
+   * @param {string} address - An IPv4 address string
+   * @returns {Address6}
+   * @example
+   * var address = Address6.fromAddress4('192.168.0.1');
+   * address.correctForm(); // '::ffff:c0a8:1'
+   * address.to4in6(); // '::ffff:192.168.0.1'
+   */
+  static fromAddress4(address: string): Address6 {
+    const address4 = new Address4(address);
+
+    const mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);
+
+    return new Address6(`::ffff:${address4.correctForm()}/${mask6}`);
+  }
+
+  /**
+   * Return an address from ip6.arpa form
+   * @memberof Address6
+   * @static
+   * @param {string} arpaFormAddress - an 'ip6.arpa' form address
+   * @returns {Adress6}
+   * @example
+   * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)
+   * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'
+   */
+  static fromArpa(arpaFormAddress: string): Address6 {
+    // remove ending ".ip6.arpa." or just "."
+    let address = arpaFormAddress.replace(/(\.ip6\.arpa)?\.$/, '');
+    const semicolonAmount = 7;
+
+    // correct ip6.arpa form with ending removed will be 63 characters
+    if (address.length !== 63) {
+      throw new AddressError("Invalid 'ip6.arpa' form.");
+    }
+
+    const parts = address.split('.').reverse();
+
+    for (let i = semicolonAmount; i > 0; i--) {
+      const insertIndex = i * 4;
+      parts.splice(insertIndex, 0, ':');
+    }
+
+    address = parts.join('');
+
+    return new Address6(address);
+  }
+
+  /**
+   * Return the Microsoft UNC transcription of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String} the Microsoft UNC transcription of the address
+   */
+  microsoftTranscription(): string {
+    return `${this.correctForm().replace(/:/g, '-')}.ipv6-literal.net`;
+  }
+
+  /**
+   * Return the first n bits of the address, defaulting to the subnet mask
+   * @memberof Address6
+   * @instance
+   * @param {number} [mask=subnet] - the number of bits to mask
+   * @returns {String} the first n bits of the address as a string
+   */
+  mask(mask: number = this.subnetMask): string {
+    return this.getBitsBase2(0, mask);
+  }
+
+  /**
+   * Return the number of possible subnets of a given size in the address
+   * @memberof Address6
+   * @instance
+   * @param {number} [subnetSize=128] - the subnet size
+   * @returns {String}
+   */
+  // TODO: probably useful to have a numeric version of this too
+  possibleSubnets(subnetSize: number = 128): string {
+    const availableBits = constants6.BITS - this.subnetMask;
+    const subnetBits = Math.abs(subnetSize - constants6.BITS);
+    const subnetPowers = availableBits - subnetBits;
+
+    if (subnetPowers < 0) {
+      return '0';
+    }
+
+    return addCommas((BigInt('2') ** BigInt(subnetPowers)).toString(10));
+  }
+
+  /**
+   * Helper function getting start address.
+   * @memberof Address6
+   * @instance
+   * @returns {bigint}
+   */
+  _startAddress(): bigint {
+    return BigInt(`0b${this.mask() + '0'.repeat(constants6.BITS - this.subnetMask)}`);
+  }
+
+  /**
+   * The first address in the range given by this address' subnet
+   * Often referred to as the Network Address.
+   * @memberof Address6
+   * @instance
+   * @returns {Address6}
+   */
+  startAddress(): Address6 {
+    return Address6.fromBigInt(this._startAddress());
+  }
+
+  /**
+   * The first host address in the range given by this address's subnet ie
+   * the first address after the Network Address
+   * @memberof Address6
+   * @instance
+   * @returns {Address6}
+   */
+  startAddressExclusive(): Address6 {
+    const adjust = BigInt('1');
+    return Address6.fromBigInt(this._startAddress() + adjust);
+  }
+
+  /**
+   * Helper function getting end address.
+   * @memberof Address6
+   * @instance
+   * @returns {bigint}
+   */
+  _endAddress(): bigint {
+    return BigInt(`0b${this.mask() + '1'.repeat(constants6.BITS - this.subnetMask)}`);
+  }
+
+  /**
+   * The last address in the range given by this address' subnet
+   * Often referred to as the Broadcast
+   * @memberof Address6
+   * @instance
+   * @returns {Address6}
+   */
+  endAddress(): Address6 {
+    return Address6.fromBigInt(this._endAddress());
+  }
+
+  /**
+   * The last host address in the range given by this address's subnet ie
+   * the last address prior to the Broadcast Address
+   * @memberof Address6
+   * @instance
+   * @returns {Address6}
+   */
+  endAddressExclusive(): Address6 {
+    const adjust = BigInt('1');
+    return Address6.fromBigInt(this._endAddress() - adjust);
+  }
+
+  /**
+   * Return the scope of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  getScope(): string {
+    let scope = constants6.SCOPES[parseInt(this.getBits(12, 16).toString(10), 10)];
+
+    if (this.getType() === 'Global unicast' && scope !== 'Link local') {
+      scope = 'Global';
+    }
+
+    return scope || 'Unknown';
+  }
+
+  /**
+   * Return the type of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  getType(): string {
+    for (const subnet of Object.keys(constants6.TYPES)) {
+      if (this.isInSubnet(new Address6(subnet))) {
+        return constants6.TYPES[subnet] as string;
+      }
+    }
+
+    return 'Global unicast';
+  }
+
+  /**
+   * Return the bits in the given range as a BigInt
+   * @memberof Address6
+   * @instance
+   * @returns {bigint}
+   */
+  getBits(start: number, end: number): bigint {
+    return BigInt(`0b${this.getBitsBase2(start, end)}`);
+  }
+
+  /**
+   * Return the bits in the given range as a base-2 string
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  getBitsBase2(start: number, end: number): string {
+    return this.binaryZeroPad().slice(start, end);
+  }
+
+  /**
+   * Return the bits in the given range as a base-16 string
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  getBitsBase16(start: number, end: number): string {
+    const length = end - start;
+
+    if (length % 4 !== 0) {
+      throw new Error('Length of bits to retrieve must be divisible by four');
+    }
+
+    return this.getBits(start, end)
+      .toString(16)
+      .padStart(length / 4, '0');
+  }
+
+  /**
+   * Return the bits that are set past the subnet mask length
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  getBitsPastSubnet(): string {
+    return this.getBitsBase2(this.subnetMask, constants6.BITS);
+  }
+
+  /**
+   * Return the reversed ip6.arpa form of the address
+   * @memberof Address6
+   * @param {Object} options
+   * @param {boolean} options.omitSuffix - omit the "ip6.arpa" suffix
+   * @instance
+   * @returns {String}
+   */
+  reverseForm(options?: common.ReverseFormOptions): string {
+    if (!options) {
+      options = {};
+    }
+
+    const characters = Math.floor(this.subnetMask / 4);
+
+    const reversed = this.canonicalForm()
+      .replace(/:/g, '')
+      .split('')
+      .slice(0, characters)
+      .reverse()
+      .join('.');
+
+    if (characters > 0) {
+      if (options.omitSuffix) {
+        return reversed;
+      }
+
+      return `${reversed}.ip6.arpa.`;
+    }
+
+    if (options.omitSuffix) {
+      return '';
+    }
+
+    return 'ip6.arpa.';
+  }
+
+  /**
+   * Return the correct form of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  correctForm(): string {
+    let i;
+    let groups = [];
+
+    let zeroCounter = 0;
+    const zeroes = [];
+
+    for (i = 0; i < this.parsedAddress.length; i++) {
+      const value = parseInt(this.parsedAddress[i], 16);
+
+      if (value === 0) {
+        zeroCounter++;
+      }
+
+      if (value !== 0 && zeroCounter > 0) {
+        if (zeroCounter > 1) {
+          zeroes.push([i - zeroCounter, i - 1]);
+        }
+
+        zeroCounter = 0;
+      }
+    }
+
+    // Do we end with a string of zeroes?
+    if (zeroCounter > 1) {
+      zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]);
+    }
+
+    const zeroLengths = zeroes.map((n) => n[1] - n[0] + 1);
+
+    if (zeroes.length > 0) {
+      const index = zeroLengths.indexOf(Math.max(...zeroLengths) as number);
+
+      groups = compact(this.parsedAddress, zeroes[index]);
+    } else {
+      groups = this.parsedAddress;
+    }
+
+    for (i = 0; i < groups.length; i++) {
+      if (groups[i] !== 'compact') {
+        groups[i] = parseInt(groups[i], 16).toString(16);
+      }
+    }
+
+    let correct = groups.join(':');
+
+    correct = correct.replace(/^compact$/, '::');
+    correct = correct.replace(/(^compact)|(compact$)/, ':');
+    correct = correct.replace(/compact/, '');
+
+    return correct;
+  }
+
+  /**
+   * Return a zero-padded base-2 string representation of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   * @example
+   * var address = new Address6('2001:4860:4001:803::1011');
+   * address.binaryZeroPad();
+   * // '0010000000000001010010000110000001000000000000010000100000000011
+   * //  0000000000000000000000000000000000000000000000000001000000010001'
+   */
+  binaryZeroPad(): string {
+    return this.bigInt().toString(2).padStart(constants6.BITS, '0');
+  }
+
+  // TODO: Improve the semantics of this helper function
+  parse4in6(address: string): string {
+    const groups = address.split(':');
+    const lastGroup = groups.slice(-1)[0];
+
+    const address4 = lastGroup.match(constants4.RE_ADDRESS);
+
+    if (address4) {
+      this.parsedAddress4 = address4[0];
+      this.address4 = new Address4(this.parsedAddress4);
+
+      for (let i = 0; i < this.address4.groups; i++) {
+        if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) {
+          throw new AddressError(
+            "IPv4 addresses can't have leading zeroes.",
+            address.replace(
+              constants4.RE_ADDRESS,
+              this.address4.parsedAddress.map(spanLeadingZeroes4).join('.'),
+            ),
+          );
+        }
+      }
+
+      this.v4 = true;
+
+      groups[groups.length - 1] = this.address4.toGroup6();
+
+      address = groups.join(':');
+    }
+
+    return address;
+  }
+
+  // TODO: Make private?
+  parse(address: string): string[] {
+    address = this.parse4in6(address);
+
+    const badCharacters = address.match(constants6.RE_BAD_CHARACTERS);
+
+    if (badCharacters) {
+      throw new AddressError(
+        `Bad character${
+          badCharacters.length > 1 ? 's' : ''
+        } detected in address: ${badCharacters.join('')}`,
+        address.replace(constants6.RE_BAD_CHARACTERS, '<span class="parse-error">$1</span>'),
+      );
+    }
+
+    const badAddress = address.match(constants6.RE_BAD_ADDRESS);
+
+    if (badAddress) {
+      throw new AddressError(
+        `Address failed regex: ${badAddress.join('')}`,
+        address.replace(constants6.RE_BAD_ADDRESS, '<span class="parse-error">$1</span>'),
+      );
+    }
+
+    let groups: string[] = [];
+
+    const halves = address.split('::');
+
+    if (halves.length === 2) {
+      let first = halves[0].split(':');
+      let last = halves[1].split(':');
+
+      if (first.length === 1 && first[0] === '') {
+        first = [];
+      }
+
+      if (last.length === 1 && last[0] === '') {
+        last = [];
+      }
+
+      const remaining = this.groups - (first.length + last.length);
+
+      if (!remaining) {
+        throw new AddressError('Error parsing groups');
+      }
+
+      this.elidedGroups = remaining;
+
+      this.elisionBegin = first.length;
+      this.elisionEnd = first.length + this.elidedGroups;
+
+      groups = groups.concat(first);
+
+      for (let i = 0; i < remaining; i++) {
+        groups.push('0');
+      }
+
+      groups = groups.concat(last);
+    } else if (halves.length === 1) {
+      groups = address.split(':');
+
+      this.elidedGroups = 0;
+    } else {
+      throw new AddressError('Too many :: groups found');
+    }
+
+    groups = groups.map((group: string) => parseInt(group, 16).toString(16));
+
+    if (groups.length !== this.groups) {
+      throw new AddressError('Incorrect number of groups found');
+    }
+
+    return groups;
+  }
+
+  /**
+   * Return the canonical form of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  canonicalForm(): string {
+    return this.parsedAddress.map(paddedHex).join(':');
+  }
+
+  /**
+   * Return the decimal form of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  decimal(): string {
+    return this.parsedAddress.map((n) => parseInt(n, 16).toString(10).padStart(5, '0')).join(':');
+  }
+
+  /**
+   * Return the address as a BigInt
+   * @memberof Address6
+   * @instance
+   * @returns {bigint}
+   */
+  bigInt(): bigint {
+    return BigInt(`0x${this.parsedAddress.map(paddedHex).join('')}`);
+  }
+
+  /**
+   * Return the last two groups of this address as an IPv4 address string
+   * @memberof Address6
+   * @instance
+   * @returns {Address4}
+   * @example
+   * var address = new Address6('2001:4860:4001::1825:bf11');
+   * address.to4().correctForm(); // '24.37.191.17'
+   */
+  to4(): Address4 {
+    const binary = this.binaryZeroPad().split('');
+
+    return Address4.fromHex(BigInt(`0b${binary.slice(96, 128).join('')}`).toString(16));
+  }
+
+  /**
+   * Return the v4-in-v6 form of the address
+   * @memberof Address6
+   * @instance
+   * @returns {String}
+   */
+  to4in6(): string {
+    const address4 = this.to4();
+    const address6 = new Address6(this.parsedAddress.slice(0, 6).join(':'), 6);
+
+    const correct = address6.correctForm();
+
+    let infix = '';
+
+    if (!/:$/.test(correct)) {
+      infix = ':';
+    }
+
+    return correct + infix + address4.address;
+  }
+
+  /**
+   * Return an object containing the Teredo properties of the address
+   * @memberof Address6
+   * @instance
+   * @returns {Object}
+   */
+  inspectTeredo(): TeredoProperties {
+    /*
+    - Bits 0 to 31 are set to the Teredo prefix (normally 2001:0000::/32).
+    - Bits 32 to 63 embed the primary IPv4 address of the Teredo server that
+      is used.
+    - Bits 64 to 79 can be used to define some flags. Currently only the
+      higher order bit is used; it is set to 1 if the Teredo client is
+      located behind a cone NAT, 0 otherwise. For Microsoft's Windows Vista
+      and Windows Server 2008 implementations, more bits are used. In those
+      implementations, the format for these 16 bits is "CRAAAAUG AAAAAAAA",
+      where "C" remains the "Cone" flag. The "R" bit is reserved for future
+      use. The "U" bit is for the Universal/Local flag (set to 0). The "G" bit
+      is Individual/Group flag (set to 0). The A bits are set to a 12-bit
+      randomly generated number chosen by the Teredo client to introduce
+      additional protection for the Teredo node against IPv6-based scanning
+      attacks.
+    - Bits 80 to 95 contains the obfuscated UDP port number. This is the
+      port number that is mapped by the NAT to the Teredo client with all
+      bits inverted.
+    - Bits 96 to 127 contains the obfuscated IPv4 address. This is the
+      public IPv4 address of the NAT with all bits inverted.
+    */
+    const prefix = this.getBitsBase16(0, 32);
+
+    const bitsForUdpPort: bigint = this.getBits(80, 96);
+    // eslint-disable-next-line no-bitwise
+    const udpPort = (bitsForUdpPort ^ BigInt('0xffff')).toString();
+
+    const server4 = Address4.fromHex(this.getBitsBase16(32, 64));
+
+    const bitsForClient4 = this.getBits(96, 128);
+    // eslint-disable-next-line no-bitwise
+    const client4 = Address4.fromHex((bitsForClient4 ^ BigInt('0xffffffff')).toString(16));
+
+    const flagsBase2 = this.getBitsBase2(64, 80);
+
+    const coneNat = testBit(flagsBase2, 15);
+    const reserved = testBit(flagsBase2, 14);
+    const groupIndividual = testBit(flagsBase2, 8);
+    const universalLocal = testBit(flagsBase2, 9);
+    const nonce = BigInt(`0b${flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16)}`).toString(10);
+
+    return {
+      prefix: `${prefix.slice(0, 4)}:${prefix.slice(4, 8)}`,
+      server4: server4.address,
+      client4: client4.address,
+      flags: flagsBase2,
+      coneNat,
+      microsoft: {
+        reserved,
+        universalLocal,
+        groupIndividual,
+        nonce,
+      },
+      udpPort,
+    };
+  }
+
+  /**
+   * Return an object containing the 6to4 properties of the address
+   * @memberof Address6
+   * @instance
+   * @returns {Object}
+   */
+  inspect6to4(): SixToFourProperties {
+    /*
+    - Bits 0 to 15 are set to the 6to4 prefix (2002::/16).
+    - Bits 16 to 48 embed the IPv4 address of the 6to4 gateway that is used.
+    */
+
+    const prefix = this.getBitsBase16(0, 16);
+
+    const gateway = Address4.fromHex(this.getBitsBase16(16, 48));
+
+    return {
+      prefix: prefix.slice(0, 4),
+      gateway: gateway.address,
+    };
+  }
+
+  /**
+   * Return a v6 6to4 address from a v6 v4inv6 address
+   * @memberof Address6
+   * @instance
+   * @returns {Address6}
+   */
+  to6to4(): Address6 | null {
+    if (!this.is4()) {
+      return null;
+    }
+
+    const addr6to4 = [
+      '2002',
+      this.getBitsBase16(96, 112),
+      this.getBitsBase16(112, 128),
+      '',
+      '/16',
+    ].join(':');
+
+    return new Address6(addr6to4);
+  }
+
+  /**
+   * Return a byte array
+   * @memberof Address6
+   * @instance
+   * @returns {Array}
+   */
+  toByteArray(): number[] {
+    const valueWithoutPadding = this.bigInt().toString(16);
+    const leadingPad = '0'.repeat(valueWithoutPadding.length % 2);
+
+    const value = `${leadingPad}${valueWithoutPadding}`;
+
+    const bytes = [];
+    for (let i = 0, length = value.length; i < length; i += 2) {
+      bytes.push(parseInt(value.substring(i, i + 2), 16));
+    }
+
+    return bytes;
+  }
+
+  /**
+   * Return an unsigned byte array
+   * @memberof Address6
+   * @instance
+   * @returns {Array}
+   */
+  toUnsignedByteArray(): number[] {
+    return this.toByteArray().map(unsignByte);
+  }
+
+  /**
+   * Convert a byte array to an Address6 object
+   * @memberof Address6
+   * @static
+   * @returns {Address6}
+   */
+  static fromByteArray(bytes: Array<any>): Address6 {
+    return this.fromUnsignedByteArray(bytes.map(unsignByte));
+  }
+
+  /**
+   * Convert an unsigned byte array to an Address6 object
+   * @memberof Address6
+   * @static
+   * @returns {Address6}
+   */
+  static fromUnsignedByteArray(bytes: Array<any>): Address6 {
+    const BYTE_MAX = BigInt('256');
+    let result = BigInt('0');
+    let multiplier = BigInt('1');
+
+    for (let i = bytes.length - 1; i >= 0; i--) {
+      result += multiplier * BigInt(bytes[i].toString(10));
+
+      multiplier *= BYTE_MAX;
+    }
+
+    return Address6.fromBigInt(result);
+  }
+
+  // #region Attributes
+  /**
+   * Returns true if the given address is in the subnet of the current address
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isInSubnet = common.isInSubnet;
+
+  /**
+   * Returns true if the address is correct, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isCorrect = common.isCorrect(constants6.BITS);
+
+  /**
+   * Returns true if the address is in the canonical form, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isCanonical(): boolean {
+    return this.addressMinusSuffix === this.canonicalForm();
+  }
+
+  /**
+   * Returns true if the address is a link local address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isLinkLocal(): boolean {
+    // Zeroes are required, i.e. we can't check isInSubnet with 'fe80::/10'
+    if (
+      this.getBitsBase2(0, 64) ===
+      '1111111010000000000000000000000000000000000000000000000000000000'
+    ) {
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Returns true if the address is a multicast address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isMulticast(): boolean {
+    return this.getType() === 'Multicast';
+  }
+
+  /**
+   * Returns true if the address is a v4-in-v6 address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  is4(): boolean {
+    return this.v4;
+  }
+
+  /**
+   * Returns true if the address is a Teredo address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isTeredo(): boolean {
+    return this.isInSubnet(new Address6('2001::/32'));
+  }
+
+  /**
+   * Returns true if the address is a 6to4 address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  is6to4(): boolean {
+    return this.isInSubnet(new Address6('2002::/16'));
+  }
+
+  /**
+   * Returns true if the address is a loopback address, false otherwise
+   * @memberof Address6
+   * @instance
+   * @returns {boolean}
+   */
+  isLoopback(): boolean {
+    return this.getType() === 'Loopback';
+  }
+  // #endregion
+
+  // #region HTML
+  /**
+   * @returns {String} the address in link form with a default port of 80
+   */
+  href(optionalPort?: number | string): string {
+    if (optionalPort === undefined) {
+      optionalPort = '';
+    } else {
+      optionalPort = `:${optionalPort}`;
+    }
+
+    return `http://[${this.correctForm()}]${optionalPort}/`;
+  }
+
+  /**
+   * @returns {String} a link suitable for conveying the address via a URL hash
+   */
+  link(options?: { className?: string; prefix?: string; v4?: boolean }): string {
+    if (!options) {
+      options = {};
+    }
+
+    if (options.className === undefined) {
+      options.className = '';
+    }
+
+    if (options.prefix === undefined) {
+      options.prefix = '/#address=';
+    }
+
+    if (options.v4 === undefined) {
+      options.v4 = false;
+    }
+
+    let formFunction = this.correctForm;
+
+    if (options.v4) {
+      formFunction = this.to4in6;
+    }
+
+    const form = formFunction.call(this);
+
+    if (options.className) {
+      return `<a href="${options.prefix}${form}" class="${options.className}">${form}</a>`;
+    }
+
+    return `<a href="${options.prefix}${form}">${form}</a>`;
+  }
+
+  /**
+   * Groups an address
+   * @returns {String}
+   */
+  group(): string {
+    if (this.elidedGroups === 0) {
+      // The simple case
+      return helpers.simpleGroup(this.address).join(':');
+    }
+
+    assert(typeof this.elidedGroups === 'number');
+    assert(typeof this.elisionBegin === 'number');
+
+    // The elided case
+    const output = [];
+
+    const [left, right] = this.address.split('::');
+
+    if (left.length) {
+      output.push(...helpers.simpleGroup(left));
+    } else {
+      output.push('');
+    }
+
+    const classes = ['hover-group'];
+
+    for (let i = this.elisionBegin; i < this.elisionBegin + this.elidedGroups; i++) {
+      classes.push(`group-${i}`);
+    }
+
+    output.push(`<span class="${classes.join(' ')}"></span>`);
+
+    if (right.length) {
+      output.push(...helpers.simpleGroup(right, this.elisionEnd));
+    } else {
+      output.push('');
+    }
+
+    if (this.is4()) {
+      assert(this.address4 instanceof Address4);
+
+      output.pop();
+      output.push(this.address4.groupForV6());
+    }
+
+    return output.join(':');
+  }
+  // #endregion
+
+  // #region Regular expressions
+  /**
+   * Generate a regular expression string that can be used to find or validate
+   * all variations of this address
+   * @memberof Address6
+   * @instance
+   * @param {boolean} substringSearch
+   * @returns {string}
+   */
+  regularExpressionString(this: Address6, substringSearch: boolean = false): string {
+    let output: string[] = [];
+
+    // TODO: revisit why this is necessary
+    const address6 = new Address6(this.correctForm());
+
+    if (address6.elidedGroups === 0) {
+      // The simple case
+      output.push(simpleRegularExpression(address6.parsedAddress));
+    } else if (address6.elidedGroups === constants6.GROUPS) {
+      // A completely elided address
+      output.push(possibleElisions(constants6.GROUPS));
+    } else {
+      // A partially elided address
+      const halves = address6.address.split('::');
+
+      if (halves[0].length) {
+        output.push(simpleRegularExpression(halves[0].split(':')));
+      }
+
+      assert(typeof address6.elidedGroups === 'number');
+
+      output.push(
+        possibleElisions(address6.elidedGroups, halves[0].length !== 0, halves[1].length !== 0),
+      );
+
+      if (halves[1].length) {
+        output.push(simpleRegularExpression(halves[1].split(':')));
+      }
+
+      output = [output.join(':')];
+    }
+
+    if (!substringSearch) {
+      output = [
+        '(?=^|',
+        ADDRESS_BOUNDARY,
+        '|[^\\w\\:])(',
+        ...output,
+        ')(?=[^\\w\\:]|',
+        ADDRESS_BOUNDARY,
+        '|$)',
+      ];
+    }
+
+    return output.join('');
+  }
+
+  /**
+   * Generate a regular expression that can be used to find or validate all
+   * variations of this address.
+   * @memberof Address6
+   * @instance
+   * @param {boolean} substringSearch
+   * @returns {RegExp}
+   */
+  regularExpression(this: Address6, substringSearch: boolean = false): RegExp {
+    return new RegExp(this.regularExpressionString(substringSearch), 'i');
+  }
+  // #endregion
+}
Index: node_modules/ip-address/src/v4/constants.ts
===================================================================
--- node_modules/ip-address/src/v4/constants.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/v4/constants.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,7 @@
+export const BITS = 32;
+export const GROUPS = 4;
+
+export const RE_ADDRESS =
+  /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g;
+
+export const RE_SUBNET_STRING = /\/\d{1,2}$/;
Index: node_modules/ip-address/src/v6/constants.ts
===================================================================
--- node_modules/ip-address/src/v6/constants.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/v6/constants.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,79 @@
+export const BITS = 128;
+export const GROUPS = 8;
+
+/**
+ * Represents IPv6 address scopes
+ * @memberof Address6
+ * @static
+ */
+export const SCOPES: { [key: number]: string | undefined } = {
+  0: 'Reserved',
+  1: 'Interface local',
+  2: 'Link local',
+  4: 'Admin local',
+  5: 'Site local',
+  8: 'Organization local',
+  14: 'Global',
+  15: 'Reserved',
+} as const;
+
+/**
+ * Represents IPv6 address types
+ * @memberof Address6
+ * @static
+ */
+export const TYPES: { [key: string]: string | undefined } = {
+  'ff01::1/128': 'Multicast (All nodes on this interface)',
+  'ff01::2/128': 'Multicast (All routers on this interface)',
+  'ff02::1/128': 'Multicast (All nodes on this link)',
+  'ff02::2/128': 'Multicast (All routers on this link)',
+  'ff05::2/128': 'Multicast (All routers in this site)',
+  'ff02::5/128': 'Multicast (OSPFv3 AllSPF routers)',
+  'ff02::6/128': 'Multicast (OSPFv3 AllDR routers)',
+  'ff02::9/128': 'Multicast (RIP routers)',
+  'ff02::a/128': 'Multicast (EIGRP routers)',
+  'ff02::d/128': 'Multicast (PIM routers)',
+  'ff02::16/128': 'Multicast (MLDv2 reports)',
+  'ff01::fb/128': 'Multicast (mDNSv6)',
+  'ff02::fb/128': 'Multicast (mDNSv6)',
+  'ff05::fb/128': 'Multicast (mDNSv6)',
+  'ff02::1:2/128': 'Multicast (All DHCP servers and relay agents on this link)',
+  'ff05::1:2/128': 'Multicast (All DHCP servers and relay agents in this site)',
+  'ff02::1:3/128': 'Multicast (All DHCP servers on this link)',
+  'ff05::1:3/128': 'Multicast (All DHCP servers in this site)',
+  '::/128': 'Unspecified',
+  '::1/128': 'Loopback',
+  'ff00::/8': 'Multicast',
+  'fe80::/10': 'Link-local unicast',
+} as const;
+
+/**
+ * A regular expression that matches bad characters in an IPv6 address
+ * @memberof Address6
+ * @static
+ */
+export const RE_BAD_CHARACTERS = /([^0-9a-f:/%])/gi;
+
+/**
+ * A regular expression that matches an incorrect IPv6 address
+ * @memberof Address6
+ * @static
+ */
+export const RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi;
+
+/**
+ * A regular expression that matches an IPv6 subnet
+ * @memberof Address6
+ * @static
+ */
+export const RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/;
+
+/**
+ * A regular expression that matches an IPv6 zone
+ * @memberof Address6
+ * @static
+ */
+export const RE_ZONE_STRING = /%.*$/;
+
+export const RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/;
+export const RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/;
Index: node_modules/ip-address/src/v6/helpers.ts
===================================================================
--- node_modules/ip-address/src/v6/helpers.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/v6/helpers.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,48 @@
+/**
+ * @returns {String} the string with all zeroes contained in a <span>
+ */
+export function spanAllZeroes(s: string): string {
+  return s.replace(/(0+)/g, '<span class="zero">$1</span>');
+}
+
+/**
+ * @returns {String} the string with each character contained in a <span>
+ */
+export function spanAll(s: string, offset: number = 0): string {
+  const letters = s.split('');
+
+  return letters
+    .map(
+      (n, i) => `<span class="digit value-${n} position-${i + offset}">${spanAllZeroes(n)}</span>`,
+    )
+    .join('');
+}
+
+function spanLeadingZeroesSimple(group: string): string {
+  return group.replace(/^(0+)/, '<span class="zero">$1</span>');
+}
+
+/**
+ * @returns {String} the string with leading zeroes contained in a <span>
+ */
+export function spanLeadingZeroes(address: string): string {
+  const groups = address.split(':');
+
+  return groups.map((g) => spanLeadingZeroesSimple(g)).join(':');
+}
+
+/**
+ * Groups an address
+ * @returns {String} a grouped address
+ */
+export function simpleGroup(addressString: string, offset: number = 0): string[] {
+  const groups = addressString.split(':');
+
+  return groups.map((g, i) => {
+    if (/group-v4/.test(g)) {
+      return g;
+    }
+
+    return `<span class="hover-group group-${i + offset}">${spanLeadingZeroesSimple(g)}</span>`;
+  });
+}
Index: node_modules/ip-address/src/v6/regular-expressions.ts
===================================================================
--- node_modules/ip-address/src/v6/regular-expressions.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/ip-address/src/v6/regular-expressions.ts	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,94 @@
+import * as v6 from './constants';
+
+export function groupPossibilities(possibilities: string[]): string {
+  return `(${possibilities.join('|')})`;
+}
+
+export function padGroup(group: string): string {
+  if (group.length < 4) {
+    return `0{0,${4 - group.length}}${group}`;
+  }
+
+  return group;
+}
+
+export const ADDRESS_BOUNDARY = '[^A-Fa-f0-9:]';
+
+export function simpleRegularExpression(groups: string[]) {
+  const zeroIndexes: number[] = [];
+
+  groups.forEach((group, i) => {
+    const groupInteger = parseInt(group, 16);
+
+    if (groupInteger === 0) {
+      zeroIndexes.push(i);
+    }
+  });
+
+  // You can technically elide a single 0, this creates the regular expressions
+  // to match that eventuality
+  const possibilities = zeroIndexes.map((zeroIndex) =>
+    groups
+      .map((group, i) => {
+        if (i === zeroIndex) {
+          const elision = i === 0 || i === v6.GROUPS - 1 ? ':' : '';
+
+          return groupPossibilities([padGroup(group), elision]);
+        }
+
+        return padGroup(group);
+      })
+      .join(':'),
+  );
+
+  // The simplest case
+  possibilities.push(groups.map(padGroup).join(':'));
+
+  return groupPossibilities(possibilities);
+}
+
+export function possibleElisions(
+  elidedGroups: number,
+  moreLeft?: boolean,
+  moreRight?: boolean,
+): string {
+  const left = moreLeft ? '' : ':';
+  const right = moreRight ? '' : ':';
+
+  const possibilities = [];
+
+  // 1. elision of everything (::)
+  if (!moreLeft && !moreRight) {
+    possibilities.push('::');
+  }
+
+  // 2. complete elision of the middle
+  if (moreLeft && moreRight) {
+    possibilities.push('');
+  }
+
+  if ((moreRight && !moreLeft) || (!moreRight && moreLeft)) {
+    // 3. complete elision of one side
+    possibilities.push(':');
+  }
+
+  // 4. elision from the left side
+  possibilities.push(`${left}(:0{1,4}){1,${elidedGroups - 1}}`);
+
+  // 5. elision from the right side
+  possibilities.push(`(0{1,4}:){1,${elidedGroups - 1}}${right}`);
+
+  // 6. no elision
+  possibilities.push(`(0{1,4}:){${elidedGroups - 1}}0{1,4}`);
+
+  // 7. elision (including sloppy elision) from the middle
+  for (let groups = 1; groups < elidedGroups - 1; groups++) {
+    for (let position = 1; position < elidedGroups - groups; position++) {
+      possibilities.push(
+        `(0{1,4}:){${position}}:(0{1,4}:){${elidedGroups - position - groups - 1}}0{1,4}`,
+      );
+    }
+  }
+
+  return groupPossibilities(possibilities);
+}
